如何为.podspec添加post install钩子修改SWIFT_OPTIMIZATION_LEVEL?
解决私有Pod作为依赖时无法修改SWIFT_OPTIMIZATION_LEVEL的问题
嘿,这个问题我之前也碰到过!当私有Pod变成其他Pod的依赖时,原来Podfile里的post_install确实容易让人误以为失效了,但其实有几个靠谱的解决办法,咱们一个个说:
方案1:调整主项目Podfile的post_install脚本(最简单)
其实不管MyLib是直接在Podfile里引入,还是作为其他Pod的依赖,它最终都会出现在Pods项目的target列表里。你只需要保留原来的post_install逻辑,确保能精准匹配到MyLib就行:
post_install do |installer| installer.pods_project.targets.each do |target| # 只处理MyLib的target next unless target.name == "MyLib" target.build_configurations.each do |config| config.build_settings['SWIFT_OPTIMIZATION_LEVEL'] = '-Onone' end end end
这个脚本会遍历Pods项目里的所有target,找到MyLib后修改它的优化级别,不管它是一级依赖还是二级依赖,都能生效。
方案2:在依赖Pod的podspec里用script_phase提前生效
如果需要把配置逻辑封装在podspec里,不让主项目用户修改Podfile,可以用script_phase并指定执行时机为编译前:
s.script_phase = { :name => 'Set MyLib Optimization Level', :script => <<-SCRIPT # 定位到MyLib的target并修改优化级别 TARGET_NAME="MyLib" # 使用xcodebuild直接修改target的构建配置 xcrun xcodebuild -project "${PROJECT_FILE_PATH}" \ -target "${TARGET_NAME}" \ -configuration "${CONFIGURATION}" \ SWIFT_OPTIMIZATION_LEVEL='-Onone' \ build CONFIGURATION_BUILD_DIR="${BUILD_DIR}/${CONFIGURATION}-${PLATFORM_NAME}" SCRIPT, :execution_position => :before_compile, # 确保在编译前执行 :shell_path => '/bin/sh' }
这里关键是把execution_position设为:before_compile,这样脚本会在MyLib编译前就修改好优化级别,不会出现首次构建失败的问题。
方案3:直接修改私有Pod(MyLib)的podspec(最推荐)
如果MyLib是你自己维护的,这绝对是最干净、一劳永逸的方案。直接在MyLib的podspec里添加pod_target_xcconfig配置,给它的target设置默认的优化级别:
# 给所有配置设置-Onone s.pod_target_xcconfig = { 'SWIFT_OPTIMIZATION_LEVEL' => '-Onone' } # 或者区分Debug和Release配置 s.pod_target_xcconfig = { 'SWIFT_OPTIMIZATION_LEVEL[config=Debug]' => '-Onone', 'SWIFT_OPTIMIZATION_LEVEL[config=Release]' => '-O' }
这样不管MyLib被哪个Pod依赖,它的构建配置都会自动应用这个优化级别,不需要任何额外脚本。
内容的提问来源于stack exchange,提问作者Michal Rogowski
相关产品推荐
相关产品推荐

