项目多环境的配置
在需要多合环境的时候. 一般来说, 会有一个测试环境, 一个线上环境.
简单的说, 直接用下面吗的宏判断, 封装一下环境的管理. 就可以满足要求了
1 | enum ENV { |
但是, 作为一个乙方, 有可能有很多东西需要根据不同客户来配置. 比如 Display Name
, 环境, 甲方区别信息 etc.
- 创建configuration e.g: config1
新建一个xcconfig 文件, 将上面创建的configuration的项目target设置上这个xcconfig 文件
- pod install + 获取
warning
中提示的pod生成的config
文件的路径 - #include “上面拿到的pod的路径”
- #include “你的通用配置(如果有的话)”
- 配置自己需要的一些参数
- pod install + 获取
可以再Info.plist 文件中引入自己设置的变量, 来设置你想设置的自定义信息
- 也可以再
project
的build 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
项目之外, 弄一个脚本, 根据当前项目的一些能区别客户的信息, 来将对用的资源/配置文件拷贝到对应的目录, 实现内容的替换来切换环境
由于不同最好每个客户的环境都需要有一个
Debug
和Release
环境, 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+脚本的形式管理