今天要為 CI 加上一些功能:Ktlint & Spotless 。
Ktlint 是對 Kotlin 做 lint check 的 library ;而 spotless 則是一個很方便的程式碼 check & reformat 工具,這兩個 library 在一些大型專案都很常見,今天我也會嘗試拿來試試看。
基本上運作的原理是利用 spotless 的檢查任務,輔以 ktlint 來檢查程式碼,幫助我們的專案程式碼更加強壯,同時讓 coding style 也保持一致,下面就開始導入這兩個 library 。
查看 spotless 的 document 可以發現它內部已有支援使用 ktlint ,因此我們只需要 import spotless 就好。
spotless 本身支援許多語言的 coding format ,而在這個專案內我們要使用的是 ktlint 及 一般的 java format check 。
比較特別的是這次使用的 library 主要應用的範圍只在 gradle ,我們要使用 import plugin 的方式使用 library 。首先在 project 的 build.gradle 加入以下程式碼:
buildscript {
ext.ktlintVersion = '0.33.0'
......
}
......
plugins {
id "com.diffplug.gradle.spotless" version "3.24.0"
}
......
spotless {
kotlin {
// 可以規範讓 lint 只在哪些檔案運作,這裏規定檢查所有 .kt file
target "**/*.kt"
ktlint(ktlintVersion)
}
java {
target "**/*.java"
}
}
在 spotless { }
可以設定不同 lint 的規則,有興趣可以看看 spotless 的 document
完成後重新 sync gradle 即可。
spotless 本身提供兩個 gradle task:spotlessCheck
及 spotlessApply
,分別有以下功能:
spotlessCheck
:檢查專案內的 coding style 及換行等格式問題,如果發現有問題 Gradle task 會 Fail。spotlessApply
:同上功能,但是如果發現有問題會自動依照設定上的正確 Format & Coding Style 直接修改程式碼。由於已經有 gradle task ,那麼我們就只要讓 CI 執行時也順便執行我們的 spotless task 即可。修改一下 .travis.yml
:
language: android
android:
components:
- tools
- platform-tools
- build-tools-28.0.3
- android-28
- extra-android-m2repository
- extra-google-m2repository
jdk:
- oraclejdk8
script:
- ./gradlew app:lintDebug testDebug spotlessCheck
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
cache:
directories:
- $HOME/.m2
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
push 到 Github 後就大功告成!