cocoapods-miBin 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rakeTasks +7 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +104 -0
- data/LICENSE.txt +22 -0
- data/README.md +522 -0
- data/Rakefile +13 -0
- data/cocoapods-miBin.gemspec +27 -0
- data/lib/cocoapods-miBin.rb +4 -0
- data/lib/cocoapods-miBin/command.rb +3 -0
- data/lib/cocoapods-miBin/command/bin.rb +60 -0
- data/lib/cocoapods-miBin/command/bin/archive.rb +134 -0
- data/lib/cocoapods-miBin/command/bin/init.rb +71 -0
- data/lib/cocoapods-miBin/command/bin/lib.rb +14 -0
- data/lib/cocoapods-miBin/command/bin/lib/lint.rb +69 -0
- data/lib/cocoapods-miBin/command/bin/list.rb +50 -0
- data/lib/cocoapods-miBin/command/bin/open.rb +61 -0
- data/lib/cocoapods-miBin/command/bin/repo.rb +15 -0
- data/lib/cocoapods-miBin/command/bin/repo/push.rb +116 -0
- data/lib/cocoapods-miBin/command/bin/repo/update.rb +42 -0
- data/lib/cocoapods-miBin/command/bin/search.rb +69 -0
- data/lib/cocoapods-miBin/command/bin/spec.rb +15 -0
- data/lib/cocoapods-miBin/command/bin/spec/create.rb +75 -0
- data/lib/cocoapods-miBin/command/bin/spec/lint.rb +111 -0
- data/lib/cocoapods-miBin/command/bin/umbrella.rb +55 -0
- data/lib/cocoapods-miBin/config/config.rb +81 -0
- data/lib/cocoapods-miBin/config/config_asker.rb +58 -0
- data/lib/cocoapods-miBin/gem_version.rb +11 -0
- data/lib/cocoapods-miBin/helpers.rb +5 -0
- data/lib/cocoapods-miBin/helpers/framework.rb +64 -0
- data/lib/cocoapods-miBin/helpers/framework_builder.rb +227 -0
- data/lib/cocoapods-miBin/helpers/sources_helper.rb +33 -0
- data/lib/cocoapods-miBin/helpers/spec_creator.rb +159 -0
- data/lib/cocoapods-miBin/helpers/spec_files_helper.rb +77 -0
- data/lib/cocoapods-miBin/native.rb +21 -0
- data/lib/cocoapods-miBin/native/acknowledgements.rb +27 -0
- data/lib/cocoapods-miBin/native/analyzer.rb +53 -0
- data/lib/cocoapods-miBin/native/installation_options.rb +26 -0
- data/lib/cocoapods-miBin/native/installer.rb +116 -0
- data/lib/cocoapods-miBin/native/linter.rb +26 -0
- data/lib/cocoapods-miBin/native/path_source.rb +33 -0
- data/lib/cocoapods-miBin/native/pod_source_installer.rb +19 -0
- data/lib/cocoapods-miBin/native/pod_target.rb +8 -0
- data/lib/cocoapods-miBin/native/podfile.rb +79 -0
- data/lib/cocoapods-miBin/native/podfile_env.rb +36 -0
- data/lib/cocoapods-miBin/native/podspec_finder.rb +25 -0
- data/lib/cocoapods-miBin/native/resolver.rb +200 -0
- data/lib/cocoapods-miBin/native/sandbox_analyzer.rb +34 -0
- data/lib/cocoapods-miBin/native/source.rb +35 -0
- data/lib/cocoapods-miBin/native/sources_manager.rb +20 -0
- data/lib/cocoapods-miBin/native/specification.rb +31 -0
- data/lib/cocoapods-miBin/native/validator.rb +16 -0
- data/lib/cocoapods-miBin/source_provider_hook.rb +21 -0
- data/lib/cocoapods_plugin.rb +5 -0
- data/spec/command/bin_spec.rb +12 -0
- data/spec/spec_helper.rb +50 -0
- metadata +173 -0
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'cocoapods-miBin/gem_version.rb'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'cocoapods-miBin'
|
8
|
+
spec.version = CBin::VERSION
|
9
|
+
spec.authors = ['zhangyanbin']
|
10
|
+
spec.email = ['zhangyanbin@xiaomi.com']
|
11
|
+
spec.description = %q{cocoapods-miBin is a plugin which helps develpers switching pods between source code and binary.}
|
12
|
+
spec.summary = %q{cocoapods-miBin is a plugin which helps develpers switching pods between source code and binary.}
|
13
|
+
spec.homepage = 'https://github.com/zhangjianbin/cocoapods-bin.git'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
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_dependency 'parallel'
|
22
|
+
spec.add_dependency 'cocoapods', '~> 1.4'
|
23
|
+
spec.add_dependency 'cocoapods-generate', '~> 1.4'
|
24
|
+
|
25
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
26
|
+
spec.add_development_dependency 'rake'
|
27
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cocoapods-miBin/command/bin/init'
|
4
|
+
require 'cocoapods-miBin/command/bin/spec'
|
5
|
+
require 'cocoapods-miBin/command/bin/lib'
|
6
|
+
require 'cocoapods-miBin/command/bin/repo'
|
7
|
+
require 'cocoapods-miBin/command/bin/open'
|
8
|
+
require 'cocoapods-miBin/command/bin/search'
|
9
|
+
require 'cocoapods-miBin/command/bin/list'
|
10
|
+
require 'cocoapods-miBin/command/bin/archive'
|
11
|
+
require 'cocoapods-miBin/command/bin/umbrella'
|
12
|
+
require 'cocoapods-miBin/helpers'
|
13
|
+
|
14
|
+
module Pod
|
15
|
+
class Command
|
16
|
+
# This is an example of a cocoapods plugin adding a top-level subcommand
|
17
|
+
# to the 'pod' command.
|
18
|
+
#
|
19
|
+
# You can also create subcommands of existing or new commands. Say you
|
20
|
+
# wanted to add a subcommand to `list` to show newly deprecated pods,
|
21
|
+
# (e.g. `pod list deprecated`), there are a few things that would need
|
22
|
+
# to change.
|
23
|
+
#
|
24
|
+
# - move this file to `lib/pod/command/list/deprecated.rb` and update
|
25
|
+
# the class to exist in the the Pod::Command::List namespace
|
26
|
+
# - change this class to extend from `List` instead of `Command`. This
|
27
|
+
# tells the plugin system that it is a subcommand of `list`.
|
28
|
+
# - edit `lib/cocoapods_plugins.rb` to require this file
|
29
|
+
#
|
30
|
+
# @todo Create a PR to add your plugin to CocoaPods/cocoapods.org
|
31
|
+
# in the `plugins.json` file, once your plugin is released.
|
32
|
+
#
|
33
|
+
class Bin < Command
|
34
|
+
include CBin::SourcesHelper
|
35
|
+
include CBin::SpecFilesHelper
|
36
|
+
|
37
|
+
self.abstract_command = true
|
38
|
+
|
39
|
+
self.default_subcommand = 'open'
|
40
|
+
self.summary = '组件二进制化插件.'
|
41
|
+
self.description = <<-DESC
|
42
|
+
组件二进制化插件。利用源码私有源与二进制私有源实现对组件依赖类型的切换。
|
43
|
+
DESC
|
44
|
+
|
45
|
+
def initialize(argv)
|
46
|
+
require 'cocoapods-miBin/native'
|
47
|
+
|
48
|
+
@help = argv.flag?('help')
|
49
|
+
super
|
50
|
+
end
|
51
|
+
|
52
|
+
def validate!
|
53
|
+
super
|
54
|
+
# 这里由于 --help 是在 validate! 方法中提取的,会导致 --help 失效
|
55
|
+
# pod lib create 也有这个问题
|
56
|
+
banner! if @help
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cocoapods-miBin/native/podfile'
|
4
|
+
require 'cocoapods/command/gen'
|
5
|
+
require 'cocoapods/generate'
|
6
|
+
require 'cocoapods-miBin/helpers/framework_builder'
|
7
|
+
|
8
|
+
module Pod
|
9
|
+
class Command
|
10
|
+
class Bin < Command
|
11
|
+
class Archive < Bin
|
12
|
+
self.summary = '将组件归档为静态 framework.'
|
13
|
+
self.description = <<-DESC
|
14
|
+
将组件归档为静态 framework,仅支持 iOS 平台
|
15
|
+
此静态 framework 不包含依赖组件的 symbol
|
16
|
+
DESC
|
17
|
+
|
18
|
+
def self.options
|
19
|
+
[
|
20
|
+
['--code-dependencies', '使用源码依赖'],
|
21
|
+
['--allow-prerelease', '允许使用 prerelease 的版本'],
|
22
|
+
['--no-clean', '保留构建中间产物'],
|
23
|
+
['--no-zip', '不压缩静态 framework 为 zip']
|
24
|
+
].concat(Pod::Command::Gen.options).concat(super).uniq
|
25
|
+
end
|
26
|
+
|
27
|
+
self.arguments = [
|
28
|
+
CLAide::Argument.new('NAME.podspec', false)
|
29
|
+
]
|
30
|
+
|
31
|
+
def initialize(argv)
|
32
|
+
@code_dependencies = argv.flag?('code-dependencies')
|
33
|
+
@allow_prerelease = argv.flag?('allow-prerelease')
|
34
|
+
@clean = argv.flag?('clean', true)
|
35
|
+
@zip = argv.flag?('zip', true)
|
36
|
+
@sources = argv.option('sources') || []
|
37
|
+
@platform = Platform.new(:ios)
|
38
|
+
super
|
39
|
+
|
40
|
+
@additional_args = argv.remainder!
|
41
|
+
end
|
42
|
+
|
43
|
+
def run
|
44
|
+
@spec = Specification.from_file(spec_file)
|
45
|
+
generate_project
|
46
|
+
build_static_framework
|
47
|
+
zip_static_framework if @zip
|
48
|
+
clean_workspace if @clean
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def generate_project
|
54
|
+
Podfile.execute_with_bin_plugin do
|
55
|
+
Podfile.execute_with_allow_prerelease(@allow_prerelease) do
|
56
|
+
Podfile.execute_with_use_binaries(!@code_dependencies) do
|
57
|
+
argvs = [
|
58
|
+
"--sources=#{sources_option(@code_dependencies, @sources)}",
|
59
|
+
"--gen-directory=#{gen_name}",
|
60
|
+
'--clean',
|
61
|
+
*@additional_args
|
62
|
+
]
|
63
|
+
|
64
|
+
argvs << spec_file if spec_file
|
65
|
+
|
66
|
+
gen = Pod::Command::Gen.new(CLAide::ARGV.new(argvs))
|
67
|
+
gen.validate!
|
68
|
+
gen.run
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def zip_static_framework
|
75
|
+
output_name = "#{binary_name}.zip"
|
76
|
+
unless File.exist?(binary_name)
|
77
|
+
raise Informative, "没有需要压缩的 framework 文件:#{binary_name}"
|
78
|
+
end
|
79
|
+
|
80
|
+
UI.puts "Compressing #{binary_name} into #{output_name}"
|
81
|
+
|
82
|
+
`zip --symlinks -r #{output_name} #{binary_name}`
|
83
|
+
end
|
84
|
+
|
85
|
+
def build_static_framework
|
86
|
+
source_dir = Dir.pwd
|
87
|
+
file_accessor = Sandbox::FileAccessor.new(Pathname.new('.').expand_path, @spec.consumer(@platform))
|
88
|
+
Dir.chdir(workspace_directory) do
|
89
|
+
builder = CBin::Framework::Builder.new(@spec, file_accessor, @platform, source_dir)
|
90
|
+
builder.build
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def clean_workspace
|
95
|
+
UI.puts 'Cleaning workspace'
|
96
|
+
|
97
|
+
FileUtils.rm_rf(gen_name)
|
98
|
+
FileUtils.rm_rf(binary_name) if @zip
|
99
|
+
end
|
100
|
+
|
101
|
+
def gen_name
|
102
|
+
'bin-archive'
|
103
|
+
end
|
104
|
+
|
105
|
+
def framework_name
|
106
|
+
"#{@spec.name}.framework"
|
107
|
+
end
|
108
|
+
|
109
|
+
def binary_name
|
110
|
+
"#{@spec.name}_binary"
|
111
|
+
end
|
112
|
+
|
113
|
+
def workspace_directory
|
114
|
+
File.expand_path("./#{gen_name}/#{@spec.name}")
|
115
|
+
end
|
116
|
+
|
117
|
+
def spec_file
|
118
|
+
@spec_file ||= begin
|
119
|
+
if @podspec
|
120
|
+
find_spec_file(@podspec)
|
121
|
+
else
|
122
|
+
if code_spec_files.empty?
|
123
|
+
raise Informative, '当前目录下没有找到可用源码 podspec.'
|
124
|
+
end
|
125
|
+
|
126
|
+
spec_file = code_spec_files.first
|
127
|
+
spec_file
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cocoapods-miBin/config/config_asker'
|
4
|
+
|
5
|
+
module Pod
|
6
|
+
class Command
|
7
|
+
class Bin < Command
|
8
|
+
class Init < Bin
|
9
|
+
self.summary = '初始化插件.'
|
10
|
+
self.description = <<-DESC
|
11
|
+
创建 #{CBin.config.config_file} 文件,在其中保存插件需要的配置信息,
|
12
|
+
如二进制私有源地址、源码私有源地址等。
|
13
|
+
DESC
|
14
|
+
|
15
|
+
def self.options
|
16
|
+
[
|
17
|
+
['--bin-url=URL', '配置文件地址,直接从此地址下载配置文件']
|
18
|
+
].concat(super)
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(argv)
|
22
|
+
@bin_url = argv.option('bin-url')
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def run
|
27
|
+
if @bin_url.nil?
|
28
|
+
config_with_asker
|
29
|
+
else
|
30
|
+
config_with_url(@bin_url)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def config_with_url(url)
|
37
|
+
require 'open-uri'
|
38
|
+
|
39
|
+
UI.puts "开始下载配置文件...\n"
|
40
|
+
file = open(url)
|
41
|
+
contents = YAML.safe_load(file.read)
|
42
|
+
|
43
|
+
UI.puts "开始同步配置文件...\n"
|
44
|
+
CBin.config.sync_config(contents.to_hash)
|
45
|
+
UI.puts "设置完成.\n".green
|
46
|
+
rescue Errno::ENOENT => e
|
47
|
+
raise Informative, "配置文件路径 #{url} 无效,请确认后重试."
|
48
|
+
end
|
49
|
+
|
50
|
+
def config_with_asker
|
51
|
+
asker = CBin::Config::Asker.new
|
52
|
+
asker.wellcome_message
|
53
|
+
|
54
|
+
config = {}
|
55
|
+
template_hash = CBin.config.template_hash
|
56
|
+
template_hash.each do |k, v|
|
57
|
+
default = begin
|
58
|
+
CBin.config.send(k)
|
59
|
+
rescue StandardError
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
config[k] = asker.ask_with_answer(v[:description], default, v[:selection])
|
63
|
+
end
|
64
|
+
|
65
|
+
CBin.config.sync_config(config)
|
66
|
+
asker.done_message
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cocoapods-miBin/config/config'
|
4
|
+
require 'cocoapods-miBin/native/podfile'
|
5
|
+
|
6
|
+
module Pod
|
7
|
+
class Command
|
8
|
+
class Bin < Command
|
9
|
+
class Lib < Bin
|
10
|
+
class Lint < Lib
|
11
|
+
self.summary = 'lint 组件.'
|
12
|
+
self.description = <<-DESC
|
13
|
+
lint 二进制组件 / 源码组件
|
14
|
+
DESC
|
15
|
+
|
16
|
+
self.arguments = [
|
17
|
+
CLAide::Argument.new('NAME.podspec', false)
|
18
|
+
]
|
19
|
+
|
20
|
+
# lib lint 不会下载 source,所以不能进行二进制 lint
|
21
|
+
# 要 lint 二进制版本,需要进行 spec lint,此 lint 会去下载 source
|
22
|
+
def self.options
|
23
|
+
[
|
24
|
+
['--code-dependencies', '使用源码依赖进行 lint'],
|
25
|
+
['--loose-options', '添加宽松的 options, 包括 --use-libraries (可能会造成 entry point (start) undefined)'],
|
26
|
+
['--allow-prerelease', '允许使用 prerelease 的版本 lint']
|
27
|
+
].concat(Pod::Command::Lib::Lint.options).concat(super).uniq
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(argv)
|
31
|
+
@loose_options = argv.flag?('loose-options')
|
32
|
+
@code_dependencies = argv.flag?('code-dependencies')
|
33
|
+
@sources = argv.option('sources') || []
|
34
|
+
@allow_prerelease = argv.flag?('allow-prerelease')
|
35
|
+
@podspec = argv.shift_argument
|
36
|
+
super
|
37
|
+
|
38
|
+
@additional_args = argv.remainder!
|
39
|
+
end
|
40
|
+
|
41
|
+
def run
|
42
|
+
Podfile.execute_with_bin_plugin do
|
43
|
+
Podfile.execute_with_allow_prerelease(@allow_prerelease) do
|
44
|
+
Podfile.execute_with_use_binaries(!@code_dependencies) do
|
45
|
+
argvs = [
|
46
|
+
@podspec || code_spec_files.first,
|
47
|
+
"--sources=#{sources_option(@code_dependencies, @sources)}",
|
48
|
+
*@additional_args
|
49
|
+
]
|
50
|
+
|
51
|
+
if @loose_options
|
52
|
+
argvs << '--allow-warnings'
|
53
|
+
if code_spec&.all_dependencies&.any?
|
54
|
+
argvs << '--use-libraries'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
lint = Pod::Command::Lib::Lint.new(CLAide::ARGV.new(argvs))
|
59
|
+
lint.validate!
|
60
|
+
lint.run
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
class Command
|
5
|
+
class Bin < Command
|
6
|
+
class List < Bin
|
7
|
+
self.summary = '展示二进制 pods .'
|
8
|
+
|
9
|
+
def self.options
|
10
|
+
[
|
11
|
+
['--code', '展示源码 pods'],
|
12
|
+
['--diff', '展示缺少二进制版本的源码 pods'],
|
13
|
+
['--update', '展示前执行 `pod bin repo update`']
|
14
|
+
].concat(super)
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(argv)
|
18
|
+
@update = argv.flag?('update')
|
19
|
+
@code = argv.flag?('code')
|
20
|
+
@diff = argv.flag?('diff')
|
21
|
+
super
|
22
|
+
end
|
23
|
+
|
24
|
+
def run
|
25
|
+
update_if_necessary!
|
26
|
+
|
27
|
+
source = @code ? code_source : binary_source
|
28
|
+
|
29
|
+
sets = if @diff
|
30
|
+
binary_pod_set_names = binary_source.pod_sets.map(&:name)
|
31
|
+
sets = code_source.pod_sets.reject { |set| binary_pod_set_names.include?(set.name) }
|
32
|
+
else
|
33
|
+
source.pod_sets
|
34
|
+
end
|
35
|
+
|
36
|
+
sets.each { |set| UI.pod(set, :name_and_version) }
|
37
|
+
UI.puts "\n#{sets.count} pods were found"
|
38
|
+
end
|
39
|
+
|
40
|
+
def update_if_necessary!
|
41
|
+
if @update
|
42
|
+
UI.section("\nUpdating Spec Repositories\n".yellow) do
|
43
|
+
Pod::Command::Bin::Repo::Update.new(CLAide::ARGV.new([])).run
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|