iOS 生产/发布多版本控制

一般,我们做版本控制的时候,都是使用宏定义来做,这样在程序在编译的时候,就可以根据宏定义去做匹配,如下:

// 定义 宏定义,0开发,1灰度,2生产
#define PRODUCTMODE 0

使用:

#if PRODUCTMODE == 0 
    //do something in dev
#else
    //do something in gray or production
#endif
  • 最近项目的新需求 *
    新需求,要求,生产和测试,使用不同的配置文件,使用不同的SDK版本,这样以来,当切换版本的时候,不但需要修改宏定义,还去要去响应的替换配置文件和SDK,这些东西都是在编译之前进行的。

因此,想出一个解决办法

  1. 宏定义前置,
  2. 使用script进行配置文件的替换和SDK的替换

宏定义前置

  1. 在build setting 中,添加用户自定义配置
    如:PRODUCT_MODE: 0
    这里的配置可以被buildSetting 和Build Phases 获取;
  2. 在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
  1. 在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时机上控制的还有问题,编译两次最是稳妥

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容