在Swift項目的模塊化項目開發(fā)中,有個獨立的網絡子模塊,采用了宏定義的方式來隔離服務器環(huán)境。在主工程(后續(xù)均稱為A工程)的Configurations設置了多個config,分別是Debug、Alpha、Beta、Release。 A工程配Target配置如下圖:

截屏2022-03-15 下午5.41.09.png
但是,現在遇到了一個問題,在采用不同config進行編譯,項目始終讀取的是DEBUG狀態(tài)下的網絡地址。開始時,以為是子項目中沒有相關的配置,于是在Podfile中添加了如下腳本:
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name == 'Alpha'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','ALPHA=2']
elsif config.name == 'Beta'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','BETA=3']
elsif config.name == 'Release'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','RELEASE=4']
end
end
end
end
但是,在做了此工作之后,才發(fā)現改方法仍然不起作用。后來查詢資料說是Swift是不支持宏的,需要在Other Swift Flags中添加定義。于是修改如下:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name == 'Alpha'
config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited) -D ALPHA'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','ALPHA=2']
elsif config.name == 'Beta'
config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited) -D BETA'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','BETA=3']
elsif config.name == 'Release'
config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited) -D RELEASE'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','RELEASE=4']
else
config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited) -D DEBUG'
end
end
end
end
但是,運行到最后發(fā)現仍不生效。而在網絡溜達了一圈,發(fā)現沒有其他跟后的思路,索性回到項目本省的主工程。于是想著,主工程保持與主工程相同的配置方式應該可以吧。于是,有了如下的配置修改:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 11.0
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
end
if config.name == 'Alpha'
config.build_settings['SWIFT_ACTIVE_COMPILATION_CONDITIONS'] = 'ALPHA'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','ALPHA=2']
elsif config.name == 'Beta'
config.build_settings['SWIFT_ACTIVE_COMPILATION_CONDITIONS'] = 'BETA'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','BETA=3']
elsif config.name == 'Release'
config.build_settings['SWIFT_ACTIVE_COMPILATION_CONDITIONS'] = 'RELEASE'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','RELEASE=4']
else
config.build_settings['SWIFT_ACTIVE_COMPILATION_CONDITIONS'] = 'DEBUG'
end
end
end
end
好家伙,成功了?;剡^頭來,看看配置。
SWIFT_ACTIVE_COMPILATION_CONDITIONS本身表示的是激活SWIFT條件編譯。所以,改方法能成功也是預料之中的。