用checkstyle實現svn的代碼規範性檢查

“代碼的規範性與軟件缺陷是有緊密聯繫的,質量高的代碼將直接提高軟件的質量”。相信每一個軟件企業的研發部門都有類似於《XX語言開發規範》的文檔,但究竟有多少人會去認真閱讀、吃透其中的每一條款,並把其做爲代碼書寫的“聖經”來對待(稍有違反規範的代碼將及時重寫)?我們需要“用技術手段去解決技術問題”。讓我們在最關鍵的環節—代碼倉庫SVN—“做手腳”。試想,如果我們能在svn上增加一項功能,在程序員提交代碼時進行規範性檢查,如果沒有通過,將拒絕代碼的提交。這將使程序員無法迴避“自己所犯的錯誤”。

  技術實現框架

用checkstyle實現svn的代碼規範性檢查

  在SVN所在服務器安裝一個用於代碼檢查的工具,此處選擇checkstyle(一個開源的著名代碼檢查工具,可以自定義規則)。如何在commit事件發生的時候調起代碼檢查工具呢?此處運用svn的hook功能。Svn內置了鉤子功能,當有事件發生的時候將自動調起一個程序。我們可以定製這段程序以實現自己的想要的功能。可以接受的事件包括:提交、加鎖、解鎖、改變等。以“提交”事件舉例,當提交事件發生之前將執行hooks中的pre-commit腳本,提交事件之後將執行hooks中的post-commit腳本。於是我們就可以在pre-commit腳本里加入執行checkstyle的命令。此處我們再擴展一下,不直接執行checkstyle,而是先執行一個叫SVNChecker的工具,藉助SVNChecker執行CheckStyle。SVNChecker是一個開源的檢查框架,他可以做各種檢查(不僅僅是代碼規範性),並針對各種檢查匹配處理模塊。也就是說目前雖然只是進行“代碼規範性檢查”,但是加入SVNChecker後,今後若想進行其他檢查,就可以輕而易舉的擴展了。

  安裝checkstyle

    Checkstyle官方主頁:http://checkstyle.sourceforge.net/
    Checkstyle下載頁面:http://sourceforge.net/projects/checkstyle/files/checkstyle/5.3/

  請到以上頁面去下載checkstyle-5.3-bin.zip,並上傳到SVN服務器,解壓。解壓後目錄結構如下:

用checkstyle實現svn的代碼規範性檢查 

  安裝svnchecker

  SVNChecker官方主頁:http://svnchecker.sourceforge.net/overview.php

  請到以上頁面去下載svnchecker-0.3.tar.gz,並上傳到SVN服務器,解壓。解壓後目錄結構如下:

用checkstyle實現svn的代碼規範性檢查

  配置checkstyle檢查規則

  Checkstyle的規則配置文件爲xml格式,其定義規則可以到checkstyle主頁去查看,其內置了常用的規則,也可以自定義擴展。同時初始安裝後自帶sun_checks.xml(按照sun的java開發規範定義),免去自定義的麻煩。但是此規則很全,不適用於企業的實際情況。

  下面是一段檢查規則——“包名只允許出現小寫字母”

                <module name="PackageName">
                        <property name="format" value="^[a-z]+(\.[a-z]*)*$"/>
                </module>

   配置svnchecker檢查項

  SVNChecker也可以靈活配置,包括:

    1. 針對被檢查代碼的路徑進行設置,做到只檢查需要檢查的代碼
    2. 對如何檢查和如何處理進行配置
    3. 對檢查規則進行配置
    4. 對成功和失敗輸出進行配置

  這些都保存在svncheckerconfig.ini文件中,可參考相關文檔進行設置。

  下面是一段配置:

[PROJECT]
Main.Regex=^/appfront/src/main/java/
Main.PreCommitChecks=Checkstyle
Checkstyle.FailureHandlers=Console
Checkstyle.Java=/usr/bin/java
Checkstyle.Classpath=$CHECKSTYLE_PATH/checkstyle-5.3-all.jar
Checkstyle.ConfigFile=$CHECKSTYLE_PATH/checks.xml

   對^/appfront/src/main/java/下的文件進行檢查,其他文件過濾。檢查器爲checkstyle。失敗時將把信息輸出到標準輸出。Checkstyle執行的java命令路徑爲/usr/bin/java,要加載$CHECKSTYLE_PATH/checkstyle-5.3-all.jar,檢查規則文件路徑爲$CHECKSTYLE_PATH / checks.xml

  修改pre-commit hook

  最後,一切設置好後,最關鍵的就是修改鉤子程序了。加入語句:

  $SVNCHECKER_PATH/Main.py PreCommit $1 $2 || exit 1

  當然不要忘記了賦予此文件的執行權限。

  總結

  當有代碼提交時,此檢查框架將運行,保證違反規則的代碼被拒絕。程序員的將看到類似如下的信息:

用checkstyle實現svn的代碼規範性檢查 

  修改代碼後即可提交。

  根據我企業對此框架的運用總結的經驗如下:

  1. 不要一次把所有規則都加入,循序漸進,分多批次添加。否則開發人員的修改量會很大。

  2. Svnchecker本身會有些bug,有時候需要手工改svnchecker的代碼實現自己的需求。

  3. Svnchecker項目已不維護,改爲RepoGuard(http://repoguard.tigris.org/),有興趣的同學可以進一步研究此框架。

  4. 既然決定用此技術來規範起代碼,那麼就應該堅持的走下去,即使開發人員提出是否可以放寬要求,也要堅持自己的原則。

發佈了24 篇原創文章 · 獲贊 14 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章