cocoapods-bin 0.1.1 → 0.1.2

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.
@@ -1,9 +1,9 @@
1
1
  module CBin
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
4
4
 
5
5
  module Pod
6
- def self.match_version?(*version)
7
- Gem::Dependency.new("", *version).match?('', Pod::VERSION)
8
- end
6
+ def self.match_version?(*version)
7
+ Gem::Dependency.new("", *version).match?('', Pod::VERSION)
8
+ end
9
9
  end
@@ -2,111 +2,111 @@ require 'cocoapods'
2
2
  require 'cocoapods-bin/config/config'
3
3
 
4
4
  module CBin
5
- class Specification
6
- class Creator
7
- attr_reader :code_spec
8
- attr_reader :template_spec
9
- attr_reader :spec
10
-
11
- def initialize(code_spec, template_spec, platforms = 'ios')
12
- @code_spec = code_spec
13
- @template_spec = template_spec
14
- @platforms = Array(platforms)
15
- validate!
16
- end
17
-
18
- def validate!
19
- raise Pod::Informative, "源码 podspec 不能为空 ." unless code_spec
20
- raise Pod::Informative, "不支持自动生成存在 subspec 的二进制 podspec , 需要提供模版文件 #{code_spec.name}.binary.podspec.template ." if code_spec.subspecs.any? && template_spec.nil?
21
- end
22
-
23
- def create
24
- spec = template_spec ? create_from_code_spec_and_template_spec : create_from_code_spec
25
-
26
- Pod::UI.message "生成二进制 podspec 内容: "
27
- spec.to_pretty_json.split("\n").each do |text|
28
- Pod::UI.message text
29
- end
30
-
31
- spec
32
- end
33
-
34
- def write_spec_file(file = filename)
35
- create unless spec
36
-
37
- File.open(file, 'w+') do |f|
38
- f.write(spec.to_pretty_json)
39
- end
40
-
41
- @filename = file
42
- end
43
-
44
- def clear_spec_file
45
- File.delete(filename) if File.exist?(filename)
46
- end
47
-
48
- def filename
49
- @filename ||= "#{spec.name}.binary.podspec.json"
50
- end
51
-
52
- private
53
-
54
- def create_from_code_spec
55
- @spec = code_spec.dup
56
- # vendored_frameworks | resources | source | source_files | public_header_files
57
- # license | resource_bundles
58
-
59
- # Project Linkin
60
- @spec.vendored_frameworks = "#{code_spec.root.name}.framework"
61
-
62
- # Resources
63
- extnames = []
64
- extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
65
- extnames += code_spec_consumer.resources.map { |r| File.basename(r) } if code_spec_consumer.resources.any?
66
- @spec.resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } } if extnames.any?
67
-
68
- # Source Location
69
- @spec.source = binary_source
70
-
71
- # Source Code
72
- @spec.source_files = framework_contents('Headers/*')
73
- @spec.public_header_files = framework_contents('Headers/*')
74
-
75
- # Unused for binary
76
- spec_hash = @spec.to_hash
77
- # spec_hash.delete('license')
78
- spec_hash.delete('resource_bundles')
79
- spec_hash.delete('exclude_files')
80
- spec_hash.delete('preserve_paths')
81
-
82
- # Filter platforms
83
- platforms = spec_hash['platforms']
84
- selected_platforms = platforms.select { |k, v| @platforms.include?(k) }
85
- spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms
86
-
87
- @spec = Pod::Specification.from_hash(spec_hash)
88
- @spec
89
- end
90
-
91
- def create_from_code_spec_and_template_spec
92
- @spec = template_spec.dup
93
-
94
- @spec.version = code_spec.version
95
- @spec.source = binary_source
96
- @spec
97
- end
98
-
99
- def binary_source
100
- { http: CBin.config.binary_download_url % [code_spec.root.name, code_spec.version], type: CBin.config.download_file_type }
101
- end
102
-
103
- def code_spec_consumer(platform = :ios)
104
- code_spec.consumer(:ios)
105
- end
106
-
107
- def framework_contents(name)
108
- ["#{code_spec.root.name}.framework", "#{code_spec.root.name}.framework/Versions/A"].map { |path| "#{path}/#{name}" }
109
- end
110
- end
111
- end
5
+ class Specification
6
+ class Creator
7
+ attr_reader :code_spec
8
+ attr_reader :template_spec
9
+ attr_reader :spec
10
+
11
+ def initialize(code_spec, template_spec, platforms = 'ios')
12
+ @code_spec = code_spec
13
+ @template_spec = template_spec
14
+ @platforms = Array(platforms)
15
+ validate!
16
+ end
17
+
18
+ def validate!
19
+ raise Pod::Informative, "源码 podspec 不能为空 ." unless code_spec
20
+ raise Pod::Informative, "不支持自动生成存在 subspec 的二进制 podspec , 需要提供模版文件 #{code_spec.name}.binary.podspec.template ." if code_spec.subspecs.any? && template_spec.nil?
21
+ end
22
+
23
+ def create
24
+ spec = template_spec ? create_from_code_spec_and_template_spec : create_from_code_spec
25
+
26
+ Pod::UI.message "生成二进制 podspec 内容: "
27
+ spec.to_pretty_json.split("\n").each do |text|
28
+ Pod::UI.message text
29
+ end
30
+
31
+ spec
32
+ end
33
+
34
+ def write_spec_file(file = filename)
35
+ create unless spec
36
+
37
+ File.open(file, 'w+') do |f|
38
+ f.write(spec.to_pretty_json)
39
+ end
40
+
41
+ @filename = file
42
+ end
43
+
44
+ def clear_spec_file
45
+ File.delete(filename) if File.exist?(filename)
46
+ end
47
+
48
+ def filename
49
+ @filename ||= "#{spec.name}.binary.podspec.json"
50
+ end
51
+
52
+ private
53
+
54
+ def create_from_code_spec
55
+ @spec = code_spec.dup
56
+ # vendored_frameworks | resources | source | source_files | public_header_files
57
+ # license | resource_bundles
58
+
59
+ # Project Linkin
60
+ @spec.vendored_frameworks = "#{code_spec.root.name}.framework"
61
+
62
+ # Resources
63
+ extnames = []
64
+ extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
65
+ extnames += code_spec_consumer.resources.map { |r| File.basename(r) } if code_spec_consumer.resources.any?
66
+ @spec.resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } } if extnames.any?
67
+
68
+ # Source Location
69
+ @spec.source = binary_source
70
+
71
+ # Source Code
72
+ @spec.source_files = framework_contents('Headers/*')
73
+ @spec.public_header_files = framework_contents('Headers/*')
74
+
75
+ # Unused for binary
76
+ spec_hash = @spec.to_hash
77
+ # spec_hash.delete('license')
78
+ spec_hash.delete('resource_bundles')
79
+ spec_hash.delete('exclude_files')
80
+ spec_hash.delete('preserve_paths')
81
+
82
+ # Filter platforms
83
+ platforms = spec_hash['platforms']
84
+ selected_platforms = platforms.select { |k, v| @platforms.include?(k) }
85
+ spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms
86
+
87
+ @spec = Pod::Specification.from_hash(spec_hash)
88
+ @spec
89
+ end
90
+
91
+ def create_from_code_spec_and_template_spec
92
+ @spec = template_spec.dup
93
+
94
+ @spec.version = code_spec.version
95
+ @spec.source = binary_source
96
+ @spec
97
+ end
98
+
99
+ def binary_source
100
+ { http: CBin.config.binary_download_url % [code_spec.root.name, code_spec.version], type: CBin.config.download_file_type }
101
+ end
102
+
103
+ def code_spec_consumer(platform = :ios)
104
+ code_spec.consumer(:ios)
105
+ end
106
+
107
+ def framework_contents(name)
108
+ ["#{code_spec.root.name}.framework", "#{code_spec.root.name}.framework/Versions/A"].map { |path| "#{path}/#{name}" }
109
+ end
110
+ end
111
+ end
112
112
  end
@@ -4,26 +4,26 @@ require 'cocoapods'
4
4
  module Pod
5
5
  class Installer
6
6
  class Analyzer
7
- # > 1.5.3 版本
8
- # rewrite update_repositories
9
- #
10
- alias_method :old_update_repositories, :update_repositories
7
+ # > 1.5.3 版本
8
+ # rewrite update_repositories
9
+ #
10
+ alias_method :old_update_repositories, :update_repositories
11
11
  def update_repositories
12
- if installation_options.update_source_with_multi_processes
13
- # 并发更新私有源
14
- # 这里多线程会导致 pod update 额外输出 --verbose 的内容
15
- # 不知道为什么?
16
- Parallel.each(sources, in_processes: 4) do |source|
17
- if source.git?
18
- config.sources_manager.update(source.name, true)
19
- else
20
- UI.message "Skipping `#{source.name}` update because the repository is not a git source repository."
21
- end
22
- end
23
- @specs_updated = true
24
- else
25
- old_update_repositories
26
- end
12
+ if installation_options.update_source_with_multi_processes
13
+ # 并发更新私有源
14
+ # 这里多线程会导致 pod update 额外输出 --verbose 的内容
15
+ # 不知道为什么?
16
+ Parallel.each(sources, in_processes: 4) do |source|
17
+ if source.git?
18
+ config.sources_manager.update(source.name, true)
19
+ else
20
+ UI.message "Skipping `#{source.name}` update because the repository is not a git source repository."
21
+ end
22
+ end
23
+ @specs_updated = true
24
+ else
25
+ old_update_repositories
26
+ end
27
27
  end
28
28
  end
29
29
  end
@@ -1,67 +1,67 @@
1
1
  require 'cocoapods'
2
2
 
3
3
  module Pod
4
- class Podfile
5
- USE_BINARIES = 'use_binaries'.freeze
6
- USE_SOURCE_PODS = 'use_source_pods'.freeze
7
- USE_BINARIES_SELECTOR = 'use_binaries_selector'.freeze
8
- # TREAT_DEVELOPMENTS_AS_NORMAL = 'treat_developments_as_normal'.freeze
4
+ class Podfile
5
+ USE_BINARIES = 'use_binaries'.freeze
6
+ USE_SOURCE_PODS = 'use_source_pods'.freeze
7
+ USE_BINARIES_SELECTOR = 'use_binaries_selector'.freeze
8
+ # TREAT_DEVELOPMENTS_AS_NORMAL = 'treat_developments_as_normal'.freeze
9
9
 
10
- module DSL
11
- def use_binaries!(flag = true)
12
- set_internal_hash_value(USE_BINARIES, flag)
13
- end
10
+ module DSL
11
+ def use_binaries!(flag = true)
12
+ set_internal_hash_value(USE_BINARIES, flag)
13
+ end
14
14
 
15
- def use_binaries_with_spec_selector!(&block)
16
- raise Informative, '必须提供选择需要二进制组件的 block !' unless block_given?
15
+ def use_binaries_with_spec_selector!(&block)
16
+ raise Informative, '必须提供选择需要二进制组件的 block !' unless block_given?
17
17
 
18
- set_internal_hash_value(USE_BINARIES_SELECTOR, block)
19
- end
18
+ set_internal_hash_value(USE_BINARIES_SELECTOR, block)
19
+ end
20
20
 
21
- def set_use_source_pods(pods)
22
- hash_pods_use_source = get_internal_hash_value(USE_SOURCE_PODS) || []
23
- hash_pods_use_source += Array(pods)
24
- set_internal_hash_value(USE_SOURCE_PODS, hash_pods_use_source)
25
- end
26
- end
21
+ def set_use_source_pods(pods)
22
+ hash_pods_use_source = get_internal_hash_value(USE_SOURCE_PODS) || []
23
+ hash_pods_use_source += Array(pods)
24
+ set_internal_hash_value(USE_SOURCE_PODS, hash_pods_use_source)
25
+ end
26
+ end
27
27
 
28
- module ENVExecutor
29
- def execute_with_use_binaries(use_binaries, &block)
30
- execute_with_key(USE_BINARIES, -> { use_binaries ? 'true' : 'false' }, &block)
31
- end
28
+ module ENVExecutor
29
+ def execute_with_use_binaries(use_binaries, &block)
30
+ execute_with_key(USE_BINARIES, -> { use_binaries ? 'true' : 'false' }, &block)
31
+ end
32
32
 
33
- def execute_with_key(key, value_returner, &block)
34
- origin_value = ENV[key]
35
- ENV[key] = value_returner.call
33
+ def execute_with_key(key, value_returner, &block)
34
+ origin_value = ENV[key]
35
+ ENV[key] = value_returner.call
36
36
 
37
- yield if block_given?
37
+ yield if block_given?
38
38
 
39
- ENV[key] = origin_value
40
- end
41
- end
39
+ ENV[key] = origin_value
40
+ end
41
+ end
42
42
 
43
- extend ENVExecutor
43
+ extend ENVExecutor
44
44
 
45
- def use_binaries_selector
46
- get_internal_hash_value(USE_BINARIES_SELECTOR, nil)
47
- end
45
+ def use_binaries_selector
46
+ get_internal_hash_value(USE_BINARIES_SELECTOR, nil)
47
+ end
48
48
 
49
- def use_binaries?
50
- get_internal_hash_value(USE_BINARIES, false) || ENV[USE_BINARIES] == 'true'
51
- end
49
+ def use_binaries?
50
+ get_internal_hash_value(USE_BINARIES, false) || ENV[USE_BINARIES] == 'true'
51
+ end
52
52
 
53
- def use_source_pods
54
- get_internal_hash_value(USE_SOURCE_PODS, []) + String(ENV[USE_SOURCE_PODS]).split('|').uniq
55
- end
53
+ def use_source_pods
54
+ get_internal_hash_value(USE_SOURCE_PODS, []) + String(ENV[USE_SOURCE_PODS]).split('|').uniq
55
+ end
56
56
 
57
- private
58
- # set_hash_value 有 key 限制
59
- def set_internal_hash_value(key, value)
60
- internal_hash[key] = value
61
- end
57
+ private
58
+ # set_hash_value 有 key 限制
59
+ def set_internal_hash_value(key, value)
60
+ internal_hash[key] = value
61
+ end
62
62
 
63
- def get_internal_hash_value(key, default = nil)
64
- internal_hash.fetch(key, default)
65
- end
66
- end
63
+ def get_internal_hash_value(key, default = nil)
64
+ internal_hash.fetch(key, default)
65
+ end
66
+ end
67
67
  end
@@ -6,100 +6,100 @@ require 'cocoapods-bin/native/installation_options'
6
6
  require 'cocoapods-bin/gem_version'
7
7
 
8
8
  module Pod
9
- class Resolver
10
- # >= 1.4.0 才有 resolver_specs_by_target 以及 ResolverSpecification
11
- # >= 1.5.0 ResolverSpecification 才有 source,供 install 或者其他操作时,输入 source 变更
12
- #
13
- if Pod.match_version?('~> 1.4')
14
- old_resolver_specs_by_target = instance_method(:resolver_specs_by_target)
15
- define_method(:resolver_specs_by_target) do
16
- specs_by_target = old_resolver_specs_by_target.bind(self).call()
17
-
18
- sources_manager = Config.instance.sources_manager
19
- use_source_pods = podfile.use_source_pods
20
-
21
- missing_binary_specs = []
22
- specs_by_target.each do |target, rspecs|
23
- # use_binaries 并且 use_source_pods 不包含
24
- use_binary_rspecs = if podfile.use_binaries? || podfile.use_binaries_selector
25
- rspecs.select do |rspec|
26
- ([rspec.name, rspec.root.name] & use_source_pods).empty? &&
27
- (podfile.use_binaries_selector.nil? || podfile.use_binaries_selector.call(rspec.spec))
28
- end
29
- else
30
- []
31
- end
32
-
33
- # Parallel.map(rspecs, in_threads: 8) do |rspec|
34
- specs_by_target[target] = rspecs.map do |rspec|
35
- # 含有 subspecs 的组件暂不处理
36
- # next rspec if rspec.spec.subspec? || rspec.spec.subspecs.any?
37
-
38
- # developments 组件采用默认输入的 spec (development pods 的 source 为 nil)
39
- next rspec unless rspec.spec.respond_to?(:spec_source) && rspec.spec.spec_source
40
-
41
- # 采用二进制依赖并且不为开发组件
42
- use_binary = use_binary_rspecs.include?(rspec)
43
- source = use_binary ? sources_manager.binary_source : sources_manager.code_source
44
-
45
- spec_version = rspec.spec.version
46
- begin
47
- # 从新 source 中获取 spec
48
- specification = source.specification(rspec.root.name, spec_version)
49
-
50
- # 组件是 subspec
51
- specification = specification.subspec_by_name(rspec.name, false, true) if rspec.spec.subspec?
52
- # 这里可能出现分析依赖的 source 和切换后的 source 对应 specification 的 subspec 对应不上
53
- # 造成 subspec_by_name 返回 nil,这个是正常现象
54
- next unless specification
55
-
56
- # 组装新的 rspec ,替换原 rspec
57
- rspec = if Pod.match_version?('~> 1.4.0')
58
- ResolverSpecification.new(specification, rspec.used_by_tests_only)
59
- else
60
- ResolverSpecification.new(specification, rspec.used_by_tests_only, source)
61
- end
62
- rspec
63
- rescue Pod::StandardError => error
64
- # 没有从新的 source 找到对应版本组件,直接返回原 rspec
65
- missing_binary_specs << rspec.spec if use_binary
66
- rspec
67
- end
68
-
69
- rspec
70
- end.compact
71
- end
72
-
73
- missing_binary_specs.uniq.each do |spec|
74
- UI.message "【#{spec.name} | #{spec.version}】组件无对应二进制版本 , 将采用源码依赖."
75
- end if missing_binary_specs.any?
76
-
77
- specs_by_target
78
- end
79
- end
80
- end
81
-
82
- if Pod.match_version?('~> 1.4.0')
83
- # 1.4.0 没有 spec_source
84
- class Specification
85
- class Set
86
- class LazySpecification < BasicObject
87
- attr_reader :spec_source
88
-
89
- old_initialize = instance_method(:initialize)
90
- define_method(:initialize) do |name, version, source|
91
- old_initialize.bind(self).call(name, version, source)
92
-
93
- @spec_source = source
94
- end
95
-
96
- def respond_to?(method, include_all = false)
97
- return super unless method == :spec_source
98
- true
99
- end
100
- end
101
- end
102
- end
103
- end
9
+ class Resolver
10
+ # >= 1.4.0 才有 resolver_specs_by_target 以及 ResolverSpecification
11
+ # >= 1.5.0 ResolverSpecification 才有 source,供 install 或者其他操作时,输入 source 变更
12
+ #
13
+ if Pod.match_version?('~> 1.4')
14
+ old_resolver_specs_by_target = instance_method(:resolver_specs_by_target)
15
+ define_method(:resolver_specs_by_target) do
16
+ specs_by_target = old_resolver_specs_by_target.bind(self).call()
17
+
18
+ sources_manager = Config.instance.sources_manager
19
+ use_source_pods = podfile.use_source_pods
20
+
21
+ missing_binary_specs = []
22
+ specs_by_target.each do |target, rspecs|
23
+ # use_binaries 并且 use_source_pods 不包含
24
+ use_binary_rspecs = if podfile.use_binaries? || podfile.use_binaries_selector
25
+ rspecs.select do |rspec|
26
+ ([rspec.name, rspec.root.name] & use_source_pods).empty? &&
27
+ (podfile.use_binaries_selector.nil? || podfile.use_binaries_selector.call(rspec.spec))
28
+ end
29
+ else
30
+ []
31
+ end
32
+
33
+ # Parallel.map(rspecs, in_threads: 8) do |rspec|
34
+ specs_by_target[target] = rspecs.map do |rspec|
35
+ # 含有 subspecs 的组件暂不处理
36
+ # next rspec if rspec.spec.subspec? || rspec.spec.subspecs.any?
37
+
38
+ # developments 组件采用默认输入的 spec (development pods 的 source 为 nil)
39
+ next rspec unless rspec.spec.respond_to?(:spec_source) && rspec.spec.spec_source
40
+
41
+ # 采用二进制依赖并且不为开发组件
42
+ use_binary = use_binary_rspecs.include?(rspec)
43
+ source = use_binary ? sources_manager.binary_source : sources_manager.code_source
44
+
45
+ spec_version = rspec.spec.version
46
+ begin
47
+ # 从新 source 中获取 spec
48
+ specification = source.specification(rspec.root.name, spec_version)
49
+
50
+ # 组件是 subspec
51
+ specification = specification.subspec_by_name(rspec.name, false, true) if rspec.spec.subspec?
52
+ # 这里可能出现分析依赖的 source 和切换后的 source 对应 specification 的 subspec 对应不上
53
+ # 造成 subspec_by_name 返回 nil,这个是正常现象
54
+ next unless specification
55
+
56
+ # 组装新的 rspec ,替换原 rspec
57
+ rspec = if Pod.match_version?('~> 1.4.0')
58
+ ResolverSpecification.new(specification, rspec.used_by_tests_only)
59
+ else
60
+ ResolverSpecification.new(specification, rspec.used_by_tests_only, source)
61
+ end
62
+ rspec
63
+ rescue Pod::StandardError => error
64
+ # 没有从新的 source 找到对应版本组件,直接返回原 rspec
65
+ missing_binary_specs << rspec.spec if use_binary
66
+ rspec
67
+ end
68
+
69
+ rspec
70
+ end.compact
71
+ end
72
+
73
+ missing_binary_specs.uniq.each do |spec|
74
+ UI.message "【#{spec.name} | #{spec.version}】组件无对应二进制版本 , 将采用源码依赖."
75
+ end if missing_binary_specs.any?
76
+
77
+ specs_by_target
78
+ end
79
+ end
80
+ end
81
+
82
+ if Pod.match_version?('~> 1.4.0')
83
+ # 1.4.0 没有 spec_source
84
+ class Specification
85
+ class Set
86
+ class LazySpecification < BasicObject
87
+ attr_reader :spec_source
88
+
89
+ old_initialize = instance_method(:initialize)
90
+ define_method(:initialize) do |name, version, source|
91
+ old_initialize.bind(self).call(name, version, source)
92
+
93
+ @spec_source = source
94
+ end
95
+
96
+ def respond_to?(method, include_all = false)
97
+ return super unless method == :spec_source
98
+ true
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
104
  end
105
105
 
@@ -1,11 +1,11 @@
1
1
  require 'cocoapods-bin/native/sources_manager'
2
2
 
3
3
  Pod::HooksManager.register('cocoapods-bin', :source_provider) do |context, _|
4
- sources_manager = Pod::Config.instance.sources_manager
5
- podfile = Pod::Config.instance.podfile
4
+ sources_manager = Pod::Config.instance.sources_manager
5
+ podfile = Pod::Config.instance.podfile
6
6
 
7
- # 添加二进制私有源 && 源码私有源
8
- added_sources = [sources_manager.code_source, sources_manager.binary_source]
9
- added_sources.reverse! if podfile.use_binaries? || podfile.use_binaries_selector
10
- added_sources.each { |source| context.add_source(source) }
7
+ # 添加二进制私有源 && 源码私有源
8
+ added_sources = [sources_manager.code_source, sources_manager.binary_source]
9
+ added_sources.reverse! if podfile.use_binaries? || podfile.use_binaries_selector
10
+ added_sources.each { |source| context.add_source(source) }
11
11
  end
@@ -1,5 +1,5 @@
1
1
  module Pod
2
- class Specification
3
- VALID_EXTNAME = %w[.binary.podspec.json .binary.podspec .podspec.json .podspec]
4
- end
2
+ class Specification
3
+ VALID_EXTNAME = %w[.binary.podspec.json .binary.podspec .podspec.json .podspec]
4
+ end
5
5
  end