pod package的不足和改进

CocoaPods支持各种插件和扩展,pod package是常用的打包插件,它支持通过podspec将源码打包成二进制库,但它本身支持的命令比较少,在特殊要求的场合需要进行改进。

CocoaPods是iOS平台上非常优秀的模块化集成方案,它允许开发者通过编写合适的podspec文件来提供自己模块的信息。CocoaPods通过Podfile文件将不同的模块集成在一起,并自动解决各模块之间的依赖问题。如果你还没有尝试过CocoaPods方案,建议你现在就开始了解CocoaPods,它一定能节省你的不少时间。

pod package

CocoaPods支持各种插件和扩展,pod package是常用的打包插件,它支持通过podspec将源码打包成二进制库。

安装pod package:

sudo gem install cocoapods-packager

典型的使用示例如下:

pod package easeapi.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 easeapi.podspec --force --embedded --no-mangle --exclude-deps --spec-sources="" --verbose —toolchain=com.easeapi.toolchain

使用同样的方式,可以添加定制其他需要的参数。

其它文章

iOS TestFlight的局限性及改进措施
iOS APP灰度发布方案
iOS 13 Scene Delegate and multiple windows
iOS Sign With Apple实践