不知道你是否跟我一样,在项目打包的时候,会手动到 pubspec.yaml
修改的 version。如果是一个人的项目,这种改动还是可以接受的。但是如果你是团队,且项目是通过自动化打包的话,对于打包分支,每次修改 version 是十分痛苦的。一旦忘记修改,TestFlight 的包上传就会失败,自己还得屁颠屁颠的修改版本号,再重新执行一遍构建。如果团队一大,忘记修改 version 的几率是比较大的。所以,写个程序去实现自动增加 build 号是非常有必要的。
实现思路
那么这个程序该如何实现?
提出正确的问题,往往等于解决了问题的大半。——海森堡.
复制代码
问题:如何在 commit 代码的时候,自动地将 pubspec.yaml
中 version
的 build 号自增?
- 1.通过 git hooks 监听 commit 的时机,然后触发我们自定义的脚本。
- 2.这个脚本就是替换 pubspec.yaml 文本的 version
- 3.最后将 pubspec.yaml 的改动提交即可。
实现步骤
1.全局安装 git_hooks 命令:
pub global activate git_hooks
复制代码
2.给现有项目添加依赖:
dev_dependencies:
# git hook 相关
process_run: 0.11.2+8
git_hooks: ^0.1.0
复制代码
- process_run: 用于执行shell命令
- git_hooks: 通过 dart 来写 git hooks 脚本
3.创建 hooks 文件和 dart 钩子文件(项目根路径下):
git_hooks create git_hooks.dart
复制代码
如果输出
create files...
All files wrote successful!
0.2s
复制代码
那说明我们已经创建成功。
检查文件是否生成成功:
-
查看
.git/hooks
文件下是否有多个文件例如 pre-commit, pre-push 等等, -
查看根目录下是否已生成
git_hooks.dart
文件。
4.打开 git_hooks.dart
,编写我们自己的脚本。
import 'package:git_hooks/git_hooks.dart';
import 'package:process_run/shell.dart';
void main(List arguments) {
Map<Git, UserBackFun> params = {
Git.commitMsg: commitMsg,
Git.preCommit: preCommit
};
GitHooks.call(arguments, params);
}
Future<bool> commitMsg() async {
String commitMsg = Utils.getCommitEditMsg();
// 规范提交日志
if (commitMsg.startsWith('Feat:') ||
commitMsg.startsWith('Fix:') ||
commitMsg.startsWith('Refactor:') ||
commitMsg.startsWith('Style:') ||
commitMsg.startsWith('Docs:') ||
commitMsg.startsWith('Test:') ||
commitMsg.startsWith('Chore:') ||
commitMsg.startsWith('Merge')) {
return true;
} else {
print('请在提交文案添加前缀');
return false;
}
}
/// 在 git commit 的完成前执行
Future<bool> preCommit() async {
final shell = Shell();
// 提交文案
String commitMsg = Utils.getCommitEditMsg();
// 获取当前分支名
var branchRes = await shell.run('git branch --show-current');
String branch = branchRes.first.stdout;
bool increase_build_num = false;
// 自动增加build号时机
if (commitMsg.startsWith("Merge")) {
increase_build_num = false;
} else {
if (branch.startsWith('v')) {
increase_build_num = true;
} else {
if (commitMsg.startsWith("Feat") || commitMsg.startsWith("Fix")) {
increase_build_num = true;
} else {
increase_build_num = false;
}
}
}
if (increase_build_num) {
try {
/// 执行增加build 号
var result = await shell.run('sh increase_build_num.sh');
print('$result');
return true;
} catch (e) {
return false;
}
} else {
return true;
}
}
复制代码
5.increase_build_num.sh
自动新增 build 号的脚本:
perl -i -pe 's/^(version:\s+\d+\.\d+\.)(\d+)(\+)(\d+)$/$1.$2.$3.($4+1)/e' pubspec.yaml
git add pubspec.yaml
复制代码
说明
通过上面的 5 个步骤,就实现了我们所需的功能。下面做个简单的说明。
Git Hooks
Git Hooks 就是那些在 Git 执行特定事件(如commit、push、receive等)后触发运行的脚本。
利用它,可以
- 执行单元测试
- 检查代码
- 执行代码格式化
- 代码提交后自动部署
- 其他软件工程化所需要的操作
- …
如果你想更深刻的了解,不妨阅读官方文档
git_hooks
这是一个 Dart 命令行插件,也是一个 Dart 插件。
更多阅读,请查阅 官方文档
process_run
也是一个 Dart 插件,方便 dart 调用命令。其文档请浏览
git_hooks.dart
这是我们 hook 脚本了。我们 hook 了两个事件: Git.commitMsg
、Git.preCommit
在 commitMsg
中,我们对提交的日志进行规范化,如果前缀不是 Feat:
Fix:
Refactor:
Style:
Docs:
Test:
Chore:
Merge
其中之一,那么不能完成commit。
在 preCommit
中,我们首先获取到分支名,以及提交日志。然后通过以下流程控制是否需要增加 build 号
increase_build_num.sh
因为可以通过 shell 命令快速实现自增 build,所以将个功能独立成 shell 脚本。
shell.run(r"perl -i -pe 's/^(version:\s+\d+\.\d+\.)(\d+)(\+)(\d+)$/$1.$2.$3.($4+1)/e' pubspec.yaml") 复制代码
无法成功执行.
本文到此结束,有疑问可关注官方微信公众号 OldBirds