目标
通过xcconfig文件生成代码
// config.xcconfig
CUSTOM_VALUE = my_custom_value
struct BuildConfig {
private init() {}
static let CUSTOM_VALUE = "my_custom_value"
}
xcconfig文件
Mattt的文章介绍了xcconfig文件在xcode中的用处。
xcconfig文件里的键值对会在编译时放入xcode的编译环境里,这意味着开发者可以在编译时通过env命令拿到xcconfig里的内容。
// config.xcconfig
CUSTOM_VALUE = my_custom_value
编译时会运行如下内容:
...
export CURRENT_ARCH=undefined_arch
export CURRENT_VARIANT=normal
export CUSTOM_VALUE=my_custom_value
export DEAD_CODE_STRIPPING=YES
export DEBUGGING_SYMBOLS=YES
...
但是可以看出xcconfig里的内容和xcode自带的env属性并不能区分,所以需要把Key加上前缀。
生成代码
这篇文章介绍了如何通过xcconfig生成代码。
前面说到要在编译时通过env命令可以拿到xcconfig的内容,但是生成的代码文件又要在编译时被编译,所以要在Xcode里Build Phase的Compile Source脚本前运行脚本生成代码。
这里的使用的前缀是BuildConfig_,shell脚本如下
printf "//\n//\n//generated by BuildConfig.sh\n"
printf "\nimport Foundation\n\n"
echo "struct BuildConfig { "
echo "\tprivate init() {}"
env |\
grep "BuildConfig_" | \
sed "s/BuildConfig_/ static let /" |\
sed -E 's/=(.*)/ = "\1"/'
echo "}"
然后在Xcode的Build Phase的脚本里运行上述脚本。
"${PROJECT_DIR}/Your Shell Path" > "${PROJECT_DIR}/generated swift file path"