使用git_hooks庫助力Flutter團隊編碼規范

原文鏈接

前言

隨著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文件

當我們有一天被自己寫的鉤子折磨,不想再用此校驗,我們有兩個方式來刪除鉤子

  1. 刪除.git/hooks文件夾,注意是hooks文件夾而不是.git文件夾
  2. 通過命令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來檢查代碼文件格式是否對齊等等。

pub倉庫地址

github地址

git hooks 官方文檔

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容