电竞比分网-中国电竞赛事及体育赛事平台

分享

git pre

 bananarlily 2016-05-23

做為開(kāi)發(fā)人員,每個(gè)人寫(xiě)代碼都會(huì)出現(xiàn)BUG,但要防止低級(jí)的BUG出現(xiàn)就要對(duì)代碼進(jìn)行質(zhì)量檢查,所以當(dāng)代碼進(jìn)行提交時(shí)對(duì)代碼進(jìn)行檢查非常有必要,而且能統(tǒng)一代碼的規(guī)范性。

而我們開(kāi)發(fā)時(shí),進(jìn)行代碼提交用得最多就是SVN與Git倉(cāng)庫(kù)來(lái)管理,而現(xiàn)在我是用git來(lái)進(jìn)行代碼管理的,所以現(xiàn)介紹一下用git如何進(jìn)行代碼檢查;

首先

安裝Git(網(wǎng)上很多,不講多),安裝jsHint來(lái)進(jìn)行檢查,這里我是用nodeJS來(lái)進(jìn)行安裝。

安裝命令:npm i jshint -g,

然后打開(kāi)git的pre-commit鉤子,位置在yourProject/.git/hooks

添加shell腳本

在pre-commit添加shell腳本:

#!/bin/sh
#
# Run JSHint validation before commit.

files=$(git diff HEAD --name-only --diff-filter=ACMR -- static/mobile/**.js)  
pass=true

if [ "$files" != "" ]; then  
    for file in ${files}; do
        result=$(jshint ${file})

        if [ "$result" != "" ]; then
            echo "$result"
            echo "\n"
            pass=false
        fi
    done
fi

if $pass; then  
    exit 0
else  
    echo ""
    echo "COMMIT FAILED:"
    echo "Some JavaScript files are invalid. Please fix errors and try committing again."
    exit 1
fi  

OK,完成,現(xiàn)在執(zhí)行g(shù)it commit就能檢查要提交的js代碼是否通過(guò)。

不會(huì)shell腳本

作為一個(gè)前端人員(我就是),可能對(duì)shell腳本編寫(xiě)不太熟,能否不通過(guò)編寫(xiě)shell實(shí)現(xiàn)呢?

那就用npm上的插件pre-commit來(lái)實(shí)現(xiàn),

安裝命令:npm i pre-commit --save

然后新建一個(gè)package.json,添加pre-commit參數(shù): 數(shù)組中的字符串就是要執(zhí)行的scripts命令:

ok,添加完批,執(zhí)行g(shù)it commit,被坑了.....

由于windows是不支持 *.js的寫(xiě)法,直接就報(bào)錯(cuò)Can't open file * .js,代碼又提交成功,這不是我們想要的效果;

如果要檢查就只能用(.)或者指定目錄(static/mobile),就會(huì)檢查所有的文件或者指定目錄的js文件,但問(wèn)題又來(lái)了,這樣檢查就全局檢查了,我們的目的只檢查提交的更改代碼;廢話不說(shuō),來(lái)寫(xiě)插件吧。

先安裝jshint在工程,可以給插件調(diào)用;

安裝命令:npm i jshint --save;

命名為check.js:

check.js代碼:

'use strict';

var exec = require('child_process').exec,  
    jsHint = require('jshint').JSHINT,
    fs = require('fs');

var content = fs.readFileSync('./.jshintrc','utf-8'),  
    content = JSON.parse(content);

var pass = 0;

exec('git diff HEAD --name-only --diff-filter=ACMR -- static/mobile/**.js',(error, stdout, stderr) => {  
    if(stdout.length){
        var array = stdout.split('\n');
        array.pop();
        array.forEach((path) => {
            jsHint(fs.readFileSync(path,'utf-8'),content,content.globals);
            jsHint.errors.forEach((o) => {
                console.log(path + ': line ' +o.line + ', col ' + o.character + ', ' + o.reason);
                pass = 1;
            });
        });
        process.exit(pass);
    }
    if (error !== null) {
        console.log('exec error: ' + error);
    }
});

OK,當(dāng)執(zhí)行g(shù)it commit就可以執(zhí)行check.js的代碼,先獲取差異文件,再把錯(cuò)誤信息輸出,如果有錯(cuò)直接結(jié)束進(jìn)程;

對(duì)于不懂shell腳本的前端同學(xué),就很好的擴(kuò)展這個(gè)check.js文件,也可以過(guò)濾個(gè)別的js文件。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多