画竜点睛を衝く@mapyo

日々やった事をつらつらと書くブログです

cookpad/license-tools-pluginを使ってみる

github.com

techlife.cookpad.com

つまづいたこと1

普通にREADMEのSetupを実行しただけではエラーになります。

https://github.com/cookpad/license-tools-plugin#for-gradle-plugin-3-users

ここに書かれてますが、Android Studio 3を使ってる場合は、そのための対応が必要になります。 exampleにサンプルが書かれていました。

https://github.com/cookpad/license-tools-plugin/blob/master/example/build.gradle#L54-L63

def implementation_project(arg) {
    if (project.gradle.startParameter.taskNames.contains("checkLicenses")
            || project.gradle.startParameter.taskNames.contains("generateLicensePage")
            || project.gradle.startParameter.taskNames.contains("generateLicenseJson")
            || project.gradle.startParameter.taskNames.contains("check")) {
        dependencies.implementation(dependencies.project(path: arg.path, configuration: 'default'))
    } else {
        dependencies.implementation(dependencies.project(path: arg.path))
    }
}

こんな感じのコードを入れる必要があります。これを入れると解決!

つまづいたこと2

解決!と思いきや、複数moduleで開発していると、先程作ったメソッドを、

app/build.gradle hoge/build.gradle

など、複数ファイルで同じ記述をしなくてはなりませんでした。共通化したい。。!ということで、ファイルを作り、そのファイルから呼び出すようにしてみます。

license_tools_plugin_helper.gradleというファイルを作って以下のように書きました。

ext.implementation_project = { arg ->
    if (project.gradle.startParameter.taskNames.contains("checkLicenses")
            || project.gradle.startParameter.taskNames.contains("generateLicensePage")
            || project.gradle.startParameter.taskNames.contains("generateLicenseJson")
            || project.gradle.startParameter.taskNames.contains("check")) {
        dependencies.implementation(dependencies.project(path: arg.path, configuration: 'default'))
    } else {
        dependencies.implementation(dependencies.project(path: arg.path))
    }
}

そして、これを各module配下で以下のように書いて読み込みます。([追記] 全moduleで必要な場合は、rootのbuild.gradleのallprojectsに書けば1回で済む事を教えて頂いた!)

apply from: "${rootDir.absolutePath}/license_tools_plugin_helper.gradle"

groovyちゃんとわかってなくて、普通にdefという記述のままファイルに書いたら各所でよしなに使えるのかと思ったら、そうでもなかった。。。org

めんどくさかったこと

./gradlew checkLicenses

これを実行した時に、出力される内容をapp/licenses.ymlに保存して、 自動的に取り切れてなかった部分を修正していくのですが、この作業が結構手間がかかった。。。

運用

  • ciで./gradlew checkLicensesを定期的に実行(checkでも流れる)
  • エラーが出たらその時の出力をymlファイルに追加。手直しする部分は手直しする
  • ./gradlew generateLicensePageでhtmlファイルを再出力してコミット

こんな感じで出来るから楽だなーという感じ。

所感

ライセンス、ライブラリ追加したら更新するの忘れがちなので管理が楽になりました。

play-services-oss-licensesを本当は使いたかったけど、使ってみたところ、使ってるライブラリが表示されなかったので断念しました。原因わからず。。。

DroidKaigiのアプリではちゃんと出力されいる様子だったので、こちらのアプリの作りか、環境が影響してそうな感じ。。。