iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
0
自我挑戰組

Android Architecture 及 Unit Test系列 第 12

[Day 12] 使用 Ktlint & Spotless

  • 分享至 

  • xImage
  •  

今天要為 CI 加上一些功能:Ktlint & Spotless

Ktlint 是對 Kotlin 做 lint check 的 library ;而 spotless 則是一個很方便的程式碼 check & reformat 工具,這兩個 library 在一些大型專案都很常見,今天我也會嘗試拿來試試看。

基本上運作的原理是利用 spotless 的檢查任務,輔以 ktlint 來檢查程式碼,幫助我們的專案程式碼更加強壯,同時讓 coding style 也保持一致,下面就開始導入這兩個 library 。

Gradle

導入 spotless

查看 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

spotless 本身提供兩個 gradle task:spotlessCheckspotlessApply,分別有以下功能:

  • spotlessCheck:檢查專案內的 coding style 及換行等格式問題,如果發現有問題 Gradle task 會 Fail。
  • spotlessApply:同上功能,但是如果發現有問題會自動依照設定上的正確 Format & Coding Style 直接修改程式碼。

Use in Travis CI

由於已經有 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 後就大功告成!


上一篇
[Day 11] Travis CI
下一篇
[Day 13] Dagger 2:Part 1 DI with Dagger
系列文
Android Architecture 及 Unit Test30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言