Android項目git+gradle實現(xiàn)commit時checkstyle檢查

一直感覺項目里的代碼風格很亂盾舌,想在commit時做個檢查,前幾周搗鼓了幾天終于弄好了,這里記錄分享下:

環(huán)境

由于是通過git的本地hook結(jié)合gradle task來實現(xiàn)的,所以git和Android studio肯定就是必須的了幔烛。

原理

Android的Gradle Api原生就有checkStyle類型的task,我們需要應(yīng)用checkstyle plugin囊蓝,并且實現(xiàn)一個這樣的task就可以執(zhí)行檢查代碼風格饿悬,并且生成檢查報告。代碼如下:

 allprojects {
    ...
    ...
    apply plugin: 'checkstyle'

    checkstyle {
        configFile rootProject.file('checkstyle.xml')
        toolVersion '6.19'
        ignoreFailures false
        showViolations true
    }

    task('checkstyle', type: Checkstyle) {
        source 'src/main/java'
        include '**/*.java'
        exclude '**/R.java'
        exclude '**/BuildConfig.java'
        classpath = files()
    }
}

通過hook git commit就可以來執(zhí)行這個腳本慎颗,然后根據(jù)檢查結(jié)果決定是否可以commit

實現(xiàn)

我們首先要做的有以下幾件事:

  1. 編寫一份checkstyle的xml文件
  2. checkstyletask的include乡恕,exclude將需要的和不需要的java類添加進來。
  3. 編寫git hook文件調(diào)用checkstyle的task

checkstyle文件網(wǎng)上可以找到俯萎,定義規(guī)則也很方便傲宜。這里就不再贅述。
include的文件就比較麻煩了夫啊,如果你不需要只檢查要提交的文件函卒,那也方便,直接如上所示include '**/*.java'撇眯,添加所有的java文件就可以了报嵌。而如果需要只檢查修改的文件就要稍微麻煩點,需要以下幾步操作:

因為用git status -s命令得到修改過的文件字符串熊榛。格式如下:

$ git status -s
 M gradle.properties
 M gradle/wrapper/gradle-wrapper.properties
 M tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BsDiffPatchInternal.java
 M tinker-sample-android/gradle.properties

所以我們可以在gradle中調(diào)用上述命令得到需要的字符串锚国,代碼如下:

def getChangeFiles() {
    try {
        String changeInfo = 'git status -s'.execute(null, project.rootDir).text.trim()
        return changeInfo == null ? "" : changeInfo
    } catch (Exception e) {
        return ""
    }
}

然后再解析這個字符串,就可以得到修改過的java文件類名集合玄坦。實現(xiàn)函數(shù)如下:

def filterCommitter(String gitstatusinfo) {
    ArrayList<String> filterList = new ArrayList<String>();
    String[] lines = gitstatusinfo.split("\\n")
    for (String line : lines) {
        if (line.contains(".java")) {
            String[] spliters = line.trim().split(" ");
            for (String str : spliters) {
                if (str.contains(".java")) {
                    filterList.add(str)
                }
            }
        }
    }
    return filterList;
}

現(xiàn)在只要把上述的java文件include進去血筑,就可以實現(xiàn)用gradle task只對修改過的java文件做checkstyle了,但是要做到git commit時自動檢查煎楣,就要添加git hook了豺总。

具體做法:
在項目.git/hooks 目錄 下添加pre-commit文件,這是一個shell文件择懂,在里面可以調(diào)用gradle task喻喳,并以task的輸出結(jié)果判斷是否可以commit。代碼如下:

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

if git rev-parse --verify HEAD >/dev/null 2>&1
then
  against=HEAD
else
  # Initial commit: diff against an empty tree object
  against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

SCRIPT_DIR=$(dirname "$0")
SCRIPT_ABS_PATH=`cd "$SCRIPT_DIR"; pwd`
$SCRIPT_ABS_PATH/../../gradlew  -PcheckCommit="true" checkstyle 
if [ $? -eq 0   ]; then
    echo "checkstyle OK"
else
    exit [[ $ERROR_INFO =~ "checkstyle" ]] && exit 1  
fi

我在這段代碼里 執(zhí)行了checkstyle task困曙,并且傳入了checkCommit=true的property值表伦。,如果checkstyle執(zhí)行成功就commit赂弓,checkstyle執(zhí)行報錯(有代碼不符合風格)就會提交失敗绑榴。
具體的gradle 腳本如下:

task checkstyle(type: Checkstyle) {
    source 'app/src/main/java'
    source 'lib_base/src/main/java'
    source 'lib_http/src/main/java'
    source 'lib_imageloader/src/main/java'
    source 'lib_storage/src/main/java'
    source 'lib_util/src/main/java'

    exclude '**/gen/**'
    exclude '**/R.java'
    exclude '**/BuildConfig.java'

    if (project.hasProperty('checkCommit') && project.property("checkCommit")) {
        def ft = filterCommitter(getChangeFiles());
        def includeList = new ArrayList<String>()
        for (int i = 0; i < ft.size(); i++) {
            String spliter = ft.getAt(i)
            String[] spliterlist = spliter.split("/")
            String fileName = spliterlist[spliterlist.length - 1]
            log("Checkstyle:file=" + fileName)
            includeList.add("**/" + fileName)
        }
        if (includeList.size() == 0) {
            exclude '**/*.java'
        } else {
            include includeList
        }
    } else {
        include '**/*.java'
    }
    configFile rootProject.file('/config/checkstyle.xml')
    classpath = files()
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盈魁,隨后出現(xiàn)的幾起案子翔怎,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赤套,死亡現(xiàn)場離奇詭異飘痛,居然都是意外死亡,警方通過查閱死者的電腦和手機容握,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門宣脉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剔氏,你說我怎么就攤上這事塑猖。” “怎么了谈跛?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵羊苟,是天一觀的道長。 經(jīng)常有香客問我感憾,道長蜡励,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任阻桅,我火速辦了婚禮凉倚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嫂沉。我一直安慰自己稽寒,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布趟章。 她就那樣靜靜地躺著瓦胎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尤揣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天柬祠,我揣著相機與錄音北戏,去河邊找鬼。 笑死漫蛔,一個胖子當著我的面吹牛嗜愈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莽龟,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蠕嫁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了毯盈?” 一聲冷哼從身側(cè)響起剃毒,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赘阀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體益缠,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年基公,在試婚紗的時候發(fā)現(xiàn)自己被綠了幅慌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡轰豆,死狀恐怖胰伍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酸休,我是刑警寧澤骂租,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站雨席,受9級特大地震影響菩咨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陡厘,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一抽米、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糙置,春花似錦云茸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至揉抵,卻和暖如春亡容,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冤今。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工闺兢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戏罢。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓屋谭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親龟糕。 傳聞我的和親對象是個殘疾皇子桐磁,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容