當我們自己一個人寫程式的時候,只要程式碼沒有寫錯,排版風格愛怎麼寫就怎麼寫,什麼時候要換行、什麼時候要空行都可自己決定。但團隊合作時就不一樣了,假如每個成員寫程式碼的排版風格都不一樣的話,每個人都要花額外的精神去「適應」別人寫的程式碼,這樣就會耗損一些團隊效率。
這時我們可以在專案裡導入 Linter 的機制。也就是說我們可以預先定義好程式碼排版的規則(Rule),然後由排版程式幫我們檢查。若有風格不符合的部份會逐一列出,我們再進行修正即可。這種 Linter 工具廣泛地出現在各個程式語言生態系中,甚至有些程式語言就內建 fmt
之類的工具。
在 Kotlin 生態系裡,我們可以使用由 Pinterest 團隊推出的 ktlint,其排版規則來自 Kotlin 官方 及 Android 團隊 ,也支援擴充 Ruleset。專案原本是以 CLI 工具的方式發佈,但也有社群整合好的 Gradle Plugin 方便使用。
接下來我們就來示範如何安裝 ktlint 在我們的練習專案裡。
首先開啟專案根目錄底下的 build.gradle.kts
,在 plugins
區段裡新增 org.jmailen.kotlinter
,更新後的 Build Script 看起來會像這樣:
plugins {
// ...
id("org.jmailen.kotlinter") version "3.6.0"
}
別忘了 Reload Gradle 喔!Reload 後我們會在 IntelliJ IDEA 的 Gradle 面板裡 Tasks 底下看到多了一個 formatting 的群組,裡面有 lintKotlin
的任務可以執行。為了測試它的功效,我們先把原本寫好的程式碼固定弄亂,刪掉一些空行、增加一些不必要的空白等,然後對 lintKotlin
點兩下,Gradle 就會使用 ktlint 來檢查專案程式碼的排版風格。
> Task :lintKotlinMain FAILED
.../ShoppingCart.kt:1:1: Lint error > [final-newline] File must end with a newline (\n)
.../ShoppingCart.kt:10:22: Lint error > [colon-spacing] Missing spacing after ":"
.../ShoppingCart.kt:10:25: Lint error > [curly-spacing] Missing spacing around "{"
.../ShoppingCart.kt:10:26: Lint error > [indent] Missing newline after "{"
ktlint 檢查完成後,應該會看到類似像上面的這種輸出。ktlint 會指出在哪個檔案的哪一行的哪一欄找到不合排版風格的程式碼以及原因,我們就可以依照這個清單開始修正。
不過我們都是人,要手動一個一個修正也太累了吧?這個練習專案的檔案還不多,修正起來或許還算容易,假如是大型專案,動輒上百個檔案時就不是這麼容易了。好在 ktlint 也支援自動修正,大多數的問題既然找得出原因就知道該怎麼修正,只要透過 Gradle 執行另一個在 formatting 群組底下的任務 formatKotlin
即可。
> Task :formatKotlinMain
.../ShoppingCart.kt: Format fixed
> Task :formatKotlinTest
.../ShoppingCartTest.kt: Format fixed
> Task :formatKotlin
BUILD SUCCESSFUL in 286ms
2 actionable tasks: 2 executed
ktlint 重新修正程式碼排版風格後,應該會看到類似像上面這樣的輸出。再實際去看檔案內容,剛剛被我們故意搞亂的那些程式碼通通都回復到原樣了,是不是很方便呢?
今天跟大家討論了如何在專案裡導入 ktlint 程式碼排版風格檢查工具,方便我們在團隊合作時統一所有成員的排版風格,還可以幫我們自動修正,維持整個程式碼庫裡的品質。不過,目前我們是在專案裡手動執行這些檢查,接下來我們就要在 TeamCity 上設定這個檢查動作,未來若有成員推 Commit 前沒有先通過排版風格檢查的話,那 TeamCity 就會自動將該次的 Build 標記為失敗,我們就可以即時收到提醒通知,儘早處理和改善喔!