前言
隨著Flutter 2.0的發布,越來越多的公司和個人都在嘗試使用Flutter來編寫性能優異、跨平臺、渲染一致性好的App。當然,在追求效率的同時,也不要忘了給你的代碼添加更多嚴謹的限制,來保證代碼的質量。今天我給大家推薦一個插件,用于給提交代碼到Github或者GitLab時,在本地使用dart語言,即可限制提交代碼的質量。
Git Hooks
Git Hooks
是什么,Hooks
顧名思義,就是鉤子。它在Git中的作用就是在我們通過git
命令操作倉庫或者添加項目文件時,運行一些腳本,腳本通過即可完成事件,如果失敗就被終止事件。這里是官方定義的所有鉤子,有興趣的可以一一查看。比如我們在.git/hooks/
下新建了一個pre-commit
文件,并輸入以下內容
#!/bin/sh
echo '文件正在提交'
exit(-1)
然后我們在命令行中執行
git add test
git commit -m '提交信息'
然后我們就會在命令行看到文件正在提交
,并且文件最后沒有提交到本地倉庫,因為上面我exit了。
這樣,我們就可以在這個文件中寫一些校驗,比如通過dartanalyzer
查看本地項目語法是否有語法問題。
git_hooks
這是一個Dart
命令行插件,也是一個Dart插件。我們看到上面使用shell
腳本來寫校驗,它存在一些問題:
- 每個人的
.git
文件夾是不通過版本管理的,所以一個人第一次拉了代碼,在.git/hooks
文件夾下是不會存在能運行的hooks文件的 - shell腳本比較生澀難寫,上手難度高
git_hooks
庫就是為了解決上面問題。它的作用就是能通過命令生成所有hooks
,然后在我們通過git
命令提交代碼時,可以通過dart來進行提交前或者提交信息的校驗。它讓我們程序員可以忽略hooks文件存在,在dart代碼中實現對所有鉤子的操作。
這里我們定一個我們能看懂的術語
hooks文件
:指在.git/hooks
文件夾下生成的鉤子文件
dart鉤子文件
:指在項目中生成的使用dart語言來操作hooks文件
的dart文件
我們可以通過下面命令來安裝它,安裝它前請保證你的dart已經安裝且已經配置了環境變量,還要保證你的 dart 版本大于 2.1.0
運行命令dart --version
查看dart版本號
然后運行pub global activate git_hooks
即可全局安裝git_hooks
命令
創建hooks項目文件
當我們打開一個擁有git版本管理的項目(在項目中可看到.git
文件夾)
在項目中的pubspec.yaml
文件中添加
dev_dependencies:
git_hooks: ^0.1.5
創建hooks文件
和dart鉤子文件
的命令是:
git_hooks create {{targetFileName}}
- targetFileName指的是
dart鉤子文件
,它可以是項目中任何位置,比如在根目錄下的git_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
文件
打開git_hooks.dart
文件會看到如下
import 'package:git_hooks/git_hooks.dart';
// import 'dart:io';
void main(List arguments) {
// ignore: omit_local_variable_types
Map<Git, UserBackFun> params = {
Git.commitMsg: commitMsg,
Git.preCommit: preCommit
};
GitHooks.call(arguments, params);
}
Future<bool> commitMsg() async {
// String rootDir = Directory.current.path;
// String commitMsg = Utils.getCommitEditMsg();
// if (commitMsg.startsWith('fix:')) {
// return true; // you can return true let commit go
// } else
// return false;
return true;
}
Future<bool> preCommit() async {
// try {
// ProcessResult result = await Process.run('dartanalyzer', ['bin']);
// print(result.stdout);
// if (result.exitCode != 0) return false;
// } catch (e) {
// return false;
// }
return true;
}
解釋:
- main方法下的params是一個Map,是我們想要自定義的鉤子集合,每個鉤子對應下面具體的函數
- GitHooks.call 是固定寫法,庫的內部會執行鉤子函數并校驗
- commitMsg函數是一個例子,當執行git的commit-msg腳本時,會執行此函數,如果返回false,會終止git操作
我們嘗試把注釋打開
Future<bool> commitMsg() async {
var commitMsg = Utils.getCommitEditMsg();
if (commitMsg.startsWith('fix:')) {
return true; // you can return true let commit go
} else {
print('you should add `fix` in the commit message');
return false;
}
}
然后在項目路徑的命令行下執行:
git add git_hooks.dart
git commit -m '提交信息'
腳本輸出如下
you should add `fix` in the commit message
并且文件沒有被提交到本地倉庫。
大功告成!
刪除所有hooks文件
當我們有一天被自己寫的鉤子折磨,不想再用此校驗,我們有兩個方式來刪除鉤子
- 刪除
.git/hooks
文件夾,注意是hooks文件夾而不是.git
文件夾 - 通過命令
git_hooks uninstall
來刪除
其它鉤子的枚舉
你可以通過下面的枚舉,添加更多的鉤子操作
enum Git {
applypatchMsg,
preApplypatch,
postApplypatch,
preCommit,
prepareCommitMsg,
commitMsg,
postCommit,
preRebase,
postCheckout,
postMerge,
prePush,
preReceive,
update,
postReceive,
postUpdate,
pushToCheckout,
preAutoGc,
postRewrite,
sendemailValidate
}
具體含義可以參考git官方文檔
結語
上面是我的一個例子,當然我們可以使用該工具做更多的事情,比如使用dartanalyzer
檢查代碼質量,使用dartfmt
來檢查代碼文件格式是否對齊等等。