CocoaPods是iOS平台上非常优秀的模块化集成方案,它允许开发者通过编写合适的podspec文件来提供自己模块的信息。CocoaPods通过Podfile文件将不同的模块集成在一起,并自动解决各模块之间的依赖问题。如果你还没有尝试过CocoaPods方案,建议你现在就开始了解CocoaPods,它一定能节省你的不少时间。
pod package
CocoaPods支持各种插件和扩展,pod package是常用的打包插件,它支持通过podspec将源码打包成二进制库。
安装pod package:
sudo gem install cocoapods-packager
典型的使用示例如下:
pod package kanchuan.podspec --force --embedded --no-mangle --exclude-deps --verbose
各个参数的含义可以通过pod package --help
了解。
pod package的不足
对于一般的开发,pod package
足够满足,但笔者遇到的需求是要能在编译过程中添加定制参数,此时pod package就无法满足了。pod package将xcodebuild的执行完全隐藏,这样虽然简化了使用,但也给一些需要自定义的场景带来了麻烦。pod package目前的版本至少无法完成下面两个事情:
- 修改toolchain
pod package中调用xcodebuild使用的是默认的toolchain工具,没有参数可以修改。
- 打印编译过程
xcodebuild执行过程中的详细日志并没有打印出来,无法通过日志查看编译过程,即使使用--verbose也显示不了xcodebuild的日志。
pod package增强
pod package插件的源代码:
https://github.com/CocoaPods/cocoapods-packager.git
当安装pod package后,实际上代码会被安装到:
/Library/Ruby/Gems/2.6.0/gems/cocoapods-packager-1.5.0/
#版本不同路径有差别
影响pod package的参数及编译过程的代码涉及到两个文件:
lib/pod/command/package.rb
lib/cocoapods-packager/builder.rb
支持自定义参数
以支持--toolchain参数为例,修改package.rb:
def self.options
....
['--toolchain', 'xcodebuild toolchain'],
end
def initialize(argv)
....
@toolchain = argv.option('toolchain', '')
end
def perform_build(
...
builder = Pod::Builder.new(
....
@toolchain
)
end
自定义xcodebuild
package.rb中增加了toolchain参数后,需要传递给Pod::Builder。builder.rb文件修改:
def initialize(..., toolchain)
...
@toolchain = toolchain
end
def xcodebuild(...)
UI.puts("BUILD_CONFIG: toolchain = #{@toolchain}; #{defines} #{args} #{config}")
if @toolchain != ""
#指定toolchain
command = "xcodebuild -toolchain #{@toolchain} #{defines} #{args} CONFIGURATION_BUILD_DIR=#{build_dir} clean build -configuration #{config} -target #{target} -project #{project_root}/Pods.xcodeproj 2>&1"
else
command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{build_dir} clean build -configuration #{config} -target #{target} -project #{project_root}/Pods.xcodeproj 2>&1"
end
output = `#{command}`.lines.to_a
#将xcodebuild输出打印
puts UI::BuildFailedReport.report(command, output)
end
以上修改完成之后,pod package就支持通过toolchain参数指定toolchain工具了:
pod package kanchuan.podspec --force --embedded --no-mangle --exclude-deps --spec-sources="" --verbose —toolchain=com.kanchuan.toolchain
使用同样的方式,可以添加定制其他需要的参数。
留言板