cocoapods-tdfire-binary 0.1.10 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e3fbfbd4f0231fca2f46f6bc95053c1ae0a3eed
4
- data.tar.gz: b41935b3736913c805656aa70b26c06ae3003294
3
+ metadata.gz: 94e8dc020c5e66365a856c284dcdd3c7b1a00898
4
+ data.tar.gz: 9e8eddca9a7c4c3697a5b4cce1256f329d1656fe
5
5
  SHA512:
6
- metadata.gz: d13eccc90c8fe444f2c34656ba967d97b79a07d5acff8f0a3fcbcfb9add7e15807c54aa133dcc7d22ce09618ce8242300d268425c2633eebc6be0dd6e39b9d61
7
- data.tar.gz: 98fa67145ff31b06c6a53b556f319a7be0a72ada17c7b496dc51986e2dc1c58fcfad8f63ef9910603883fa0e1c653f74d354996a3527dc4078f4ff62875d123b
6
+ metadata.gz: 51f6ec7edc094cf223b6569ccd75b8da5b4a01e2f7c459a3eebc43923d477cc3cc503776a78b1bb7b4d3f8e83c5ac2b1d3efbf7df95e1738dfc235544071fe1c
7
+ data.tar.gz: cbcffa261842a595262f2881eb8ae4e4ff446d05f76c88e3702a5c0277d1fe09b84d63b04e8893413dcc8477cfd011158eb3825abbe8f63ebf2099918f5de138
data/Gemfile.lock CHANGED
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cocoapods-tdfire-binary (0.1.10)
4
+ cocoapods-tdfire-binary (1.0.0)
5
5
  cocoapods (~> 1.4)
6
+ cocoapods-packager (~> 1.5.0)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
@@ -41,6 +42,8 @@ GEM
41
42
  nap (~> 1.0)
42
43
  cocoapods-deintegrate (1.0.2)
43
44
  cocoapods-downloader (1.1.3)
45
+ cocoapods-packager (1.5.0)
46
+ cocoapods (>= 1.1.1, < 2.0)
44
47
  cocoapods-plugins (1.0.0)
45
48
  nap
46
49
  cocoapods-search (1.0.0)
data/README.md CHANGED
@@ -5,15 +5,40 @@ A description of cocoapods-tdfire-binary.
5
5
  ## Installation
6
6
 
7
7
  $ gem install cocoapods-tdfire-binary
8
+
9
+
10
+ ## TODO
11
+
12
+ 1. 拥有 Subspec 的组件二进制依赖方式
13
+ 2. 本地 Lint 二进制
8
14
 
9
15
  ## Usage
10
16
 
11
- > For .gitignore
17
+ ```
18
+
19
+ Usage:
20
+
21
+ $ pod binary COMMAND
22
+
23
+ 2Dfire 二进制工具库,提供打包、lint、推送、拉取、发布等命令
24
+
25
+ Commands:
26
+
27
+ + lint 对本地二进制进行 Lint
28
+ + package 二进制打包
29
+ + publish 正式发布二进制组件
30
+ + pull 下载二进制 zip 包
31
+ + push 推送二进制 zip 包
32
+
33
+ ```
34
+
35
+ ### For .gitignore
12
36
 
13
37
  ```
14
38
  ...
15
39
 
16
40
  *.framework
41
+ *.zip
17
42
  ```
18
43
 
19
44
  > For Podfile
@@ -31,31 +56,84 @@ use_frameworks!
31
56
 
32
57
  ```
33
58
 
34
- > For podspec
59
+ ### For podspec
35
60
 
36
61
  ```
37
62
  ...
38
63
 
39
- tdfire_source_proc = Proc.new do
64
+ tdfire_source_configurator = lambda do |s|
40
65
  # source configuration
66
+ # s.source_files = 'PodA/Classes/**/*'
67
+ # s.resource_bundles = {
68
+ # 'PodA' => ['PodA/Assets/*']
69
+ # }
41
70
  end
42
71
 
43
- unless %w[tdfire_set_binary_download_configurations_at_last tdfire_source tdfire_binary].reduce(true) { |r, m| s.respond_to?(m) & r }
72
+ unless %w[tdfire_set_binary_download_configurations tdfire_source tdfire_binary].reduce(true) { |r, m| s.respond_to?(m) & r }
44
73
 
45
- tdfire_source_proc.call
74
+ tdfire_source_configurator.call s
46
75
  else
47
- s.tdfire_source &tdfire_source_proc
48
-
49
- s.tdfire_binary do
50
- s.vendored_framework = "#{s.name}.framework"
51
- s.source_files = "#{s.name}.framework/Headers/*"
52
- s.public_header_files = "#{s.name}.framework/Headers/*"
76
+ s.tdfire_source tdfire_source_configurator
77
+ s.tdfire_binary tdfire_source_configurator
78
+ s.tdfire_set_binary_download_configurations
79
+ end
80
+
81
+ ```
53
82
 
54
- # binary configuration
83
+ - tdfire_source_proc
84
+ - 配置源码依赖
85
+
86
+ - tdfire_binary
87
+ - 配置二进制依赖,其中 `vendored_framework`、`source_files`、`public_header_files` 内部设置成如下路径
88
+
89
+ ```
90
+ s.vendored_framework = "#{s.name}.framework"
91
+ s.source_files = "#{s.name}.framework/Headers/*"
92
+ s.public_header_files = "#{s.name}.framework/Headers/*"
93
+ ```
94
+ - 提取 subspec 中的依赖、frameworks、 libraries、 weak_frameworks,至二进制组件对应属性中
95
+ - 在组件源码依赖有 subspec 的情况下,插件会在二进制依赖时,动态创建 default subspec `TdfireBinary`,以及源码依赖时的 subspec ,并且让后者的所有 subspec 依赖 `TdfireBinary`
96
+ - 由于此方案对二进制中的 subspec 并**不做区分**,统一打包成一个二进制文件,所以如果在使用二进制依赖时,依赖了 subspec ,插件还是会去下载完整的二进制文件,并且从最终生成的结果看,目录中只有 `TdfireBinary` subspec
97
+ - 此插件不支持嵌套 subspec 场景,如
98
+
99
+ ```ruby
100
+ Pod::Spec.new do |s|
101
+ s.name = 'Root'
102
+ s.subspec 'Level_1' do |sp|
103
+ sp.subspec 'Level_2' do |ssp|
104
+ end
105
+ end
55
106
  end
107
+ ```
108
+
109
+ - tdfire_set_binary_download_configurations
110
+ - 强制设置 static_framework 为 true,规避使用 use_frameworks! 时,动态库依赖链(动态库依赖静态库问题)、影响启动时间问题
111
+ - 设置 preserve_paths,让 cache 保留源码、资源、二进制全部文件
112
+ - preserve_paths 由组件,子组件的源码、资源路径,以及 Framework 路径组成
113
+ - 设置下载 prepare_command,未发布组件将会略过这一步骤
114
+
115
+ ### For Lib Env
116
+
117
+ > Warning: 在发布二进制组件前,走二进制依赖流程,无法下载到对应 framework
118
+
119
+
120
+ - Env Key
121
+ - tdfire_use_binary
122
+ - 使用二进制依赖,确认值 1
123
+ - tdfire_unpublished_pods
124
+ - 未发布的组件,用 `|` 隔开 (如 PodA|PodB, 一般只有一个,即当前开发组件),设置后对应组件走源码依赖流程。
125
+ - 二进制 lint 时,无法通过 Podfile 的 plugin 获取当前的 development pod (即当前开发组件) ,在发布对应二进制版本前,走二进制依赖流程,是下不到对应二进制版本的,所以需要自己设置当前开发组件名,对这一部分进行源码依赖。
126
+ - tdfire_force_use_source
127
+ - 强制使用源码依赖,确认值 1
128
+ - 源码 lint 、未发布二进制组件前 CI 中 pod install / update (优先级比 Podfile 中的设置高) 时可使用
129
+ - tdfire_force_use_binary
130
+ - 强制使用二进制依赖,确认值 1
131
+ - 基本无用,在验证当前版本是否有对应二进制版本时可使用
56
132
 
57
- # s.tdfire_set_binary_download_configurations_at_last(download_url)
58
- s.tdfire_set_binary_download_configurations_at_last
59
- end
133
+
134
+ 例子:
60
135
 
61
136
  ```
137
+ env tdfire_use_binary=1 tdfire_unpublished_pods=PodA pod lib lint xxxx
138
+ env tdfire_force_use_source=1 pod install
139
+ ```
@@ -22,4 +22,5 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency 'rake', '~> 12.0'
23
23
 
24
24
  spec.add_dependency 'cocoapods', '~> 1.4'
25
+ spec.add_dependency 'cocoapods-packager', '~> 1.5.0'
25
26
  end
@@ -0,0 +1,162 @@
1
+ require 'cocoapods-tdfire-binary/binary_url_manager'
2
+
3
+ module Pod
4
+ class Specification
5
+ #--------------------------------------------------------------------#
6
+ # => 获取自身以及子组件的属性合并值
7
+ #--------------------------------------------------------------------#
8
+ def all_value_for_attribute(name)
9
+ (Array(self) + Array(recursive_subspecs))
10
+ .map { |s| s.attributes_hash[name] }
11
+ .compact
12
+ end
13
+
14
+ def all_hash_value_for_attribute(name)
15
+ all_value_for_attribute(name).reduce({}, :merge)
16
+ end
17
+
18
+ def all_array_value_for_attribute(name)
19
+ all_value_for_attribute(name).flatten
20
+ end
21
+
22
+ def store_array_value_with_attribute_and_reference_spec(name, spec)
23
+ temp = spec.all_array_value_for_attribute(name)
24
+ temp += attributes_hash[name] unless attributes_hash[name].nil?
25
+ store_attribute(name, temp) unless temp.empty?
26
+ end
27
+
28
+ def store_hash_value_with_attribute_and_reference_spec(name, spec, &select)
29
+ temp = spec.all_hash_value_for_attribute(name)
30
+ temp.merge!(attributes_hash[name]) unless attributes_hash[name].nil?
31
+ temp.select! { |k, v| yield k if block_given? }
32
+ store_attribute(name, temp) unless temp.empty?
33
+ end
34
+ #--------------------------------------------------------------------#
35
+ end
36
+ end
37
+
38
+ module Tdfire
39
+ class BinarySpecificationRefactor
40
+ attr_accessor :target_spec
41
+
42
+ def initialize(target_spec)
43
+ @target_spec = target_spec
44
+ end
45
+
46
+ #--------------------------------------------------------------------#
47
+ # 生成default subspec TdfireBinary ,并将源码依赖时的配置转移到此 subspec 上
48
+ def configure_binary_default_subspec_with_reference_spec(spec)
49
+ default_subspec = "TdfireBinary"
50
+ target_spec.subspec default_subspec do |ss|
51
+ subspec_refactor = BinarySpecificationRefactor.new(ss)
52
+ subspec_refactor.configure_binary_with_reference_spec(spec)
53
+ end
54
+
55
+ # 创建源码依赖时的 subspec,并且设置所有的 subspec 依赖 default_subspec
56
+ spec.subspecs.each do |s|
57
+ target_spec.subspec s.base_name do |ss|
58
+ ss.dependency "#{target_spec.root.name}/#{default_subspec}"
59
+ end
60
+ end
61
+
62
+ target_spec.default_subspec = default_subspec
63
+ target_spec.default_subspec = default_subspec
64
+
65
+ Pod::UI.message "Tdfire: subspecs for #{target_spec.name}: #{target_spec.subspecs.map(&:name).join(', ')}"
66
+ end
67
+
68
+ #--------------------------------------------------------------------#
69
+ # spec 是二进制依赖时的配置
70
+ def configure_binary_with_reference_spec(spec)
71
+ # 组件 frameworks 的依赖
72
+ target_spec.vendored_frameworks = "#{target_spec.root.name}.framework"
73
+ target_spec.source_files = "#{target_spec.root.name}.framework/Headers/*"
74
+ target_spec.public_header_files = "#{target_spec.root.name}.framework/Headers/*"
75
+
76
+ # 保留对 frameworks lib 的依赖
77
+ %w[frameworks libraries weak_frameworks].each do |name|
78
+ target_spec.store_array_value_with_attribute_and_reference_spec(name, spec)
79
+ end
80
+
81
+ # 保留对其他组件的依赖
82
+ target_spec.store_hash_value_with_attribute_and_reference_spec('dependencies', spec) do |name|
83
+ # 去除对自身子组件的依赖
84
+ name.split('/').first != target_spec.root.name
85
+ end
86
+
87
+ Pod::UI.message "Tdfire: dependencies for #{target_spec.name}: #{target_spec.dependencies.map(&:name).join(', ')}"
88
+ end
89
+
90
+ #--------------------------------------------------------------------#
91
+ # spec 是源码依赖时的配置
92
+ def set_preserve_paths_with_reference_spec(spec)
93
+ # 源码、资源文件
94
+ source_files = spec.all_array_value_for_attribute('source_files')
95
+ resources = spec.all_array_value_for_attribute('resources')
96
+ resource_bundles = spec.all_hash_value_for_attribute('resource_bundles')
97
+ source_preserve_paths = source_files + resources + resource_bundles.values.flatten
98
+
99
+ # 二进制文件
100
+ framework_preserve_paths = [framework_name]
101
+ preserve_paths = source_preserve_paths + framework_preserve_paths
102
+
103
+ # 保留原有的 preserve_paths
104
+ preserve_paths += target_spec.attributes_hash['preserve_paths'] unless target_spec.attributes_hash['preserve_paths'].nil?
105
+ target_spec.preserve_paths = preserve_paths.uniq
106
+
107
+ Pod::UI.message "Tdfire: preserve paths for #{target_spec.name}: #{preserve_paths.join(', ')}"
108
+ end
109
+
110
+ #--------------------------------------------------------------------#
111
+
112
+ def set_use_static_framework
113
+ target_spec.static_framework = true
114
+ end
115
+
116
+ #--------------------------------------------------------------------#
117
+ def set_framework_download_script
118
+ download_url = BinaryUrlManager.pull_url_for_pod_version(target_spec.root.name, target_spec.version)
119
+
120
+ download_script = <<-EOF
121
+ #!/bin/sh
122
+
123
+ if [[ -d #{framework_name} ]]; then
124
+ echo "Tdfire: #{framework_name} is not empty"
125
+ exit 0
126
+ fi
127
+
128
+ if [[ ! -d tdfire_download_temp ]]; then
129
+ mkdir tdfire_download_temp
130
+ fi
131
+
132
+ cd tdfire_download_temp
133
+
134
+ curl --fail -O -J -v #{download_url}
135
+
136
+ if [[ -f #{framework_name}.zip ]]; then
137
+ echo "Tdfire: copying #{framework_name} ..."
138
+
139
+ unzip #{framework_name}.zip
140
+ cp -fr #{framework_name} ../
141
+ fi
142
+
143
+ cd ..
144
+ rm -fr tdfire_download_temp
145
+
146
+ echo "pod cache path for #{target_spec.root.name}: $(pwd)"
147
+ EOF
148
+
149
+ combined_download_script = %Q[echo '#{download_script}' > download.sh && sh download.sh && rm download.sh]
150
+ combined_download_script += " && " << target_spec.prepare_command unless target_spec.prepare_command.nil?
151
+
152
+ target_spec.prepare_command = combined_download_script
153
+ end
154
+
155
+ #--------------------------------------------------------------------#
156
+ private
157
+
158
+ def framework_name
159
+ "#{target_spec.root.name}.framework"
160
+ end
161
+ end
162
+ end
@@ -7,9 +7,11 @@ module Tdfire
7
7
  attr_accessor :use_source_pods
8
8
  attr_reader :printed_pods
9
9
  attr_accessor :use_frameworks
10
+ attr_accessor :use_source
10
11
  end
11
- # @unpublished_pods = []
12
+
12
13
  @use_source_pods = []
14
+ @use_binary_pods = []
13
15
  @printed_pods = []
14
16
  @use_frameworks = false
15
17
 
@@ -0,0 +1,41 @@
1
+ module Tdfire
2
+ class BinaryUrlManager
3
+ HOST = "http://iosframeworkserver-shopkeeperclient.cloudapps.2dfire.com"
4
+
5
+ def self.pull_url_for_pod_version(pod, version)
6
+ HOST + "/getframework/PRODUCTION/#{pod}/#{version}"
7
+ end
8
+
9
+ def self.get_pull_url_for_pod_version(pod, version)
10
+ command = "curl #{pull_url_for_pod_version(pod, version)} > #{pod}.framework.zip"
11
+
12
+ run_curl command
13
+ end
14
+
15
+ def self.push_url
16
+ HOST + "/upload" #+ param
17
+ end
18
+
19
+ def self.post_push_url(name, version, path, commit = nil, commit_hash = nil)
20
+ param = %Q[-F "frameworkName=#{name}" -F "version=#{version}" -F "environment=PRODUCTION" -F "changelog=#{commit}" -F "featureName=#{commit}" -F "framework=@#{path}" -F "commitHash=#{commit_hash}"]
21
+ command = "curl #{push_url} #{param}"
22
+
23
+ run_curl command
24
+ end
25
+
26
+ def self.run_curl(command)
27
+ Pod::UI.message "CURL: \n" + command
28
+
29
+ system command
30
+ end
31
+
32
+ def self.private_cocoapods_url
33
+ "git@git.2dfire-inc.com:ios/cocoapods-spec.git"
34
+ # "git@git.2dfire-inc.com:qingmu/private_cocoapods.git"
35
+ end
36
+
37
+ def self.template_lib_url
38
+ "git@git.2dfire-inc.com:ios/binary-pod-template.git"
39
+ end
40
+ end
41
+ end
@@ -0,0 +1 @@
1
+ require 'cocoapods-tdfire-binary/command/binary'
@@ -0,0 +1,36 @@
1
+ require 'cocoapods-tdfire-binary/command/package'
2
+ require 'cocoapods-tdfire-binary/command/lint'
3
+ require 'cocoapods-tdfire-binary/command/publish'
4
+ require 'cocoapods-tdfire-binary/command/push'
5
+
6
+ module Pod
7
+ class Command
8
+ class Binary < Command
9
+ class Assemble < Binary
10
+ self.abstract_command = false
11
+ self.summary = '执行二进制组件发布操作集合'
12
+ self.description = <<-DESC
13
+ 执行二进制组件发布操作集合,依次为 package、lint、push、publish
14
+ DESC
15
+
16
+ def validate!
17
+ super
18
+ help! "当前目录下找不到有效的 podspec 文件" if first_podspec.nil?
19
+ end
20
+
21
+ def run
22
+ run_command Package
23
+ run_command Lint
24
+ run_command Push
25
+ run_command Publish
26
+ end
27
+
28
+ def run_command(command_class, argv = [])
29
+ lint = command_class::new(CLAide::ARGV.new(argv))
30
+ lint.validate!
31
+ lint.run
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,32 @@
1
+ require 'cocoapods-tdfire-binary/command/lint'
2
+ require 'cocoapods-tdfire-binary/command/package'
3
+ require 'cocoapods-tdfire-binary/command/publish'
4
+ require 'cocoapods-tdfire-binary/command/pull'
5
+ require 'cocoapods-tdfire-binary/command/push'
6
+ require 'cocoapods-tdfire-binary/command/assemble'
7
+ require 'cocoapods-tdfire-binary/command/lib'
8
+
9
+ module Pod
10
+ class Command
11
+ class Binary < Command
12
+ self.abstract_command = true
13
+ self.summary = '2Dfire 二进制工具库'
14
+ self.description = <<-DESC
15
+ 2Dfire 二进制工具库,提供打包、lint、推送、拉取、发布等命令
16
+ DESC
17
+
18
+ FIRE_FLAG = "2dfire"
19
+ # FIRE_FLAG = "private"
20
+
21
+ def first_podspec
22
+ Dir["#{Dir.pwd}/*.podspec"].first
23
+ end
24
+
25
+ def fire_sources
26
+ config.sources_manager.all.select do |source|
27
+ source.url.downcase.include? FIRE_FLAG
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ require 'cocoapods-tdfire-binary/command/lib/create'
2
+
3
+ module Pod
4
+ class Command
5
+ class Binary < Command
6
+ class Lib < Binary
7
+ self.abstract_command = true
8
+ self.default_subcommand = 'create'
9
+ self.summary = '二进制模版库操作'
10
+ self.description = <<-DESC
11
+ 二进制模版库操作
12
+ DESC
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,42 @@
1
+ require 'cocoapods-tdfire-binary/binary_url_manager'
2
+
3
+ module Pod
4
+ class Command
5
+ class Binary < Command
6
+ class Lib < Binary
7
+ class Create < Lib
8
+ self.abstract_command = false
9
+ self.summary = '创建二进制模版库'
10
+ self.description = <<-DESC
11
+ 创建二进制模版库
12
+ DESC
13
+
14
+ self.arguments = [
15
+ CLAide::Argument.new('NAME', true),
16
+ ]
17
+
18
+ def initialize(argv)
19
+ @name = argv.shift_argument
20
+ super
21
+ end
22
+
23
+ def validate!
24
+ super
25
+ help! "必须提供有效组件名称" if @name.nil?
26
+ end
27
+
28
+ def run
29
+ argvs = [
30
+ "--template-url=#{Tdfire::BinaryUrlManager.template_lib_url}",
31
+ @name
32
+ ]
33
+
34
+ create = Pod::Command::Lib::Create.new(CLAide::ARGV.new(argvs))
35
+ create.validate!
36
+ create.run
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,17 @@
1
+ module Pod
2
+ class Command
3
+ class Binary < Command
4
+ class Lint < Binary
5
+ self.abstract_command = false
6
+ self.summary = '对本地二进制进行 Lint'
7
+ self.description = <<-DESC
8
+ 对本地二进制进行 Lint
9
+ DESC
10
+
11
+ def run
12
+
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,87 @@
1
+ require 'colored2'
2
+ require 'fileutils'
3
+ require 'cocoapods-tdfire-binary/binary_url_manager'
4
+ require 'cocoapods-tdfire-binary/binary_specification_refactor'
5
+
6
+ module Pod
7
+ class Command
8
+ class Binary < Command
9
+ class Package < Binary
10
+ self.abstract_command = false
11
+ self.summary = '二进制打包'
12
+ self.description = <<-DESC
13
+ 将源码打包成二进制,并压缩成 zip 包
14
+ DESC
15
+
16
+ def self.options
17
+ [
18
+ ['--clean', '执行成功后,删除 zip 文件外的所有生成文件'],
19
+ ['--spec-sources', '私有源地址'],
20
+ ].concat(super)
21
+ end
22
+
23
+ def initialize(argv)
24
+ @clean = argv.flag?('clean')
25
+ @spec_sources = argv.option('spec-sources')
26
+ @spec_file = first_podspec
27
+ super
28
+ end
29
+
30
+ def validate!
31
+ super
32
+ help! '当前目录下没有podspec文件.' if @spec_file.nil?
33
+ end
34
+
35
+ def run
36
+ spec = Specification.from_file(@spec_file)
37
+ package(spec)
38
+ zip(spec)
39
+ end
40
+
41
+ private
42
+
43
+ def package(spec)
44
+ UI.section("Tdfire: package #{spec.name} ...") do
45
+ system "pod package #{spec.name}.podspec --exclude-deps --force --no-mangle --spec-sources=#{@spec_sources || Tdfire::BinaryUrlManager.private_cocoapods_url}"
46
+ end
47
+ end
48
+
49
+ def zip(spec)
50
+ framework_directory = "#{spec.name}-#{spec.version}/ios"
51
+ framework_name = "#{spec.name}.framework"
52
+ framework_path = "#{framework_directory}/#{framework_name}"
53
+
54
+ raise Informative, "没有需要压缩的 framework 文件:#{framework_path}" unless File.exist?(framework_path)
55
+
56
+ # cocoapods-packager 使用了 --exclude-deps 后,虽然没有把 dependency 的符号信息打进可执行文件,但是它把 dependency 的 bundle 给拷贝过来了 (builder.rb 229 copy_resources)
57
+ # 这里把多余的 bundle 删除
58
+ # https://github.com/CocoaPods/cocoapods-packager/pull/199
59
+ resource_bundles = spec.all_hash_value_for_attribute('resource_bundles').keys.flatten.uniq
60
+ FileUtils.chdir("#{framework_path}/Versions/A/Resources") do
61
+ dependency_bundles = Dir.glob('*.bundle').select { |b| !resource_bundles.include?(b.split('.').first) }
62
+ unless dependency_bundles.empty?
63
+ Pod::UI::puts "Tdfire: remove dependency bundles: #{dependency_bundles.join(', ')}"
64
+
65
+ dependency_bundles.each do |b|
66
+ FileUtils.rm_rf(b)
67
+ end
68
+ end
69
+ end
70
+
71
+ output_name = "#{framework_name}.zip"
72
+ UI.section("Tdfire: zip #{framework_path} ...") do
73
+ FileUtils.chdir(framework_directory) do
74
+ system "zip --symlinks -r #{output_name} #{framework_name}"
75
+ system "mv #{output_name} ../../"
76
+ end
77
+ end
78
+
79
+ Pod::UI::puts "Tdfire: save framework zip file to #{Dir.pwd}/#{output_name}".green
80
+
81
+ system "rm -fr #{spec.name}-#{@spec.version}" if @clean
82
+ end
83
+
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,68 @@
1
+ module Pod
2
+ class Command
3
+ class Binary < Command
4
+ class Publish < Binary
5
+ self.abstract_command = false
6
+ self.summary = '正式发布二进制组件'
7
+ self.description = <<-DESC
8
+ 正式发布二进制组件版本
9
+ DESC
10
+
11
+ self.arguments = [
12
+ CLAide::Argument.new('NAME.podspec', false),
13
+ ]
14
+
15
+ def self.options
16
+ [
17
+ ['--commit="Fix some bugs"', '发布的 commit 信息']
18
+ ].concat(super)
19
+ end
20
+
21
+ def initialize(argv)
22
+ spec_file = argv.shift_argument
23
+ @commit = argv.option('commit')
24
+
25
+ spec_file = first_podspec if spec_file.nil?
26
+ @spec_file = spec_file
27
+ super
28
+ end
29
+
30
+ def validate!
31
+ super
32
+ help! "当前目录下找不到有效的 podspec 文件" if @spec_file.nil?
33
+ end
34
+
35
+ def run
36
+ spec = Specification.from_file(@spec_file)
37
+
38
+ UI.section("Tdfire: start publishing #{spec.name} ...") do
39
+ argvs = [
40
+ fire_sources.first.name,
41
+ @spec_file,
42
+ '--allow-warnings',
43
+ '--use-libraries',
44
+ '--verbose'
45
+ ]
46
+ argvs << %Q[--commit-message=#{commit_prefix(spec) + "\n" + @commit}] unless @commit.to_s.empty?
47
+
48
+ push = Pod::Command::Repo::Push.new(CLAide::ARGV.new(argvs))
49
+ push.validate!
50
+ push.run
51
+ end
52
+ end
53
+
54
+ private
55
+ def commit_prefix(spec)
56
+ output_path = fire_sources.first.pod_path(spec.name) + spec.version.to_s
57
+ if output_path.exist?
58
+ message = "[Fix] #{spec}"
59
+ elsif output_path.dirname.directory?
60
+ message = "[Update] #{spec}"
61
+ else
62
+ message = "[Add] #{spec}"
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,39 @@
1
+ require 'cocoapods-tdfire-binary/binary_url_manager'
2
+
3
+ module Pod
4
+ class Command
5
+ class Binary < Command
6
+ class Pull < Binary
7
+ self.abstract_command = false
8
+ self.summary = '下载二进制 zip 包'
9
+ self.description = <<-DESC
10
+ 通过 NAME 和 VERSION ,下载二进制 zip 包
11
+ DESC
12
+
13
+ self.arguments = [
14
+ CLAide::Argument.new('NAME', true),
15
+ CLAide::Argument.new('VERSION', true)
16
+ ]
17
+
18
+ def initialize(argv)
19
+ @name = argv.shift_argument
20
+ @version = argv.shift_argument
21
+ super
22
+ end
23
+
24
+ def validate!
25
+ super
26
+ help! "必须提供有效组件名" if @name.nil?
27
+ help! "必须提供有效版本号" if @version.nil?
28
+ end
29
+
30
+ def run
31
+ UI.section("Tdfire: start pulling framework zip file ...") do
32
+ UI.puts "Tdfire: get argvs: name -> #{@name}, version -> #{@version}"
33
+ Tdfire::BinaryUrlManager.get_pull_url_for_pod_version(@name, @version)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,78 @@
1
+
2
+ require 'cocoapods-tdfire-binary/binary_url_manager'
3
+
4
+ module Pod
5
+ class Command
6
+ class Binary < Command
7
+ class Push < Binary
8
+ ZIP_SUBFFIX = '.framework.zip'
9
+
10
+ self.abstract_command = false
11
+ self.summary = '推送二进制 zip 包'
12
+ self.description = <<-DESC
13
+ 将二进制 zip 包推送至二进制服务器
14
+ DESC
15
+
16
+ self.arguments = [
17
+ CLAide::Argument.new('PATH', false)
18
+ ]
19
+
20
+ def self.options
21
+ [
22
+ ['--name=组件名', '推送二进制的组件名'],
23
+ ['--version=版本号', '推送二进制的版本号'],
24
+ ['--commit=版本日志', '推送二进制的版本日志'],
25
+ ].concat(super)
26
+ end
27
+
28
+ def initialize(argv)
29
+ path = argv.shift_argument
30
+ name = argv.option('name')
31
+ version = argv.option('version')
32
+ commit = argv.option('commit')
33
+
34
+ unless first_podspec.nil?
35
+ if path.nil?
36
+ path = first_podspec.split('.').first
37
+ end
38
+
39
+ spec = Specification.from_file(Pathname.new(first_podspec))
40
+ version = spec.version if version.nil?
41
+ name = spec.name
42
+ end
43
+
44
+ path += ZIP_SUBFFIX unless path.end_with?(ZIP_SUBFFIX)
45
+
46
+
47
+ @path = path
48
+ @name = name || path.split('/').last - ZIP_SUBFFIX
49
+ @version = version
50
+ @commit = commit
51
+ super
52
+ end
53
+
54
+ def validate!
55
+ super
56
+ help! "指定目录下没有可推送文件: #{@path}" unless File.exist?(@path)
57
+ help! "必须为推送组件指定版本(--version)" if @version.nil?
58
+ end
59
+
60
+ def run
61
+ tag_log = `git tag -l -n #{@version}`
62
+ tag_log = tag_log.split(' ')[1..-1].join('') unless tag_log.empty?
63
+
64
+
65
+ hash_log = `git show-ref #{@version}`
66
+ hash_log = hash_log.split(' ').first unless hash_log.empty?
67
+
68
+ commit = @commit || tag_log || @version
69
+
70
+ UI.section("Tdfire: start pushing framework zip file ...") do
71
+ UI.puts "Tdfire: post argvs: name -> #{@name}, version -> #{@version}, path -> #{@path}, commit -> #{commit}, commit hash -> #{hash_log}"
72
+ Tdfire::BinaryUrlManager.post_push_url(@name, @version, @path, commit, hash_log)
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -1,3 +1,3 @@
1
1
  module CocoapodsTdfireBinary
2
- VERSION = "0.1.10"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -15,6 +15,19 @@ module Pod
15
15
  Tdfire::BinaryStateStore.set_use_binary
16
16
  end
17
17
 
18
+ # 因为暂时无法将全部组件二进制化,tdfire_use_binary! 默认全部进行二进制依赖不利于渐进测试
19
+ # 所以添加 tdfire_use_source! 默认全部进行源码依赖,开放指定二进制依赖组件接口
20
+ #
21
+ # 使用二进制依赖的pod
22
+ # 与 tdfire_use_binary 互斥
23
+ # def tdfire_use_binary_pods(pods)
24
+ # Pod::UI.puts "Tdfire: set use binary pods: #{Array(pods).join(', ')}"
25
+ # Tdfire::BinaryStateStore.use_binary_pods = Array(pods)
26
+ # end
27
+ #
28
+ # def tdfire_use_source!
29
+ # end
30
+
18
31
  # 强制使用二进制依赖,忽略未发布和依赖源码设置
19
32
  # def tdfire_force_use_binary!
20
33
  # Tdfire::BinaryStateStore.set_force_use_binary
@@ -24,27 +37,27 @@ module Pod
24
37
  def tdfire_external_pods(pods, *rest)
25
38
  argvs = rest.last || {}
26
39
  if !argvs.kind_of?(Hash)
27
- info = <<-EOF
28
- 输入参数错误.
40
+ info = <<~EOF
41
+ 输入参数错误.
29
42
 
30
- Example:
31
- tdfire_external_pods ['TDFCore'], source:'git', group:'ios', branch:'develop'
32
- tdfire_external_pods 'TDFCore', source:'git', group:'ios', branch:'develop'
33
- tdfire_external_pods ['TDFCore'], group:'cocoapods'
34
- ...
43
+ Example:
44
+ tdfire_external_pods ['TDFCore'], source:'git', group:'ios', branch:'develop'
45
+ tdfire_external_pods 'TDFCore', source:'git', group:'ios', branch:'develop'
46
+ tdfire_external_pods ['TDFCore'], group:'cocoapods'
47
+ ...
35
48
 
36
- 默认值:
37
- source:path
38
- group:ios
39
- branch:develop
49
+ 默认值:
50
+ source:path
51
+ group:ios
52
+ branch:develop
40
53
 
41
- 所有值:
42
- source -> git path
43
- group -> 任意
44
- branch -> 任意
54
+ 所有值:
55
+ source -> git path
56
+ group -> 任意
57
+ branch -> 任意
45
58
 
46
- 格式可以和pod语法一致
47
- EOF
59
+ 格式可以和pod语法一致
60
+ EOF
48
61
  raise Pod::Informative, info
49
62
  end
50
63
 
@@ -5,13 +5,19 @@ module CocoapodsTdfireBinary
5
5
  include Tdfire
6
6
 
7
7
  Pod::HooksManager.register('cocoapods-tdfire-binary', :pre_install) do |context, _|
8
- first_target_definition = context.podfile.target_definition_list.select{ |d| d.name != 'Pods' }.first
9
- development_pod = first_target_definition.name.split('_').first unless first_target_definition.nil?
10
-
11
- Pod::UI.section("Tdfire: auto set share scheme for development pod: \'#{development_pod}\'") do
12
- # carthage 需要 shared scheme 构建 framework
13
- context.podfile.install!('cocoapods', :share_schemes_for_development_pods => [development_pod])
14
- end unless development_pod.nil?
8
+ # 使用 cocoapods package 打包,不使用 carthage 了,不用设置 share schemes
9
+ # 如果使用 carhtage ,一定要让需要二进制化的 target shared,此 target 不能是 static framework / library ,必须是 dynamic framework.
10
+ # 并且需要在这里做个标记,记录目标 target ,让这个 target 对应的 podspec 跳过 set_use_static_framework 这一步.
11
+ # pod install 时,强制使用源码,然后使用 --no-skip-current iOS --no-use-binaries
12
+ # carthage 生成 static framework 参照 https://github.com/Carthage/Carthage/blob/master/Documentation/StaticFrameworks.md
13
+ #
14
+ # first_target_definition = context.podfile.target_definition_list.select{ |d| d.name != 'Pods' }.first
15
+ # development_pod = first_target_definition.name.split('_').first unless first_target_definition.nil?
16
+ #
17
+ # Pod::UI.section("Tdfire: auto set share scheme for development pod: \'#{development_pod}\'") do
18
+ # # carthage 需要 shared scheme 构建 framework
19
+ # context.podfile.install!('cocoapods', :share_schemes_for_development_pods => [development_pod])
20
+ # end unless development_pod.nil?
15
21
 
16
22
 
17
23
  # 标明未发布的pod,因为未发布pod没有对应的二进制版本,无法下载
@@ -22,17 +28,19 @@ module CocoapodsTdfireBinary
22
28
  Pod::UI.message "> Tdfire: unpublished pods: #{BinaryStateStore.unpublished_pods.join(', ')}"
23
29
  end
24
30
 
31
+ # 使用 static_framework ,不用 dynamic_framework ,不需要关心 dynamic_framework 的依赖链了
32
+ #
25
33
  # 没有标识use_frameworks!,进行源码依赖需要设置Pod依赖链上,依赖此源码Pod的也进行源码依赖
26
- BinaryStateStore.use_frameworks = first_target_definition.uses_frameworks?
27
- unless BinaryStateStore.use_frameworks
28
- Pod::UI.section("Tdfire: analyze chain pods depend on use source pods: #{BinaryStateStore.use_source_pods.join(', ')}") do
29
- chain_pods = SourceChainAnalyzer.new(context.podfile).analyze(BinaryStateStore.use_source_pods)
34
+ # BinaryStateStore.use_frameworks = first_target_definition.uses_frameworks?
35
+ # unless BinaryStateStore.use_frameworks
36
+ # Pod::UI.section("Tdfire: analyze chain pods depend on use source pods: #{BinaryStateStore.use_source_pods.join(', ')}") do
37
+ # chain_pods = SourceChainAnalyzer.new(context.podfile).analyze(BinaryStateStore.use_source_pods)
30
38
 
31
- Pod::UI.message "> Tdfire: find chain pods: #{chain_pods.join(', ')}"
39
+ # Pod::UI.message "> Tdfire: find chain pods: #{chain_pods.join(', ')}"
32
40
 
33
- BinaryStateStore.use_source_pods += chain_pods
34
- end unless BinaryStateStore.use_source_pods.empty?
35
- end
41
+ # BinaryStateStore.use_source_pods += chain_pods
42
+ # end unless BinaryStateStore.use_source_pods.empty?
43
+ # end
36
44
  end
37
45
 
38
46
  #fix `Shell Script` Build Phase Fails When Input / Output Files List is Too Large
@@ -54,7 +62,7 @@ module CocoapodsTdfireBinary
54
62
 
55
63
  context.umbrella_targets.map(&:user_project).each do |project|
56
64
  project.save
57
- end
65
+ end
58
66
  end
59
67
 
60
68
  Pod::UI.puts "Tdfire: all source dependency pods: #{BinaryStateStore.real_use_source_pods.join(', ')}" if BinaryStateStore.use_binary?
@@ -1,4 +1,4 @@
1
- module Tdfire
1
+ module Tdfire
2
2
  class SourceChainAnalyzer
3
3
 
4
4
  def initialize(podfile)
@@ -1,116 +1,86 @@
1
1
  require 'cocoapods-tdfire-binary/binary_state_store'
2
+ require 'cocoapods-tdfire-binary/binary_specification_refactor'
2
3
  require 'colored2'
3
4
 
4
5
  module Pod
5
6
  class Specification
6
- module DSL
7
+ include Tdfire
7
8
 
8
- private
9
+ def tdfire_refactor
10
+ @refactor ||= BinarySpecificationRefactor.new(self)
11
+ end
9
12
 
10
- def use_source?
11
- (!Tdfire::BinaryStateStore.force_use_binary? &&
12
- (!Tdfire::BinaryStateStore.use_binary? || Tdfire::BinaryStateStore.real_use_source_pods.include?(name))) ||
13
- Tdfire::BinaryStateStore.force_use_source?
14
- end
13
+ module DSL
15
14
 
16
- public
15
+ public
17
16
 
17
+ # 此次操作,Podfile 是否使用了 use_frameworks!
18
18
  def tdfire_use_frameworks?
19
19
  Tdfire::BinaryStateStore.use_frameworks
20
20
  end
21
21
 
22
- # 源码依赖配置
23
- def tdfire_source(&block)
24
- if use_source?
25
- if !Tdfire::BinaryStateStore.printed_pods.include?(name)
26
- UI.message "Source".magenta.bold + " dependecy for " + "#{name} #{version}".green.bold
27
- Tdfire::BinaryStateStore.printed_pods << name
22
+ # 源码依赖配置
23
+ def tdfire_source(configurator)
24
+ if tdfire_use_source?
25
+ if !Tdfire::BinaryStateStore.printed_pods.include?(root.name)
26
+ UI.message "Source".magenta.bold + " dependecy for " + "#{root.name} #{version}".green.bold
27
+ Tdfire::BinaryStateStore.printed_pods << root.name
28
28
  end
29
29
 
30
- yield self if block_given?
30
+ configurator.call self
31
+
32
+ # 在设置了 use_frameworks! 的情况下才会生效
33
+ tdfire_refactor.set_use_static_framework
31
34
  end
32
35
  end
33
36
 
34
37
  # 二进制依赖配置
35
- def tdfire_binary(&block)
36
- if !use_source?
37
- if !Tdfire::BinaryStateStore.printed_pods.include?(name)
38
- UI.message "Binary".cyan.bold + " dependecy for " + "#{name} #{version}".green.bold
39
- Tdfire::BinaryStateStore.printed_pods << name
38
+ def tdfire_binary(configurator, &block)
39
+ if !tdfire_use_source?
40
+ if !Tdfire::BinaryStateStore.printed_pods.include?(root.name)
41
+ UI.message "Binary".cyan.bold + " dependecy for " + "#{root.name} #{version}".green.bold
42
+ Tdfire::BinaryStateStore.printed_pods << root.name
40
43
  end
41
44
 
42
45
  yield self if block_given?
46
+
47
+ # name 一定要有,否则 subspec dependecy 会出现 split nil 错误
48
+ @tdfire_reference_spec = Specification.new(nil, 'TdfireSpecification')
49
+ configurator.call @tdfire_reference_spec
50
+
51
+ # 如果存在 subspec,则生成 default subpsec ,并将所有的 subspec 配置转移到此 subspec 中
52
+ # 已存在的 subspec 依赖此 subspec
53
+ unless @tdfire_reference_spec.subspecs.empty?
54
+ tdfire_refactor.configure_binary_default_subspec_with_reference_spec( @tdfire_reference_spec)
55
+ else
56
+ tdfire_refactor.configure_binary_with_reference_spec( @tdfire_reference_spec)
57
+ end
43
58
  end
44
59
  end
45
60
 
46
61
  # 配置二进制文件下载、cache 住解压好的 framework
47
- def tdfire_set_binary_download_configurations_at_last(download_url = nil)
62
+ def tdfire_set_binary_download_configurations
63
+ tdfire_refactor.set_preserve_paths_with_reference_spec(tdfire_reference_spec)
48
64
 
49
65
  # 没有发布的pod,没有二进制版本,不进行下载配置
50
- return if !Tdfire::BinaryStateStore.force_use_binary? && Tdfire::BinaryStateStore.unpublished_pods.include?(name)
51
-
52
- raise Pod::Informative, "You must invoke the method after setting name and version" if name.nil? || version.nil?
53
-
54
- set_framework_preserve_paths
55
- set_framework_download_script(download_url || framework_url_for_pod_version(name, version))
56
- end
57
-
58
- private
59
-
60
- def framework_url_for_pod_version(pod, version)
61
- "http://iosframeworkserver-shopkeeperclient.cloudapps.2dfire.com/getframework/PRODUCTION/#{pod}/#{version}"
62
- end
63
-
64
- def set_framework_preserve_paths
65
- framework_preserve_paths = ["#{name}.framework"]
66
- framework_preserve_paths += consumer(Platform.ios).preserve_paths unless consumer(Platform.ios).preserve_paths.nil?
66
+ return if !Tdfire::BinaryStateStore.force_use_binary? && Tdfire::BinaryStateStore.unpublished_pods.include?(root.name)
67
67
 
68
- # 规避 preserve_paths don't match any files 错误
69
- source_preserve_paths = ["#{name}/**/**/*", "Classes/**/*"]
68
+ raise Pod::Informative, "You must invoke the method after setting name and version" if root.name.nil? || version.nil?
70
69
 
71
- # preserve_paths = xxx 无法不会将值设置进去,不明白其原理
72
- store_attribute('preserve_paths', framework_preserve_paths + source_preserve_paths)
70
+ tdfire_refactor.set_framework_download_script
73
71
  end
72
+ end
74
73
 
75
- def set_framework_download_script(download_url)
76
- framework_name = "#{name}.framework"
77
- framework_relative_path = "Carthage/Build/iOS/#{framework_name}"
78
-
79
- download_script = <<-EOF
80
- #!/bin/sh
81
-
82
- if [[ -d #{framework_name} ]]; then
83
- echo "Tdfire: #{framework_name} is not empty"
84
- exit 0
85
- fi
86
-
87
- if [[ ! -d tdfire_download_temp ]]; then
88
- mkdir tdfire_download_temp
89
- fi
90
-
91
- cd tdfire_download_temp
92
-
93
- curl --fail -O -J -v #{download_url}
94
-
95
- if [[ -f #{framework_name}.zip ]]; then
96
- echo "Tdfire: copying #{framework_name} ..."
97
-
98
- unzip #{framework_name}.zip
99
- cp -fr #{framework_relative_path} ../
100
- fi
101
-
102
- cd ..
103
- rm -fr tdfire_download_temp
104
-
105
- echo "pod cache path for #{name}: $(pwd)"
106
- EOF
74
+ private
107
75
 
108
- eval_download_script = %Q[echo '#{download_script}' > download.sh && sh download.sh && rm download.sh]
109
- eval_download_script += " && " << prepare_command unless prepare_command.nil?
76
+ def tdfire_reference_spec
77
+ @tdfire_reference_spec || self
78
+ end
110
79
 
111
- # prepare_command = xxx 在内部执行的话,无法将值设置进hash,不明白其原理
112
- store_attribute('prepare_command', eval_download_script)
113
- end
80
+ def tdfire_use_source?
81
+ (!Tdfire::BinaryStateStore.force_use_binary? &&
82
+ (!Tdfire::BinaryStateStore.use_binary? || Tdfire::BinaryStateStore.real_use_source_pods.include?(root.name))) ||
83
+ Tdfire::BinaryStateStore.force_use_source?
114
84
  end
115
85
  end
116
86
  end
@@ -1,3 +1,4 @@
1
1
  require 'cocoapods-tdfire-binary/podfile_dsl'
2
2
  require 'cocoapods-tdfire-binary/specification_dsl'
3
3
  require 'cocoapods-tdfire-binary/podfile_hook'
4
+ require 'cocoapods-tdfire-binary/command'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-tdfire-binary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tripleCC
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-26 00:00:00.000000000 Z
11
+ date: 2018-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: cocoapods-packager
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.5.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.5.0
55
69
  description: cocoapods-tdfire-binary is a plugin which helps developer switching there
56
70
  project dependency between source and binary.
57
71
  email:
@@ -68,7 +82,19 @@ files:
68
82
  - Rakefile
69
83
  - cocoapods-tdfire-binary.gemspec
70
84
  - lib/cocoapods-tdfire-binary.rb
85
+ - lib/cocoapods-tdfire-binary/binary_specification_refactor.rb
71
86
  - lib/cocoapods-tdfire-binary/binary_state_store.rb
87
+ - lib/cocoapods-tdfire-binary/binary_url_manager.rb
88
+ - lib/cocoapods-tdfire-binary/command.rb
89
+ - lib/cocoapods-tdfire-binary/command/assemble.rb
90
+ - lib/cocoapods-tdfire-binary/command/binary.rb
91
+ - lib/cocoapods-tdfire-binary/command/lib.rb
92
+ - lib/cocoapods-tdfire-binary/command/lib/create.rb
93
+ - lib/cocoapods-tdfire-binary/command/lint.rb
94
+ - lib/cocoapods-tdfire-binary/command/package.rb
95
+ - lib/cocoapods-tdfire-binary/command/publish.rb
96
+ - lib/cocoapods-tdfire-binary/command/pull.rb
97
+ - lib/cocoapods-tdfire-binary/command/push.rb
72
98
  - lib/cocoapods-tdfire-binary/gem_version.rb
73
99
  - lib/cocoapods-tdfire-binary/podfile_dsl.rb
74
100
  - lib/cocoapods-tdfire-binary/podfile_hook.rb