简而言之,这一次是通过修改 Podfile 文件内容来实现动态修改 pod 模块的全局宏定义(Preprocessor Macros)。
Cocoapods 模块化架构中,子模块使用到一个全局宏定义,但是这个全局宏定义是动态的,还不能在 podspec 文件中这样子固定下来:
s.xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => '$(inherited) UAT_Release=1' }
因为 UAT_Release 这个定义取决于 Jenkins 参数化构建时选择的环境。
那么就需要动态去修改 Xcconfig 配置文件,加入全局宏定义的 Build setting,这里是配合 Jenkins 进行自动化部署,使用 shell 脚本来达到动态修改的目的,在构建(Build)步骤中的Execute shell中加入如下脚本:
说明:
1、${Configuration}是Jenkins中的参数(This project is parameterized),例如:UAT_Debug、UAT_Release、AppStore_Debug、AppStore_Release 等不同的环境,第一行只是打印出了当前的参数值;
2、sed 命令往 Podfile 文件中追加内容,这里需要注意的是,与Linux不同,sed -i 后面需要加入 "" 用以备份原文件,不然执行会出错;
3、/pod 'JJSEventAspect'/ 这一句则是匹配 pod 'JJSEventAspect' 所在的行;
4、a 表示新增内容,\ 则是换行;
5、最后的 Podfile 指文件名;
6、追加完成 hook 的代码之后执行 pod install 就很好理解了;
7、要追加进去的 hook 代码:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) UAT_Release=1 COCOAPODS=1'
end
end
end
其中 UAT_Release 是参数化的结果,这个值是动态的。这一段 hook 执行后,子模块(pod)的build setting的全局宏定义(Preprocessor Macros)也都全部修改完成,如果是需要有选择性的修改,可以在 hook 中加入判断逻辑即可。
修改完成的 Podfile 文件是这样的:
最后,测试人员只需要选择需要的打包环境,轻松的点一下 Build 按钮就可以拿到想要的包了。