lib/cocoapods-tdfire-binary/command/package.rb in cocoapods-tdfire-binary-1.0.10 vs lib/cocoapods-tdfire-binary/command/package.rb in cocoapods-tdfire-binary-1.1.0
- old
+ new
@@ -17,42 +17,83 @@
def self.options
[
['--clean', '执行成功后,删除 zip 文件外的所有生成文件'],
['--spec-sources', '私有源地址'],
# ['--local', '使用本地代码'],
- ['--use-carthage', 'carthage使用carthage进行打包'],
+ ['--use-carthage', 'carthage使用carthage进行打包,三方库提供carthage的优先'],
+ ['--subspecs', '打包子组件']
].concat(super)
end
def initialize(argv)
@clean = argv.flag?('clean')
@local = argv.flag?('local')
@use_carthage = argv.flag?('use-carthage')
@spec_sources = argv.option('spec-sources')
+ @subspecs= argv.option('subspecs')
@spec_file = first_podspec
super
end
def validate!
super
help! '当前目录下没有podspec文件.' if @spec_file.nil?
end
def run
- # 组件有多个 platform 时,限制 cocoapods-packager 只打 ios 代码
- Pod::Tdfire::BinaryStateStore.limit_platform = true
-
- spec = Specification.from_file(@spec_file)
- prepare(spec)
- package(spec)
- zip(spec)
-
- Pod::Tdfire::BinaryStateStore.limit_platform = false
+ if @use_carthage
+ build_by_carthage
+ else
+ build_by_pod_packager
+ end
end
private
+ def build_by_pod_packager
+ # 组件有多个 platform 时,限制 cocoapods-packager 只打 ios 代码
+ Pod::Tdfire::BinaryStateStore.limit_platform = true
+ spec = Specification.from_file(@spec_file)
+ prepare(spec)
+ package(spec)
+ zip_packager_framework(spec)
+
+ Pod::Tdfire::BinaryStateStore.limit_platform = false
+ end
+
+ def build_by_carthage
+ build_script = <<-EOF
+if [[ -d swift-staticlibs ]]; then
+ rm -fr swift-staticlibs
+fi
+
+if [[ ! $(command -v carthage) ]]; then
+ brew install carthage
+fi
+
+git clone git@git.2dfire-inc.com:cocoapods-repos/swift-staticlibs.git
+
+xcconfig=$(mktemp /tmp/static.xcconfig.XXXXXX)
+trap 'rm -f "$xcconfig"' INT TERM HUP EXIT
+
+echo "LD = $PWD/swift-staticlibs/ld.py" >> $xcconfig
+echo "DEBUG_INFORMATION_FORMAT = dwarf" >> $xcconfig
+
+export XCODE_XCCONFIG_FILE="$xcconfig"
+
+carthage build "$@" --no-skip-current --platform iOS
+
+rm -fr swift-staticlibs
+ EOF
+
+ system build_script
+
+ spec = Specification.from_file(@spec_file)
+ zip_carthage_framework(spec)
+ end
+
+
def prepare(spec)
UI.section("Tdfire: prepare for packaging ...") do
clean(spec)
end
end
@@ -66,50 +107,69 @@
"--no-mangle",
"--spec-sources=#{@spec_sources || Pod::Tdfire::BinaryUrlManager.private_cocoapods_url}",
]
argvs << "--local" if @local
+ argvs << "--subspecs=#{@subspecs}" unless @subspecs.nil?
package = Pod::Command::Package.new(CLAide::ARGV.new(argvs))
package.validate!
package.run
end
end
- def zip(spec)
+ def zip_packager_framework(spec)
framework_directory = "#{spec.name}-#{spec.version}/ios"
framework_name = "#{spec.name}.framework"
framework_path = "#{framework_directory}/#{framework_name}"
raise Informative, "没有需要压缩的 framework 文件:#{framework_path}" unless File.exist?(framework_path)
# cocoapods-packager 使用了 --exclude-deps 后,虽然没有把 dependency 的符号信息打进可执行文件,但是它把 dependency 的 bundle 给拷贝过来了 (builder.rb 229 copy_resources)
# 这里把多余的 bundle 删除
# https://github.com/CocoaPods/cocoapods-packager/pull/199
resource_bundles = spec.tdfire_recursive_value('resource_bundles').map(&:keys).flatten.uniq
+ resources= spec.tdfire_recursive_value('resources').map { |r| r.split('/').last }
FileUtils.chdir("#{framework_path}/Versions/A/Resources") do
- dependency_bundles = Dir.glob('*.bundle').select { |b| !resource_bundles.include?(b.split('.').first) }
+ dependency_bundles = Dir.glob('*.bundle').select do |b|
+ !resource_bundles.include?(b.split('.').first) && !resources.include?(b)
+ end
unless dependency_bundles.empty?
Pod::UI::puts "Tdfire: remove dependency bundles: #{dependency_bundles.join(', ')}"
dependency_bundles.each do |b|
FileUtils.rm_rf(b)
end
end
end if File.exist? "#{framework_path}/Versions/A/Resources"
- output_name = "#{framework_name}.zip"
- UI.section("Tdfire: zip #{framework_path} ...") do
+ zip_framework(spec, framework_directory)
+
+ clean(spec) if @clean
+ end
+
+ def zip_carthage_framework(spec)
+ framework_directory = "Carthage/Build/iOS"
+ framework_name = "#{spec.name}.framework"
+ framework_path = "#{framework_directory}/#{framework_name}"
+
+ raise Informative, "没有需要压缩的 framework 文件:#{framework_path}" unless File.exist?(framework_path)
+
+ zip_framework(spec, framework_directory)
+ end
+
+ def zip_framework(spec, framework_directory)
+ framework_name = "#{spec.name}.framework"
+ output_name = "#{framework_name}.zip"
+ UI.section("Tdfire: zip #{framework_directory}/#{framework_name} ...") do
FileUtils.chdir(framework_directory) do
system "zip --symlinks -r #{output_name} #{framework_name}"
- system "mv #{output_name} ../../"
+ system "mv #{output_name} #{framework_directory.split('/').count.times.reduce("") { |r, n| r + "../" }}"
end
end
Pod::UI::puts "Tdfire: save framework zip file to #{Dir.pwd}/#{output_name}".green
-
- clean(spec) if @clean
- end
+ end
def clean(spec)
file = "#{spec.name}-#{spec.version}"
UI.message "Tdfire: cleaning #{file}"
\ No newline at end of file