iOS推送到master分支时如何自动修改所有文件的版本号
可行性结论
这个需求完全可以实现,落地成本很低,不用上什么重型工具链,用轻量脚本搭配CI触发规则就能达到你要的效果。
具体实现方案
不要指望单一工具覆盖所有文件的版本管理,agvtool本身只能处理Xcode工程相关的版本字段,缺的部分用自定义脚本补全就够,比找适配所有场景的第三方工具靠谱得多:
- 首先统一版本号的唯一可信源:在仓库根目录新建一个纯文本文件
VERSION,文件里只存当前版本号字符串,比如2.4.1,所有位置的版本号都以这个文件的内容为准,从根源上避免多文件版本不一致的问题。 - 写一个轻量同步脚本(Shell/Python都可以,几十行代码就能搞定),读取
VERSION里的版本号,批量更新所有目标文件的版本字段:- 针对
.xcodeproj工程文件:直接调用原生的agvtool能力即可,执行命令agvtool new-marketing-version $(cat VERSION),不用自己解析pbxproj文件踩格式坑 - 针对
.podspec文件:不需要做复杂的格式解析,直接用sed做固定规则匹配替换即可,Mac端执行参考命令:sed -i '' 's/s.version\s*=\s*"[0-9.]*"/s.version = "'"$(cat VERSION)"'"/g' 你的SDK名称.podspec - 针对
.h头文件里的版本宏:同样用sed匹配固定格式的宏定义替换即可,比如你头文件里写的是#define MY_SDK_VERSION @"x.x.x",直接写正则匹配这行替换版本值就行;为了避免误替换,可以给宏定义加个特殊注释标记,比如#define MY_SDK_VERSION @"1.2.3" // AUTO_UPDATE_VERSION,匹配的时候连标记一起匹配,零误判 - 脚本最后加一步校验:用grep分别检查几个目标文件里提取到的版本号,和
VERSION文件里的内容做对比,不一致就直接报错退出,避免替换失败漏改
- 针对
- 最后把脚本接入CI流程配置触发规则:
- 触发时机设置为代码推送到master分支、或者给仓库打
v*格式的版本tag时触发,不要在PR未合入阶段执行,避免脏提交 - 版本号更新规则可以按需配置:如果是tag触发,就直接提取tag里的版本号(比如
v2.4.1就提取2.4.1)覆盖VERSION文件再跑同步脚本;如果是推送master触发,就按你定的规则自动升版本位,比如日常迭代自动补第三位补丁版本号,大版本迭代手动指定版本号 - 脚本执行完成后,给CI配置仓库提交权限,直接把修改完版本号的文件提交回master分支即可,全程不需要人工手动改任何文件。
- 触发时机设置为代码推送到master分支、或者给仓库打
关于Adjust SDK类实现的说明
你提到的Adjust SDK那种全文件版本统一更新的提交效果,本质就是这套逻辑:单版本源+批量替换脚本+CI自动提交,没有用什么特殊的黑科技工具。agvtool管不了CocoaPods文件的问题,靠几行脚本就能补上,完全不需要更换现有工具链。
落地建议
不要一开始就上复杂的全自动语义化版本生成逻辑,先做手动修改VERSION文件、执行本地脚本一键同步所有文件版本的版本,用顺了再补CI自动触发、自动升版本的能力,快的话半小时就能搭完可用版本。
内容的提问来源于stack exchange,提问作者2nebin
相关产品推荐
相关产品推荐

