オープンソースライセンスの管理をもっと楽にするために Cookpad のプラグインをフォークしてみた

こんにちは。Sansan Android エンジニアの @rockwillj です。もともと Java プログラマーで Android エンジニア歴1年ちょっとです。趣味で Delphi とか C# とか JavaScript とか色々書いてました。今は少しだけ Groovy 勉強してます。

## <i class="fa fa-cubes" aria-hidden="true"></i> はじめに

突然ですが、皆さんはアプリで利用しているライブラリのライセンスをどのように管理しているでしょうか。ライブラリのライセンスをきちんと明示しないとライセンス違反状態になってしまうことは知りつつも、きちんと管理するのって結構面倒ですよね…。

アプリが利用している全ライブラリを抽出して、それらがどのライセンスのもとで公開されているのか1個ずつ調べて、利用しているライブラリとそのライセンスの一覧を HTML などのライセンス文書として作成する。そしてライブラリを追加/削除するたびにライセンス文書を更新する…。いわゆるメンテナンス作業ですね :innocent: 

### <i class="fa fa-cube" aria-hidden="true"></i> ライセンス文書生成プラグイン

上記のような辛い作業を繰り返すのはプログラマーの三大美徳に反しているから、依存ライブラリを抽出してそれらのライセンスを自動的に取得してくれる素敵なプラグインがきっとあるに違いない！！

…ということで見つかったのが以下のプラグインになります。

- https://github.com/cookpad/license-tools-plugin
  - [オープンソースライセンスの管理を楽にする -Android アプリ編](http://techlife.cookpad.com/entry/2016/04/28/183000)
- https://github.com/hierynomus/license-gradle-plugin
  - [build.gradleのdependenciesに追加されたライブラリのライセンス情報を出力する](http://woshidan.hatenablog.com/entry/2016/01/05/215636)

最終的に生成されるライセンス文書 (HTML) が自分好みだったので cookpad/license-tools-plugin を採用しました。ですが自分が作っているアプリでは、結局は自分で HTML 文書を編集する必要がありオープンソースライセンスの管理がそれほど楽になりませんでした :sob:

という訳で、タイトルの通り「オープンソースライセンスの管理をもっと楽にするために Cookpad のプラグインをフォークしてみた」となります。

## <i class="fa fa-cubes" aria-hidden="true"></i> Yet Another Android License Tools Plugin (YAALTP)

![yaaltp_demo.gif](https://qiita-image-store.s3.amazonaws.com/0/103294/ed918bd4-2dea-7bee-5346-9b875439f126.gif)


Cookpad さんの Android License Tools Plugin (cookpad/license-tools-plugin) のフォークです。プラグイン名が長くなるので以下 YAALTP と呼びます。

当初は本家に PR を出すつもりで実装していたのですが、思っていた以上に変更範囲が広がってしまったので、これを PR にするのはさすがに失礼だろ…という理由から別プラグインとして公開しています :sweat_drops: 

### <i class="fa fa-cube" aria-hidden="true"></i> 使い方

詳しくは [README.ja.md](https://github.com/rockwillj/license-tools-plugin/blob/master/README.ja.md) を読んで下さい。それだけだと分かりにくいかもしれないので、念のためチュートリアルを紹介しておきます。

### <i class="fa fa-cube" aria-hidden="true"></i> チュートリアル

まず `app/build.gradle` に以下の内容を記述します。

```groovy
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'info.attosoft.licensetools:license-tools-plugin:0.19.1_r1'
    }
}

apply plugin: 'com.cookpad.android.licensetools'
```

ここでプロジェクトの Gradle ファイルを Sync しておきます。

Android Studio の Terminal で `./gradlew checkLicenses` を実行します。するとライセンス定義ファイル (`app/licenses.yml`) が自動生成されます。

通常なら、次にライセンス定義ファイルを編集するのですが、これはチュートリアルなのでスキップして次に進みます。

Terminal で `./gradlew generateLicensePage` を実行します。するとライセンス文書ファイル (`app/src/main/assets/licenses.html`) が自動生成されます。

生成されたライセンス文書ファイル (`licenses.html`) を Web ブラウザーで表示します。ライセンス定義ファイル (`licenses.yml`) を編集していないので不完全なライセンス文書になっていますが、依存ライブラリとそのライセンスの一覧が一応出力されているはずです。

あとはライセンス文書を参照しながらライセンス定義を適宜編集します。例えばライブラリ名や著作権者、ライセンス、そしてライブラリの順番などを変更するといいでしょう。

ライセンス文書を WebView で表示する方法についは [example/MainActivity](https://github.com/rockwillj/license-tools-plugin/blob/master/example/src/main/java/com/cookpad/android/licensetools/example/MainActivity.java) などを参考にして下さい。

### <i class="fa fa-cube" aria-hidden="true"></i> 機能比較

本家 (cookpad/license-tools-plugin) とフォーク (rockwillj/license-tools-plugin, YAALTP) の機能比較になります。

|   | 本家 (Cookpad) | フォーク (YAALTP) |
|:-:|:--------------:|:---------------:|
| バージョン | v0.19.1 | v0.19.1_r1 |
| 定義ファイル (YAML) の作成 | 標準出力から手動で | 自動生成 |
| 対応ライセンス | Apache 2.0, BSD 2/3-Clause, EPL, ISC, MIT, MPL 2.0 | Apache 1.0/1.1/2.0, BSD 2/3/4-Clause, CDDL, CPL, EPL, FPL, GPL 1.0/2.0/3.0, ISC, LGPL 2.1/3.0, MIT, MPL 1.0/1.1/2.0 |
| 任意のライブラリ (Jar, コピペコード) を定義 | × | ○ |
| 任意のライセンス (独自・混合) を指定 | × | ○ |
| 取得済み定義情報の変更 | × | ○ |
| ライブラリ一覧の出力順変更 | × (ABC順) | ○ (定義順) |
| 不完全な定義ファイル時の成果物 | × (例外＆強制終了) | ○ (警告＆ファイル生成) |
| テンプレート機能 | × | ○ (HTML/CSS) |
| アプリ情報の埋め込み | × | ○ (ヘッダー/フッター) |
| ライセンス文の展開・縮小 | × | ○ (Android 4.4+) |

## <i class="fa fa-cubes" aria-hidden="true"></i> おわりに

Gradle プラグインとして JCenter で公開しておりますので、まずは是非試用してみてください。何かお気づきの点がありましたら、この Qiita 記事のコメントや [Issues (日本語 OK)](https://github.com/rockwillj/license-tools-plugin/issues) などからフィードバックお願いします :pray: 

~~あとモチベーション駆動開発なので Qiita のストックとかいいねとか GitHub の Star とかいただけると嬉しいです :mask:~~

現在考えている新機能としては、ライセンス文書に目次を出力すると、アプリで利用されているライブラリ一覧がひと目で分かっていいいんじゃないかなと。

それでは、ここまでお読みいただきありがとうございました :bow:

### <i class="fa fa-cube" aria-hidden="true"></i> 蛇足

個人的に作りたいものは沢山あるのですが、そのための時間を作るのが下手で本当に困ってます。要領の良い人は「仕事プログラミング70%：趣味プログラミング30%」みたいなことができると思うのですが、自分には性格的に無理で、趣味を仕事にしたためか仕事プログラミング120%みたいになって、趣味プログラミングに時間を割けずにもがいております…。作りたいものが山ほどあるのに！

では YAALTP はどうやって作ったのかというと Sansan の PowerApps という取り組みで作りました。PowerApps というのはアプリエンジニア向けの 20% ルールみたいなもので、毎月 2-day ハッカソンを行います。何を行うかは比較的自由で、アプリをパワーアップとあるけどアプリじゃなくても OK ですし業務と関係なくても OK です。Eight アプリのリードエンジニアは[トイレ監視システム](http://qiita.com/boohbah/items/1e859e716f8351091eac)を作ってましたｗ

Sansan について気になる人は [Sansan Advent Calendar 2016](http://qiita.com/advent-calendar/2016/sansan) や [Sansan Advent Calendar 2015](http://qiita.com/advent-calendar/2015/sansan) をのぞいてみるといいかもね。