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

2020-11-23 IT168

  【IT168 技術】「代碼的規範性與軟體缺陷是有緊密聯繫的,質量高的代碼將直接提高軟體的質量」。相信每一個軟體企業的研發部門都有類似於《XX語言開發規範》的文檔,但究竟有多少人會去認真閱讀、吃透其中的每一條款,並把其做為代碼書寫的「聖經」來對待(稍有違反規範的代碼將及時重寫)?我們需要「用技術手段去解決技術問題」。讓我們在最關鍵的環節—代碼倉庫SVN—「做手腳」。試想,如果我們能在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伺服器,解壓。解壓後目錄結構如下:

 

  安裝svnchecker

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

  請到以上頁面去下載svnchecker-0.3.tar.gz,並上傳到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

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

  總結

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

 

  修改代碼後即可提交。

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

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

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

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

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

相關焦點

  • Nginx使用upstream_check_module模塊實現後端節點健康檢查功能
    nginx自帶的針對後端節點健康檢查的功能比較簡單,通過默認自帶的ngx_http_proxy_module 模塊和ngx_http_upstream_module模塊中的相關指令來完成當後端節點出現故障時,自動切換到健康節點來提供訪問。
  • 如何用英語表達"檢查,調查」? 老是說check,外國朋友聽膩了
    也就是說同一個意思,可以用上不同的表 達。很多同學不重視詞彙拓展,導致詞彙量非 常少,同樣一個意思,老是重複那句話,聽者 會覺得你英語基礎太差。如果要表達"檢查,調査",每次都說check, 毫無疑問,外國朋友會聽膩了 。我們來學習其它表達。第一個表達:inspect檢査,看出,視察。
  • SVN子命令add用法淺析
    名稱svn add — 添加文件、目錄或符號鏈。概要SVN子命令add PATH...描述文件、目錄或符號鏈到你的工作拷貝並且預定添加到版本庫。它們會在下次提交上傳並添加到版本庫,如果你在提交之前改變了主意,你可以使用svn revert取消預定。
  • kubernetes 的Health Check策略詳解
    Health Check健康檢查,直白點說就是防微杜漸,k8s是一個編排引擎我們通過k8s部署容器集群,如果說集群容器沒有健康檢查這個過程,我們無法預知我們生產環境會不會部署上錯誤的容器導致服務崩潰。好在k8s 幫我們考慮到了這個問題,健康檢查是k8s重要特性之一,默認有健康檢查,還可以主動設置一些健康檢查。
  • 論文繪圖神器:一行代碼繪製不同期刊格式圖表,哈佛博士後開源
    安裝這款補充包可以通過pip用一行代碼完成:pip install git+https://github.com/garrettj403/SciencePlots.git你也可以選擇手動安裝工具包,把Github上的項目克隆到本地以後,直接將*.mplstyle的所有文件放到Matplotlib的風格(style)路徑下。
  • 如何用2 KB代碼實現3D賽車遊戲?2kPlus Jam大賽了解一下
    然而,將一款 3D 賽車遊戲的代碼壓縮到 2KB 以內,聽起來是不是太誇張了?本文作者 Frank 是一名資深遊戲開發者,在本文中,他詳細介紹了如何靈活運用代碼壓縮、編譯、隨機數生成、代碼復用、設計模式等十八般武藝僅僅通過 2KB 的代碼就能實現一款強大的 3D 賽車遊戲。
  • DSP編程技巧之12-揭開編譯器神秘面紗之代碼規範MISRA-C
    如果我們自己編寫了一個程序,程序能正常編譯,運行起來也實現了我們期望的輸出,那是不是這個程序就很完善了呢?對於工業產品來說,「好」、「能用」和「完善」,或者說「標準」,甚至是代碼的「安全」,顯然不是一個層面的東西。
  • 「體檢」可不是 body check!那應該怎麼說?
    英文詞典裡對body check(或寫成bodycheck)的解釋:a blocking of an opposing player with the body (as in ice hockey or lacrosse)即:用身體阻擋對方球員(如在冰球或長曲棍球中)「體檢」英文怎麼說?
  • 「rain check」可不是「檢查下沒下雨」!真正意思你絕對沒想到...
    ps:【麥田新平臺上線啦】更多純英文影片,每日更新,文末登錄哦 「rain check」是美國人經常會說的口語,平時看美劇或者美國電影,可能經常會遇到「rain check」這個表達。這是什麼意思呢?難道是檢查看看下不下雨?如果這麼認為可就糗大了!
  • 好用到哭!你需要立刻學會的20個Python代碼段
    記住一些幫助提高編碼設計的常用小訣竅是有用的。在必要時刻,這些小訣竅能夠減少你上網查Stack Overflow的麻煩。而且它們會在每日編程練習中助你一臂之力。1. 反轉字符串以下代碼使用Python切片操作來反轉字符串。
  • 網際網路公司2019年初年會Java程式設計師編寫抽獎代碼思維邏輯
    我有一個徒弟在一家公司做Java,小組在做一個抽獎系統,現在給我分配到了抽獎邏輯這方面的實現。EMMM,拿到分配的時候是懵B的。老大給的需求圖給的關鍵表結構DROP TABLE IF EXISTS `dd_annual_meeting_check`;CREATE TABLE `dd_annual_meeting_check` ( `check_id` int(255) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `check_prize_id` varchar
  • 把「body check」翻譯成「體檢」?網友:嚇到寶寶了
    隨著社會保障體系地不斷完善,公司福利也越來越好,現在很多公司每年都會給員工提供身體檢查這項福利,五一假期剛過,我們接到人事部的通知,說是下周要安排員工進行體檢,對於這項福利很多人都表示贊同,畢竟現在很多人,特別是上班族,已經被「亞健康」嚴重困擾,通過體檢可以對自己的身體有更加清晰的了解
  • 「body check」為什麼嚇壞老外!
    很顯然,「body check"可不對!No.1Body check 為什麼不對?其實比較全面的體檢應該這麼說「health check".我想問,體檢的目的是為了什麼?不是為了查身體吧,哈哈那當然啦,體檢的目的就是查查健康問題!I'd like to have a health check.我要去做個體檢。
  • 用Scala實現簡單的Web和API伺服器
    這篇文及章的目的是介紹怎樣用Scala實現簡單的HTTP伺服器,從而提供網頁服務,以響應API請求。我們會建立一個簡單的聊天網站,可以讓用戶發表聊天信息,其他訪問網站的用戶都可以看見這些信息。為簡單起見,我們將忽略認證、性能、用戶掛曆、資料庫持久存儲等問題。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理|深度
    TensorFlow系統更新快速,官方文檔教程齊全,上手快速且簡單易用,支持Python和C++接口。本文依據對Tensorflow(簡稱TF)白皮書[1]、TF Github[2]和TF官方教程[3]的理解,從系統和代碼實現角度講解TF的內部實現原理。以Tensorflow r0.8.0為基礎,本文由淺入深的闡述Tensor和Flow的概念。
  • 幾行代碼教你在Pytorch和Python中實現神經風格遷移
    從左到右為:內容圖像、風格圖像、生成的圖像這個方法相當直觀,本文是在pytorch和python中實現神經風格遷移的簡單指南,並預先解釋了這個方法。Github完整代碼:https://github.com/ksivaman/Transfer-image-styling理解風格和內容神經風格遷移涉及到將一個圖像的風格遷移到另一個圖像的內容上。它們分別是什麼?內容就是圖像的組成部分。可能是風景、海灘環境、花園裡的貓、動物園裡的長頸鹿等等……在典型的圖像分類網絡中,基本上是圖像的標籤。
  • Notepad++中高亮顯示ABAP代碼方法
    做開發的朋友都知道,一段代碼如果關鍵字在編輯器中不高亮顯示,閱讀起來會非常的痛苦,像ABAP這種小眾語言,用的人非常的少,開發人員一般都直接在SAP GUI中開發。但如果你是從網上複製別人分享的代碼,保存在本地時,當你想看這些代碼時,一般不會把代碼複製到GUI中,會直接用記事本打開,比如notepad,notepad++.當然大家都知道,notepad功能沒那麼強大,是不可能高亮代碼的,但notepad++可以,但ABAP語言如何在notepad++中高亮顯示呢?
  • avalon-fsn 1.0.0 發布:輕鬆加速你的 Python 代碼
    avalon-fsnavalon-fsn 是一個Python的編譯構造工具,能夠將你的代碼Cython化使用avalon-fsn的好處 代碼Cython化:Windows下把代碼編譯為
  • Axure實現Material Design的按鈕波浪特效
    本文將以實現谷歌材料設計按鈕的波浪特效為例,提供一種新的自定義Axure元件樣式的方法。需要說明的是:本文所提供的方法已經最大程度小白化,簡單易用,但是對於產品經理來說,本文的教程可能不具有實際的意義,僅提供給喜歡研究Axure Or Code的玩家。