一般,我们做版本控制的时候,都是使用宏定义来做,这样在程序在编译的时候,就可以根据宏定义去做匹配,如下:
// 定义 宏定义,0开发,1灰度,2生产
#define PRODUCTMODE 0
使用:
#if PRODUCTMODE == 0
//do something in dev
#else
//do something in gray or production
#endif
- 最近项目的新需求 *
新需求,要求,生产和测试,使用不同的配置文件,使用不同的SDK版本,这样以来,当切换版本的时候,不但需要修改宏定义,还去要去响应的替换配置文件和SDK,这些东西都是在编译之前进行的。
因此,想出一个解决办法
- 宏定义前置,
- 使用script进行配置文件的替换和SDK的替换
宏定义前置
- 在build setting 中,添加用户自定义配置
如:PRODUCT_MODE: 0
这里的配置可以被buildSetting 和Build Phases 获取; - 在build setting 中的
Apple Clang - Preprocessing
-Preprocessor Macros
中的后面,添加属性:PRODUCTMODE=$(PRODUCT_MODE)
意思是通过预定义,定义一个的宏PRODUCTMODE
,使其值等于用户定义的环境变量PRODUCT_MODE
;
项目中可以直接使用PRODUCTMODE, 而无需使用#define
在进行定义。
#if PRODUCTMODE == 0
//do something in dev
#else
//do something in gray or production
#endif
- 在build Phases 中,添加RunScript,具体参数如下
说明一下,配置文件的存放路径:
1- 项目总路径
2- 项目路径 # 这个是项目的根目录的上一级
3- 项目.xcodeproj
3- target名
4- SDKS
5- sdks # 这个是目标
4- Paas
5- meta.config # 这个是目标
2- 配置 # 这个是源配置文件
3- 测试环境
4 - meta.config
4- SDKs
5- sdk1
5 - sdk2
3- 生产环境
4- meta.config
4- SDKs
5- sdk1
5- sdk2
Shell 代码如下
# Type a script or drag a script file from your workspace to insert its path.
# 定义项目文件夹, 包含了 配置文件夹
projectPathRoot="$(cd ..; pwd)"
configFolder="配置/测试环境"
# 定义 配置文件1的原始路径
configPath=""
# 定义 配置文件1在项目中的路径
finalConfigPath="${projectPathRoot}/项目名/项目名/Resources/SDKS/"
# 定义 配置文件2的原始路径
paasConfig=""
# 定义 配置文件2在项目中的路径
finalPaasConfigPath="${projectPathRoot}/项目名/项目名/Resources/meta.config"
# 这个 PRODUCT_MODE 是我们在buildSetting 中,用户自定义的环境变量
# 这里判断,PRODUCT_MODE 不等于0 时,使用生产的配置
if [ ${PRODUCT_MODE} -ne 0 ];then
echo '----PRODUCT_MODE----1,2,3,4,5'
configFolder="配置/生产环境/SDKs/"
configPath="${projectPathRoot}/${configFolder}"
paasConfig="${projectPathRoot}/配置/生产环境/meta.config"
else
echo '----PRODUCT_MODE----0'
configFolder="配置/测试环境/SDKs/"
configPath="${projectPathRoot}/${configFolder}"
paasConfig="${projectPathRoot}/配置/测试环境/meta.config"
fi
# 把 configPath中的东西 拷贝到 finalConfigPath
cp -R $configPath $finalConfigPath
# 把 paasConfig 中的文件内容,复制到finalPaasConfigPath
cat $paasConfig > $finalPaasConfigPath
至此可以通过修改配置文件,在编译时,把配置文件写入进去
但目前有一个问题,copy时机上控制的还有问题,编译两次最是稳妥