cocoapods-taobao-environment 1.0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/.gitmodules +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +44 -0
- data/Rakefile +2 -0
- data/XCodeScript/CopyFrameworkResources/copy-framework-resources.rb +62 -0
- data/cocoapods-taobao-environment.gemspec +25 -0
- data/lib/cocoapods/taobao/environment.rb +17 -0
- data/lib/cocoapods/taobao/environment/alibaba_source.rb +15 -0
- data/lib/cocoapods/taobao/environment/cocoapods_sync_dependencies.rb +187 -0
- data/lib/cocoapods/taobao/environment/deintegrate_pods_for_framework_0.39.rb +60 -0
- data/lib/cocoapods/taobao/environment/deintegrate_pods_for_framework_1.0.rb +49 -0
- data/lib/cocoapods/taobao/environment/dynamic_dependency_for_ios_7.rb +46 -0
- data/lib/cocoapods/taobao/environment/fix_dependency_conflict.rb +35 -0
- data/lib/cocoapods/taobao/environment/fix_framework_search_path_0.39.rb +22 -0
- data/lib/cocoapods/taobao/environment/fix_framework_search_path_1.0.rb +22 -0
- data/lib/cocoapods/taobao/environment/inhibit_pod_warning.rb +15 -0
- data/lib/cocoapods/taobao/environment/integrate_copy_framework_resouces_script.rb +52 -0
- data/lib/cocoapods/taobao/environment/version.rb +11 -0
- data/lib/cocoapods_plugin.rb +3 -0
- metadata +108 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f1bb1dadb505f13c9ce8a3fc2246b6ed4454b54d
|
4
|
+
data.tar.gz: 44fb048eab17e4989dd2a33595755cc5fd2cb1ad
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d0e26f214f39ef8f91a5e48eb888086631ac959c492fb6c7f23ab56acf35bcbfded63b3fab74cd77d2415f8865e9624a47e6b609f5978a964409fe5a687b7dba
|
7
|
+
data.tar.gz: 0b25f6d731c25804827f886026ecca388feae01d5adefe6f9cc543861d291735c901fe5a0c747251d26134e616f88c52c999cfb4593479de45f522e24635356f
|
data/.gitignore
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
23
|
+
vendor
|
24
|
+
.idea
|
data/.gitmodules
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2016 梅忘
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Cocoapods::Taobao::Environment
|
2
|
+
|
3
|
+
手机淘宝 iOS 统一开发环境
|
4
|
+
|
5
|
+
使用 CocoaPods 0.39.0 版本作为基础依赖管理工具,进行一定的 Patch,并根据手淘特殊的开发环境,做了适配。仅供内部使用。
|
6
|
+
|
7
|
+
目前提供以下功能:
|
8
|
+
1. 统一 CocoaPods 版本为 0.39.0
|
9
|
+
- 自动使用 alipods 和 mirror 作为 spec 源
|
10
|
+
- 支持 iOS7 使用动态链接库
|
11
|
+
- 修复源码依赖时的版本依赖冲突
|
12
|
+
- 默认启用 inhibit_all_warnings!
|
13
|
+
- 增加 Framework 头文件搜索路径从 Framework/Headers 起始
|
14
|
+
- 添加在线下载集成区依赖环境脚本
|
15
|
+
|
16
|
+
## Installation
|
17
|
+
|
18
|
+
该项目不再提供独立安装方式,已集成到 TaobaoEnv 项目中,如需使用,请访问 http://gitlab.alibaba-inc.com/wireless/package-taobao-environment
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
1. 去除 Podfile 里面相关脚本,包括 Header Search Path 修复脚本
|
23
|
+
- 去除 source 字段
|
24
|
+
- 去除 `inhibit_all_warnings!` 设置
|
25
|
+
- 去除集成区依赖,使用以下函数代替:
|
26
|
+
```
|
27
|
+
cocoapods_sync_dependencies(:branch=>"集成区分支名", :exclude=>"需要排除的依赖,例如当前项目")
|
28
|
+
```
|
29
|
+
|
30
|
+
|
31
|
+
例子:
|
32
|
+
|
33
|
+
```
|
34
|
+
target 'TBMainClient' do
|
35
|
+
platform :ios, '7.0'
|
36
|
+
pod 'WeAppSDK', :path=>"../ios_weapp_sdk"
|
37
|
+
cocoapods_sync_dependencies(:branch=>"dev_20160318", :exclude=>"TBShop")
|
38
|
+
end
|
39
|
+
```
|
40
|
+
|
41
|
+
该 Podfile 将会从集成区下载所有依赖,除了`WeAppSDK`和`TBShop`!!
|
42
|
+
|
43
|
+
该例子中不仅使用`exclude`排除了 TBShop 项目,同时在前面也指明了 WeAppSDK 的本地版本,因此同步依赖的时候会自动排除这两个依赖,不使用线上版本,而使用本地指明的版本。
|
44
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require 'Xcodeproj'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
Encoding.default_external = Encoding::UTF_8
|
8
|
+
Encoding.default_internal = Encoding::UTF_8
|
9
|
+
|
10
|
+
current_target_name = ENV["TARGET_NAME"]
|
11
|
+
project = Xcodeproj::Project.open(ENV["PROJECT_FILE_PATH"])
|
12
|
+
|
13
|
+
# 分析环境变量参数
|
14
|
+
def parse_args(args)
|
15
|
+
index = 0
|
16
|
+
arg_list = []
|
17
|
+
while args && args.length > 0 && args.length > index
|
18
|
+
space_index = args.index(" ", index)
|
19
|
+
space_index = -1 if space_index.nil?
|
20
|
+
arg = args[0..space_index]
|
21
|
+
if arg.count("\"") % 2 == 0 && arg.count("'") % 2 == 0
|
22
|
+
arg_list << arg.strip
|
23
|
+
args = space_index >= 0 ? args[space_index+1..-1] : nil
|
24
|
+
index = 0
|
25
|
+
end
|
26
|
+
end
|
27
|
+
arg_list
|
28
|
+
end
|
29
|
+
|
30
|
+
def find_key(array, key)
|
31
|
+
for dic in array
|
32
|
+
if dic.keys[0] == key
|
33
|
+
return dic[key]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
current_target = project.targets.find { |target| target.name == current_target_name }
|
39
|
+
|
40
|
+
frameworks = current_target.frameworks_build_phases.files.map{|file| file.file_ref.nil? ? "" : File.basename(file.file_ref.path) }.select { |x| File.extname(x) == ".framework"}
|
41
|
+
|
42
|
+
FRAMEWORK_SEARCH_PATHS = []
|
43
|
+
parse_args(ENV['FRAMEWORK_SEARCH_PATHS']).each { |arg| FRAMEWORK_SEARCH_PATHS << arg.gsub("\"", "") }
|
44
|
+
|
45
|
+
for framework in frameworks
|
46
|
+
FRAMEWORK_SEARCH_PATHS.each do |path|
|
47
|
+
framework_path = File.join(path, framework)
|
48
|
+
if File.directory?(framework_path)
|
49
|
+
ignore_list = ["Info.plist", ".DS_Store"]
|
50
|
+
if File.directory?(File.join(framework_path, "Resources"))
|
51
|
+
list = Dir.glob(File.join(framework_path, "Resources/*"))
|
52
|
+
else
|
53
|
+
ignore_list += [File.basename(framework, '.framework'), "Headers", "PrivateHeaders", "Modules", "Versions", "_CodeSignature"]
|
54
|
+
list = Dir.glob(File.join(framework_path, "*"))
|
55
|
+
end
|
56
|
+
list.reject!{|entry| ignore_list.include?(File.basename(entry)) }
|
57
|
+
list.each { |file| puts file}
|
58
|
+
FileUtils.cp_r list, File.join(ENV["TARGET_BUILD_DIR"], ENV["UNLOCALIZED_RESOURCES_FOLDER_PATH"])
|
59
|
+
break
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'cocoapods/taobao/environment/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "cocoapods-taobao-environment"
|
8
|
+
spec.version = Cocoapods::Taobao::Environment::VERSION
|
9
|
+
spec.authors = ["梅忘"]
|
10
|
+
spec.email = ["chijing.zcj@alibaba-inc.com"]
|
11
|
+
spec.summary = %q{淘宝 CocoaPods Hook.}
|
12
|
+
spec.description = %q{根据 CocoaPods 0.39.0 做一定的 hook.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0") << "XCodeScript/CopyFrameworkResources/copy-framework-resources.rb"
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
|
24
|
+
spec.add_dependency 'cocoapods', '>= 0.39.0'
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "cocoapods/taobao/environment/version"
|
2
|
+
|
3
|
+
if PodVersion(">= 0.39")
|
4
|
+
require "cocoapods/taobao/environment/alibaba_source.rb"
|
5
|
+
require "cocoapods/taobao/environment/integrate_copy_framework_resouces_script.rb"
|
6
|
+
require "cocoapods/taobao/environment/cocoapods_sync_dependencies.rb"
|
7
|
+
require "cocoapods/taobao/environment/inhibit_pod_warning.rb"
|
8
|
+
require "cocoapods/taobao/environment/dynamic_dependency_for_ios_7.rb"
|
9
|
+
require "cocoapods/taobao/environment/fix_dependency_conflict.rb"
|
10
|
+
if PodVersion("~> 1.0")
|
11
|
+
require "cocoapods/taobao/environment/fix_framework_search_path_1.0.rb"
|
12
|
+
require "cocoapods/taobao/environment/deintegrate_pods_for_framework_1.0.rb"
|
13
|
+
else
|
14
|
+
require "cocoapods/taobao/environment/fix_framework_search_path_0.39.rb"
|
15
|
+
require "cocoapods/taobao/environment/deintegrate_pods_for_framework_0.39.rb"
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
module AlibabaSource
|
3
|
+
def initialize(defined_in_file = nil, internal_hash = {}, &block)
|
4
|
+
super
|
5
|
+
ENV["COCOAPODS_DISABLE_STATS"] = "1"
|
6
|
+
source 'git@gitlab.alibaba-inc.com:alipods/specs.git'
|
7
|
+
source 'git@gitlab.alibaba-inc.com:alipods/specs-mirror.git'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Pod
|
12
|
+
class Podfile
|
13
|
+
prepend AlibabaSource
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,187 @@
|
|
1
|
+
# 同步taobao4iphone的podfile
|
2
|
+
|
3
|
+
$config = {}
|
4
|
+
|
5
|
+
module Pod
|
6
|
+
class Podfile
|
7
|
+
class TargetDefinition
|
8
|
+
def pods
|
9
|
+
if PodVersion('~> 0.39')
|
10
|
+
get_hash_value('dependencies', [])
|
11
|
+
else
|
12
|
+
if exclusive?
|
13
|
+
pod_dependencies
|
14
|
+
else
|
15
|
+
pod_dependencies + parent.pods
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# dependency
|
24
|
+
def solve_podfile(file_path)
|
25
|
+
json = {"dependencies"=>{}}
|
26
|
+
target_definitions = Pod::Podfile.from_ruby(Pathname.new(file_path), nil).target_definitions
|
27
|
+
target_definition = nil
|
28
|
+
if target_definitions.count == 1
|
29
|
+
target_definition = target_definitions.values.first
|
30
|
+
elsif target_definitions.include?($config[:targetName])
|
31
|
+
target_definition = target_definitions[$config[:targetName]]
|
32
|
+
else
|
33
|
+
raise StandardError, "#{$config[:projectId].gsub("%2E", ".")} 的 #{$config[:fileName]} 不包含名为 #{$config[:targetName]} 的 Target!"
|
34
|
+
end
|
35
|
+
target_definition.dependencies.each do |dependency|
|
36
|
+
json["dependencies"][dependency.name] = dependency.requirement.to_s
|
37
|
+
end
|
38
|
+
json["configurations"] = target_definition.__send__(:configuration_pod_whitelist)
|
39
|
+
json
|
40
|
+
end
|
41
|
+
|
42
|
+
def solve_dependency(file_path)
|
43
|
+
return unless File.exists?(file_path)
|
44
|
+
|
45
|
+
if $config[:fileName].include?("json")
|
46
|
+
body = File.open(file_path, 'r:utf-8', &:read)
|
47
|
+
{"dependencies" => JSON.parse(body)["dependencies"] }
|
48
|
+
elsif $config[:fileName].include?("Podfile")
|
49
|
+
solve_podfile(file_path)
|
50
|
+
elsif $config[:fileName].include?("podspec")
|
51
|
+
raise StandardError, "podspec格式暂不支持"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def download_dependencies(file_path)
|
56
|
+
if cache_valid?(file_path)
|
57
|
+
Pod::UI.info "使用本地缓存依赖: #{relative_path(file_path)}"
|
58
|
+
return
|
59
|
+
end
|
60
|
+
|
61
|
+
if $config[:token].blank?
|
62
|
+
setup_git_private_token
|
63
|
+
raise StandardError, "本地缓存不存在,且未设置 Gitlab Private Token,无法获取在线依赖!\n请将本地缓存文件 #{relative_path(file_path)} 加入 Git 并 Push !"
|
64
|
+
end
|
65
|
+
|
66
|
+
require 'net/http'
|
67
|
+
require 'open-uri'
|
68
|
+
url = "#{$config[:gitlab]}/api/v3/projects/#{$config[:projectId]}/repository/blobs/#{$config[:branch]}?filepath=#{$config[:fileName]}&private_token=#{$config[:token]}"
|
69
|
+
Pod::UI.message "正在下载主工程最新依赖..."
|
70
|
+
url = URI.parse(url)
|
71
|
+
req = Net::HTTP::Get.new(url.to_s)
|
72
|
+
res = Net::HTTP.start(url.host, url.port) { |http|
|
73
|
+
http.request(req)
|
74
|
+
}
|
75
|
+
save_cache(res.body.force_encoding("UTF-8"), file_path)
|
76
|
+
end
|
77
|
+
|
78
|
+
# cache
|
79
|
+
def relative_path(path)
|
80
|
+
Pathname.new(path).relative_path_from(Pathname.new($config[:projectPath])).to_s
|
81
|
+
end
|
82
|
+
|
83
|
+
def cache_path
|
84
|
+
string = "#{$config[:gitlab]}/#{$config[:projectId]}"
|
85
|
+
md5 = Digest::MD5.hexdigest(string)
|
86
|
+
"#{$config[:projectPath]}/#{$config[:dependencyDir]}/#{md5}/#{$config[:fileName]}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def save_cache(data, file_path)
|
90
|
+
require 'fileutils'
|
91
|
+
FileUtils.rm_rf(File.dirname(file_path))
|
92
|
+
FileUtils::mkdir_p(File.dirname(file_path))
|
93
|
+
Pod::UI.info "缓存路径-> #{relative_path(file_path)}"
|
94
|
+
File.open(file_path,"w") do |f|
|
95
|
+
f.write(data)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def cache_valid?(file_path)
|
100
|
+
use_cache = File.exists?(file_path)
|
101
|
+
if use_cache
|
102
|
+
if ARGV.include?("update")
|
103
|
+
if $config[:token].blank?
|
104
|
+
Pod::UI.notice "如果需要同步最新依赖请设置您的Private Token"
|
105
|
+
setup_git_private_token
|
106
|
+
else
|
107
|
+
use_cache = false
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
use_cache
|
112
|
+
end
|
113
|
+
|
114
|
+
def setup_git_private_token()
|
115
|
+
Pod::UI.notice "前往 http://gitlab.alibaba-inc.com/profile/account 查看您的 Private Token"
|
116
|
+
Pod::UI.notice "编辑 ~/.#{File.basename(ENV["SHELL"])}rc 和 ~/.#{File.basename(ENV["SHELL"])}_profile 添加您的 Private Token:"
|
117
|
+
Pod::UI.notice "\texport ALIBABA_GITLAB_PRIVATE_TOKEN=Private Token"
|
118
|
+
end
|
119
|
+
|
120
|
+
# config
|
121
|
+
def init_config
|
122
|
+
$config = {
|
123
|
+
:gitlab => "http://gitlab.alibaba-inc.com",
|
124
|
+
:projectId => "wireless/taobao4iphone",
|
125
|
+
:targetName => "Taobao4iPhone",
|
126
|
+
:fileName => "Podfile",
|
127
|
+
:branch => "master",
|
128
|
+
:dependencyDir => "PodMainDependencies",
|
129
|
+
:configFileName => "config.json",
|
130
|
+
:projectPath => Dir.pwd,
|
131
|
+
:exclude => nil,
|
132
|
+
:configurations => ["Debug", "Release"],
|
133
|
+
:token => ENV["ALIBABA_GITLAB_PRIVATE_TOKEN"]
|
134
|
+
}
|
135
|
+
end
|
136
|
+
|
137
|
+
def load_config_file
|
138
|
+
file_path = "#{$config[:projectPath]}/#{$config[:dependencyDir]}/#{$config[:configFileName]}"
|
139
|
+
if File.exists?(file_path)
|
140
|
+
file = File.open(file_path, 'r:utf-8', &:read)
|
141
|
+
config = JSON.parse(file)[current_target_definition.name]
|
142
|
+
config = Hash[config.map{ |k, v| [k.to_sym, v] }]
|
143
|
+
$config.merge!(config)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def prepare_config(config)
|
148
|
+
init_config
|
149
|
+
load_config_file
|
150
|
+
$config.merge!(config)
|
151
|
+
end
|
152
|
+
|
153
|
+
# public method
|
154
|
+
def cocoapods_sync_dependencies(config)
|
155
|
+
prepare_config(config)
|
156
|
+
Pod::UI.titled_section("正在同步主工程 #{$config[:projectId]} 依赖") do
|
157
|
+
$config[:projectId] = CGI.escape($config[:projectId]).gsub(".", "%2E")
|
158
|
+
$config[:branch] = CGI.escape($config[:branch]).gsub(".", "%2E")
|
159
|
+
|
160
|
+
download_dependencies(cache_path)
|
161
|
+
json = solve_dependency(cache_path)
|
162
|
+
|
163
|
+
exclude = $config[:exclude]
|
164
|
+
if PodVersion('~> 0.39')
|
165
|
+
excludes = current_target_definition.pods.collect { |pod| pod.class == String ? pod : pod.keys[0]}
|
166
|
+
else
|
167
|
+
excludes = current_target_definition.pods.map {|pod| pod.name }
|
168
|
+
end
|
169
|
+
excludes += exclude if exclude.class == Array
|
170
|
+
excludes << exclude if exclude.class == String
|
171
|
+
excludes.each {|exc| json["dependencies"].delete(exc)}
|
172
|
+
|
173
|
+
json["dependencies"].to_a.each do |key, value|
|
174
|
+
pod(key, value)
|
175
|
+
end
|
176
|
+
|
177
|
+
configurations = []
|
178
|
+
configurations << $config[:configurations] if $config[:configurations].class == String
|
179
|
+
configurations += $config[:configurations] if $config[:configurations].class == Array
|
180
|
+
json["configurations"].to_a.each do |config, pods|
|
181
|
+
next if configurations.count > 0 && !configurations.include?(config)
|
182
|
+
pods.each do |name|
|
183
|
+
current_target_definition.whitelist_pod_for_configuration(name, config)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
|
2
|
+
module Pod
|
3
|
+
class Installer
|
4
|
+
class UserProjectIntegrator
|
5
|
+
class TargetIntegrator
|
6
|
+
alias_method :old_update_to_cocoapods_0_39, :update_to_cocoapods_0_39
|
7
|
+
def update_to_cocoapods_0_39
|
8
|
+
requires_update = old_update_to_cocoapods_0_39
|
9
|
+
framework_targets = native_targets.select do |target|
|
10
|
+
!EMBED_FRAMEWORK_TARGET_TYPES.include?(target.symbol_type)
|
11
|
+
end
|
12
|
+
framework_targets.each do |native_target|
|
13
|
+
requires_update = remove_pods_library_from_target(native_target) || requires_update
|
14
|
+
requires_update = remove_copy_resources_script_phase_from_target(native_target) || requires_update
|
15
|
+
end
|
16
|
+
requires_update
|
17
|
+
end
|
18
|
+
|
19
|
+
def remove_pods_library_from_target(native_target)
|
20
|
+
frameworks = user_project.frameworks_group
|
21
|
+
build_phase = native_target.frameworks_build_phase
|
22
|
+
new_product_ref = frameworks.files.find { |f| f.path == target.product_name }
|
23
|
+
if new_product_ref.present?
|
24
|
+
UI.message("Removing Pod product reference #{target.product_name} from project.")
|
25
|
+
build_phase.remove_file_reference(new_product_ref)
|
26
|
+
frameworks.remove_reference(new_product_ref)
|
27
|
+
return true
|
28
|
+
end
|
29
|
+
false
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove_copy_resources_script_phase_from_target(native_target)
|
33
|
+
phase_name = 'Copy Pods Resources'
|
34
|
+
resource_build_phase = native_target.shell_script_build_phases.find { |bp| bp.name == phase_name }
|
35
|
+
return false unless resource_build_phase.present?
|
36
|
+
native_target.build_phases.delete(resource_build_phase)
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
40
|
+
alias_method :old_native_targets_to_integrate, :native_targets_to_integrate
|
41
|
+
def native_targets_to_integrate
|
42
|
+
unless @native_targets_to_integrate
|
43
|
+
old_native_targets_to_integrate
|
44
|
+
unless @native_targets_to_integrate.nil?
|
45
|
+
targets = native_targets.select do |native_target|
|
46
|
+
native_target.shell_script_build_phases.find { |bp| bp.name == "Copy Framework Resources" }.nil?
|
47
|
+
end
|
48
|
+
@native_targets_to_integrate += targets if targets.present?
|
49
|
+
@native_targets_to_integrate.uniq!
|
50
|
+
@native_targets_to_integrate = @native_targets_to_integrate.select do |target|
|
51
|
+
EMBED_FRAMEWORK_TARGET_TYPES.include?(target.symbol_type)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
@native_targets_to_integrate
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
module Pod
|
3
|
+
class Installer
|
4
|
+
class UserProjectIntegrator
|
5
|
+
class TargetIntegrator
|
6
|
+
alias_method :old_integrate!, :integrate!
|
7
|
+
def integrate!
|
8
|
+
old_integrate!
|
9
|
+
framework_targets = native_targets.select do |target|
|
10
|
+
!EMBED_FRAMEWORK_TARGET_TYPES.include?(target.symbol_type)
|
11
|
+
end
|
12
|
+
framework_targets.each do |native_target|
|
13
|
+
remove_pods_library_from_target(native_target)
|
14
|
+
remove_copy_resources_script_phase_from_target(native_target)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def remove_pods_library_from_target(native_target)
|
19
|
+
frameworks = user_project.frameworks_group
|
20
|
+
build_phase = native_target.frameworks_build_phase
|
21
|
+
new_product_ref = frameworks.files.find { |f| f.path == target.product_name }
|
22
|
+
if new_product_ref.present?
|
23
|
+
UI.message("Removing Pod product reference #{target.product_name} from project.")
|
24
|
+
build_phase.remove_file_reference(new_product_ref)
|
25
|
+
frameworks.remove_reference(new_product_ref)
|
26
|
+
return true
|
27
|
+
end
|
28
|
+
false
|
29
|
+
end
|
30
|
+
|
31
|
+
def remove_copy_resources_script_phase_from_target(native_target)
|
32
|
+
phase_name = BUILD_PHASE_PREFIX + COPY_PODS_RESOURCES_PHASE_NAME
|
33
|
+
resource_build_phase = native_target.shell_script_build_phases.find { |bp| bp.name == phase_name }
|
34
|
+
return false unless resource_build_phase.present?
|
35
|
+
native_target.build_phases.delete(resource_build_phase)
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
alias_method :old_create_or_update_build_phase, :create_or_update_build_phase
|
40
|
+
def create_or_update_build_phase(target, phase_name, phase_class = Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
|
41
|
+
if !EMBED_FRAMEWORK_TARGET_TYPES.include?(target.symbol_type) and phase_name == COPY_PODS_RESOURCES_PHASE_NAME
|
42
|
+
return target.project.new(phase_class)
|
43
|
+
end
|
44
|
+
old_create_or_update_build_phase(target, phase_name, phase_class)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Pod
|
2
|
+
module Generator
|
3
|
+
module XCConfig
|
4
|
+
module XCConfigHelper
|
5
|
+
class << XCConfigHelper
|
6
|
+
alias_method :old, :add_dynamic_dependency_build_settings
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.add_dynamic_dependency_build_settings(target, xcconfig)
|
10
|
+
# 如果目标平台是7.0,则不添加 -framewok xxx 到 xcconfig
|
11
|
+
if target.platform.supports_dynamic_frameworks?
|
12
|
+
old(target, xcconfig)
|
13
|
+
else
|
14
|
+
target.file_accessors.each do |file_accessor|
|
15
|
+
if file_accessor.vendored_dynamic_frameworks.count >0
|
16
|
+
# 输出到日志里,方便查看
|
17
|
+
puts "-framework #{target.name} is excluded from OTHER_LDFLAGS"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module Pod
|
29
|
+
class PodTarget < Target
|
30
|
+
alias_method :old_uses_swift?, :uses_swift?
|
31
|
+
def uses_swift?
|
32
|
+
return true if old_uses_swift?
|
33
|
+
# 包含 -Swift.h 的 framework 也需要使用 swift runtime
|
34
|
+
file_accessors.any? do |file_accessor|
|
35
|
+
file_accessor.vendored_dynamic_frameworks.any? { |sf| Dir[sf+"Headers/*"].any? {|h| h.end_with?("-Swift.h")} }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Installer
|
41
|
+
alias_method :old_verify_framework_usage, :verify_framework_usage
|
42
|
+
def verify_framework_usage
|
43
|
+
# 强制跳过验证
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Pod
|
2
|
+
class Installer
|
3
|
+
class Analyzer
|
4
|
+
alias_method :old_verify_no_pods_with_different_sources!, :verify_no_pods_with_different_sources!
|
5
|
+
def verify_no_pods_with_different_sources!
|
6
|
+
deps_with_different_sources = podfile.dependencies.group_by(&:root_name).
|
7
|
+
select { |_root_name, dependencies| dependencies.map(&:external_source).select{|source|!source.nil?}.uniq.count > 1 }
|
8
|
+
deps_with_different_sources.each do |root_name, dependencies|
|
9
|
+
raise Informative, 'There are multiple dependencies with different ' \
|
10
|
+
"sources for `#{root_name}` in #{UI.path podfile.defined_in_file}:" \
|
11
|
+
"\n\n- #{dependencies.map(&:to_s).join("\n- ")}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
alias_method :old_resolve_dependencies, :resolve_dependencies
|
16
|
+
def resolve_dependencies
|
17
|
+
duplicate_dependencies = podfile.dependencies.group_by(&:name).
|
18
|
+
select { |_name, dependencies| dependencies.select {|dp|!dp.requirement.none?}.count > 1 }
|
19
|
+
duplicate_dependencies.each do |name, dependencies|
|
20
|
+
UI.warn "There are duplicate dependencies on `#{name}` in #{UI.path podfile.defined_in_file}:\n\n" \
|
21
|
+
"- #{dependencies.map(&:to_s).join("\n- ")}"
|
22
|
+
end
|
23
|
+
|
24
|
+
specs_by_target = nil
|
25
|
+
UI.section "Resolving dependencies of #{UI.path(podfile.defined_in_file) || 'Podfile'}" do
|
26
|
+
resolver = Resolver.new(sandbox, podfile, locked_dependencies, sources)
|
27
|
+
specs_by_target = resolver.resolve
|
28
|
+
specs_by_target.values.flatten(1).each(&:validate_cocoapods_version)
|
29
|
+
end
|
30
|
+
specs_by_target
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Pod
|
2
|
+
module Generator
|
3
|
+
module XCConfig
|
4
|
+
# Generates the xcconfigs for the aggregate targets.
|
5
|
+
#
|
6
|
+
class AggregateXCConfig
|
7
|
+
alias_method :old_generate_settings_to_import_pod_targets, :generate_settings_to_import_pod_targets
|
8
|
+
|
9
|
+
def generate_settings_to_import_pod_targets
|
10
|
+
old_generate_settings_to_import_pod_targets
|
11
|
+
header_search_paths = pod_targets.map {|t| t.file_accessors.map {|f| f.vendored_frameworks }}.flatten.uniq
|
12
|
+
header_search_paths = header_search_paths.map{|fmk| File.join("$(PODS_ROOT)", fmk.relative_path_from(target.sandbox.root), "/Headers") }
|
13
|
+
build_settings = {
|
14
|
+
# by `#import "…"`
|
15
|
+
'HEADER_SEARCH_PATHS' => XCConfigHelper.quote(header_search_paths),
|
16
|
+
}
|
17
|
+
@xcconfig.merge!(build_settings)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Pod
|
2
|
+
module Generator
|
3
|
+
module XCConfig
|
4
|
+
# Generates the xcconfigs for the aggregate targets.
|
5
|
+
#
|
6
|
+
class AggregateXCConfig
|
7
|
+
alias_method :old_settings_to_import_pod_targets, :settings_to_import_pod_targets
|
8
|
+
|
9
|
+
def settings_to_import_pod_targets
|
10
|
+
settings = old_settings_to_import_pod_targets
|
11
|
+
header_search_paths = pod_targets.map {|t| t.file_accessors.map {|f| f.vendored_frameworks }}.flatten.uniq
|
12
|
+
header_search_paths = header_search_paths.map{|fmk| File.join("$(PODS_ROOT)", fmk.relative_path_from(target.sandbox.root), "/Headers") }
|
13
|
+
build_settings = {
|
14
|
+
# by `#import "…"`
|
15
|
+
'HEADER_SEARCH_PATHS' => XCConfigHelper.quote(header_search_paths),
|
16
|
+
}
|
17
|
+
settings.merge!(build_settings)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Pod
|
2
|
+
class AggregateTarget < Target
|
3
|
+
# @return [Pathname] The absolute path of the copy framewrok resources script.
|
4
|
+
#
|
5
|
+
def copy_framework_resources_script_path
|
6
|
+
support_files_dir + "copy-framework-resources.rb"
|
7
|
+
end
|
8
|
+
|
9
|
+
# @return [String] The path of the copy framework resources script relative to the
|
10
|
+
# root of the user project.
|
11
|
+
#
|
12
|
+
def copy_framework_resources_script_relative_path
|
13
|
+
"${SRCROOT}/#{relative_to_srcroot(copy_framework_resources_script_path)}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module Pod
|
19
|
+
class Installer
|
20
|
+
class AggregateTargetInstaller < TargetInstaller
|
21
|
+
alias_method :old_create_copy_resources_script, :create_copy_resources_script
|
22
|
+
def create_copy_resources_script
|
23
|
+
old_create_copy_resources_script
|
24
|
+
path = target.copy_framework_resources_script_path
|
25
|
+
script_path = File.expand_path('../../../../../XCodeScript/CopyFrameworkResources/copy-framework-resources.rb', __FILE__)
|
26
|
+
FileUtils.cp(script_path, path)
|
27
|
+
add_file_to_support_group(path)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
module Pod
|
34
|
+
class Installer
|
35
|
+
class UserProjectIntegrator
|
36
|
+
class TargetIntegrator
|
37
|
+
alias_method :old_add_copy_resources_script_phase, :add_copy_resources_script_phase
|
38
|
+
def add_copy_resources_script_phase
|
39
|
+
old_add_copy_resources_script_phase
|
40
|
+
phase_name = 'Copy Framework Resources'
|
41
|
+
targets = PodVersion("~>1.0") ? native_targets : native_targets_to_integrate
|
42
|
+
targets = targets.select { |t| EMBED_FRAMEWORK_TARGET_TYPES.include?(t.symbol_type) }
|
43
|
+
targets.each do |native_target|
|
44
|
+
phase = create_or_update_build_phase(native_target, phase_name)
|
45
|
+
script_path = target.copy_framework_resources_script_relative_path
|
46
|
+
phase.shell_script = %(bash -l -c "ruby \\"#{script_path}\\"")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cocoapods-taobao-environment
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- 梅忘
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: cocoapods
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.39.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.39.0
|
55
|
+
description: 根据 CocoaPods 0.39.0 做一定的 hook.
|
56
|
+
email:
|
57
|
+
- chijing.zcj@alibaba-inc.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".gitmodules"
|
64
|
+
- Gemfile
|
65
|
+
- LICENSE.txt
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- XCodeScript/CopyFrameworkResources/copy-framework-resources.rb
|
69
|
+
- cocoapods-taobao-environment.gemspec
|
70
|
+
- lib/cocoapods/taobao/environment.rb
|
71
|
+
- lib/cocoapods/taobao/environment/alibaba_source.rb
|
72
|
+
- lib/cocoapods/taobao/environment/cocoapods_sync_dependencies.rb
|
73
|
+
- lib/cocoapods/taobao/environment/deintegrate_pods_for_framework_0.39.rb
|
74
|
+
- lib/cocoapods/taobao/environment/deintegrate_pods_for_framework_1.0.rb
|
75
|
+
- lib/cocoapods/taobao/environment/dynamic_dependency_for_ios_7.rb
|
76
|
+
- lib/cocoapods/taobao/environment/fix_dependency_conflict.rb
|
77
|
+
- lib/cocoapods/taobao/environment/fix_framework_search_path_0.39.rb
|
78
|
+
- lib/cocoapods/taobao/environment/fix_framework_search_path_1.0.rb
|
79
|
+
- lib/cocoapods/taobao/environment/inhibit_pod_warning.rb
|
80
|
+
- lib/cocoapods/taobao/environment/integrate_copy_framework_resouces_script.rb
|
81
|
+
- lib/cocoapods/taobao/environment/version.rb
|
82
|
+
- lib/cocoapods_plugin.rb
|
83
|
+
homepage: ''
|
84
|
+
licenses:
|
85
|
+
- MIT
|
86
|
+
metadata: {}
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 2.6.4
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
106
|
+
summary: 淘宝 CocoaPods Hook.
|
107
|
+
test_files: []
|
108
|
+
has_rdoc:
|