likes
comments
collection
share

Flutter 项目自增 build 号,不做重复劳动

作者站长头像
站长
· 阅读数 4

不知道你是否跟我一样,在项目打包的时候,会手动到 pubspec.yaml 修改的 version。如果是一个人的项目,这种改动还是可以接受的。但是如果你是团队,且项目是通过自动化打包的话,对于打包分支,每次修改 version 是十分痛苦的。一旦忘记修改,TestFlight 的包上传就会失败,自己还得屁颠屁颠的修改版本号,再重新执行一遍构建。如果团队一大,忘记修改 version 的几率是比较大的。所以,写个程序去实现自动增加 build 号是非常有必要的。

实现思路

那么这个程序该如何实现?

提出正确的问题,往往等于解决了问题的大半。——海森堡.

问题:如何在 commit 代码的时候,自动地将 pubspec.yamlversion 的 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 插件。

Flutter 项目自增 build 号,不做重复劳动

更多阅读,请查阅 官方文档

process_run

也是一个 Dart 插件,方便 dart 调用命令。其文档请浏览

git_hooks.dart

这是我们 hook 脚本了。我们 hook 了两个事件: Git.commitMsgGit.preCommit

commitMsg 中,我们对提交的日志进行规范化,如果前缀不是 Feat: Fix: Refactor: Style: Docs: Test: Chore: Merge 其中之一,那么不能完成commit。

preCommit 中,我们首先获取到分支名,以及提交日志。然后通过以下流程控制是否需要增加 build 号

Flutter 项目自增 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