如何在Git Hooks中运行Grunt任务

通常团队协作编程的时候,为了确保每一次的代码提交都能够保证质量,我们通常会指定一些提交前的检查和规约,比如:

  • 检查代码规范是否符合要求
  • 运行单元测试,检查是否全部通过
  • 其他(视具体项目而定)

以上这些检查可以通过hooks(钩子)来实现。比方说:我们可以在commit操作前指定特定的钩子程序,该钩子程序就可以去运行如上这些检查,只有全部通过才能提交代码。Git提供了诸如:pre-commit、pre-push、post-update等等好几种hooks。可以通过项目中的:.git/hooks目录查看所有Git支持的hooks:

要想了解更多关于git hooks的内容,可以访问这个教程

直接通过修改对应的sample文件就可以书写你自己的钩子程序,修改完后把sample后缀去掉即可。

但是,git的钩子程序默认是shell脚本,这点对于不怎么会复杂shell程序的同学来说不是很爽。而且也没有办法跨平台。事实上,钩子程序要运行的都是一些特定的任务,而现如今Grunt毫无疑问是最最流行的任务执行器,因此,要是Git钩子程序能够和Grunt结合起来,直接可以运行Grunt任务就圆满了。

怎么办呢?很简单,通过使用Grunt GitHooks 就可以轻松实现。

首先,我们可以使用NPM来简单地安装Grunt GitHooks模块:

cd /path/to/your/project
npm i grunt-githooks --save-dev

安装完成后,只要在Gruntfile.js文件中配置好对应的钩子和要执行的任务即可:

grunt.initConfig({
  githooks: {
    options: {
      // Task-specific options go here.
    },
    all: {
      'pre-commit': 'test.api'
    }
  },
})

如上这段配置就等于配置了一个pre-commit钩子程序,并且该程序要执行test.api任务,该任务会执行所有的api测试,只有当这些测试都通过后,git进行代码提交。

最后,你只要在项目目录下,运行如下shell脚本就可以将该钩子程序应用到git中:

grunt githooks

好了,接下来你可以修改一些文件,然后尝试下git commit,git会自动运行你指定的test.api任务了。好了,就是这么简单了!

学习技术,我们更多时候要知其然,更要知其所以然。我们来看看Grunt Githooks的原理是什么吧!

其实原理也很简单,它会在你运行:grunt githooks的时候,做如下几件事情:

  1. 读取你gruntfile的配置
  2. 根据它内置的模版文件生成一段可执行的node脚本
  3. 该node脚本就是去执行你配置的grunt任务(test.api),并将该脚本注入到.git/hooks中

我们可以通过简单查看:.git/hooks目录下发现pre-commit.sample文件这个时候已经变成了pre-commit文件了,其内容如下所示:

#!/usr/bin/env node

// GRUNT-GITHOOKS START
var exec = require('child_process').exec;

exec('grunt test.api', {
       cwd: '/Users/goddyzhao/workspace/swork/test/blog'
     }, function (err, stdout, stderr) {
  
  console.log(stdout);

  var exitCode = 0;
  if (err) {
    console.log(stderr);
    exitCode = -1;
  }

  process.exit(exitCode);
});

// GRUNT-GITHOOKS END#!/usr/bin/env node

这下豁然开朗了吧!上面这段就是不折不扣的node程序,第一行#!/usr/bin/env node就指明了运行上下文,然后会node的同学肯定就秒懂了这段程序。而git就是通过exit code(退出码)来判断是否hooks运行成功,所有非0的退出码都被认为是执行失败。了解了原理后,我们就不难想象其实我们可以手动去写任何语言版本的git hooks,只要目的机器上支持该脚本即可!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 148,637评论 1 318
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 63,443评论 1 266
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 99,164评论 0 218
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,075评论 0 188
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,080评论 1 266
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,365评论 1 184
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,901评论 2 283
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,649评论 0 176
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,122评论 0 223
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,734评论 2 225
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,093评论 1 236
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,548评论 2 222
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,028评论 3 216
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,765评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,291评论 0 178
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,162评论 2 239
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,293评论 2 242

推荐阅读更多精彩内容