multiple-env-config

项目多环境的配置

多环境的配置

在需要多合环境的时候. 一般来说, 会有一个测试环境, 一个线上环境.

简单的说, 直接用下面吗的宏判断, 封装一下环境的管理. 就可以满足要求了

1
2
3
4
5
6
7
8
9
enum ENV {
static let domain = {
#if DEBUG
return "baidu.com"
#else
return "google.com"
#endif
}
}

但是, 作为一个乙方, 有可能有很多东西需要根据不同客户来配置. 比如 Display Name, 环境, 甲方区别信息 etc.

  • 创建configuration e.g: config1
  • 新建一个xcconfig 文件, 将上面创建的configuration的项目target设置上这个xcconfig 文件

    • pod install + 获取warning 中提示的pod生成的config文件的路径
    • #include “上面拿到的pod的路径”
    • #include “你的通用配置(如果有的话)”
    • 配置自己需要的一些参数
  • 可以再Info.plist 文件中引入自己设置的变量, 来设置你想设置的自定义信息

  • 也可以再projectbuild setting中点击+来添加Add User-Defined Setting, 可以添加自定义的一些东西, 根据不同配置文件来设置不同的东西
  • 设置scheme, 添加一个scheme来指定项目运行/编译/打包时使用的配置文件(再scheme manage 中将这个scheme 分享出去, 勾选share)

    Error: 在添加scheme的时候, 完全的duplicate 原来debug的环境, 只是修改Run的configuration的时候, InComeMessage.xxx 即 Google的protoB 文件会报错: 'Protobuf/GPBProtocolBuffers.h' file not found, 这个在切换回原来的时候没有问题. 有可能, 添加configuration的方式错了, xcconfig 文件应该是没错的, 因为原debug环境已成换成了这个文件, 能正常编译, 但是换configuration的时候就会出错, 看来问题出在了添加的configuration, 试过直接Duplicate Debug Configuration, 还是编译失败

  • 通过在Preprocessor Macros的不同的环境中添加宏, 来达到项目中用#if XXX的作用

鉴于以上, 以及不同客户的配置层次, 最好是在XCode项目之外, 弄一个脚本, 根据当前项目的一些能区别客户的信息, 来将对用的资源/配置文件拷贝到对应的目录, 实现内容的替换来切换环境

由于不同最好每个客户的环境都需要有一个DebugRelease 环境, 10个客户的话, 就会有20个configuration, 20个scheme, 这样的维护成本, 还是有点大的.

项目中的代码, 不需要关心当前是哪个客户, 通过再编译前执行一个外部脚本, 引入一个换皮的”引擎”来替换资源.
这个替换, 包括:

  • XCConfig 文件中的配置描述 (使用外部脚本的话, 也可以讲这些信息放在infp.plist 里, 通过替换实现)
    • 项目名字: 使用debug/release下的 config 文件中的字段自定义, 修改这个xcconfig文件
    • code sign: 代码前面, 目前还是未知否可以再xcconfig中定义(不行的)
  • 资源文件
    • 环境配置文件:
      • 诸如线上/测试地址,
      • 客服电话,
      • 描述信息,
      • 协议地址之类的 描述性文件
      • 第三方服务的appkey, token etc.
    • 媒体资源: 图片/音乐/媒体

在xcode中执行脚本的一些问题:

  • 导入的环境变量, 是从xcconfig中已经定义的那些, 所以, 不能通过脚本来设置xcconfig里的东西.
  • 可以替换其他的资源

所以, 在外部执行脚本是一个不错的选择

通过外部的脚本, 替换掉XCConfig文件.
也可以替换其他资源文件的位置

但是!!!

好像不能通过任何手段替换掉开发账号啊!!!!

md…
那唯有通过手动替换了鸭…马甲包的话, 在这层好像真的没有其他方法了.

同一个客户内不同环境的需求倒是可以有不同配置的解决方法

结论

如果关于客户的信息, 需要手段切换的话. 那么, 还不如使用git来管理这些不同的信息.
因为这些信息是绑定再项目上的, 不能通过pod来改变. so, 主项目, 需要通过git来管理.

git的diff信息, 主要是:
开发账号
以上的客户的不同信息

其他代码的迁移

再主项目来管理不同客户信息后. 为保证代码的通用性. 可以将基层代码/通用业务代码抽离出来使用pod管理.
为了开发一个功能时, 代码不需要cherry-pick 到各个分支, 和配置相关的东西, 通过依赖注入的方式将配置信息传过去.

但是有些合xccode项目依赖比较大的第三方时, 可以直接就和客户项目放在一起. 不动. 因为这个修改的东西也不是很多的.

业务逻辑代码抽离就好

所以, 还不如在每个客户分支下, 就放好资源文件好了. 也算是配置分离了. 只是要将资源文件放在一个地方. 好做check

在这个前提下, 尽可能的能通过环境来自动配置一些信息, 减少因为人工操作的失误

因为xcconfig中使用的是环境变量的信息(就是类似shell类型的, 不能直接再项目中使用), 要使用还需要再info.plist 中调用一下.

通过Swift other 林肯 flags 看看设置后能不能用

同一个账户下的不同马甲包, 倒是可以通过xcconfig+脚本的形式管理

感觉这偏讲的能配更多东西
开源
怎么用xcode管理不同的环境