React Native用のOSSライセンス表記生成ツールを作った

[Flutterで利用しているOSSライセンス一覧を生成するDart CLIを作ってみた](https://qiita.com/ko2ic/items/6a051218c6923b83e604)を読んでReact Native版を作ってみました。
npmパッケージのライセンスをios, androidで表示するためのファイルを出力し、画像のようなライセンスの一覧が作れます。
![about-libraries.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329122/7649dabc-1dca-aba4-e6b3-693833a0ec3e.png)

リポジトリは以下です。
https://github.com/k-tomoyasu/react-native-oss-license
Typescriptで実装しています。

## react-native-oss-licenseの概要
とても大事だけど大変なOSSライセンス管理をサポートするためのCLIツールです。React Nativeの開発で利用しているnpmパッケージのライセンスの一覧を出力します。

`react-native-oss-license`ではnpmパッケージのライセンスのみに対応しています。iOS・Androidのライブラリについては、それぞれライセンス表記を自動化するツールがあるのでそれらと併用を想定しています。npmパッケージから出力したライセンス一覧と、併用しているツールで出力したライセンス一覧をマージします。

 `react-native-oss-license`がサポートするのはnpmパッケージのライセンス一覧を出力するところまでで、マージ部分はユーザに委ねられており、最終的にアプリでライセンスを表示するには次のような作業をすることになります。

1. iOSのライブラリ表記をツールで生成する
2. `react-native-oss-license` で1.の形式に合わせたファイルを出力する
3. 1.2.の結果をマージする
4. Androidのライブラリ表記をツールで生成する
5. `react-native-oss-license` で3.の形式に合わせたファイルを出力する
6. 4.5.の結果をマージする
7. アプリで一覧を表示するように実装する

 また、現在サポートしているツールは[LicensePlist](https://github.com/mono0926/LicensePlist), [license-tools-plugin](https://github.com/cookpad/license-tools-plugin), [AboutLibraries](https://github.com/mikepenz/AboutLibraries)の3つです。

## 各ツールの入力と出力  
iOSでは[LicensePlist](https://github.com/mono0926/LicensePlist)がよく使われており、出力されたplistファイルを利用して設定アプリにライセンス一覧を表記できます。
Androidでは[oss-license-plugin](https://github.com/google/play-services-plugins/tree/master/oss-licenses-plugin)や[license-tools-plugin](https://github.com/cookpad/license-tools-plugin)、[AboutLibraries](https://github.com/mikepenz/AboutLibraries)でアプリ内にライセンスを表示するためのActivity,Fragmentまたは静的ファイルを得ることができます。

react-native-oss-licenseではpackage.json, node_modules以下のファイルを入力に、上記のiOS, Androidのツールに合わせた形式のファイルを出力します。

**ツールごとの入出力**

|tool|プラットフォーム  |入力 |出力  |
|---|---|---|---|
|[LicensePlist](https://github.com/mono0926/LicensePlist)|iOS  |cocoapods, Carthage, Swift Package Managerの依存関係の記述、ライブラリのファイル  |plist  |
|[AboutLibraries](https://github.com/mikepenz/AboutLibraries)|Android  |build.gradle  | Activity
|[license-tools-plugin](https://github.com/cookpad/license-tools-plugin)|Android  |build.gradle  | yml, ymlから生成されるhtmlなど
|[react-native-oss-license](https://github.com/k-tomoyasu/react-native-oss-license)| iOS, Android(React Native)|package.json, node_modules以下のファイル  | plist, AboutLibraries用のstrings.xml, liense-tools-plugin用のyml

処理の流れは以下のようになっています。
1. package.jsonから利用しているパッケージの情報を取得
2. node_modules以下からLICENSEファイル取得
3. iOS, Androidの各形式に合わせたファイルを出力

## CLI
CLIは次のようなオプションがあります。

```sh
> cd {project-root}
> react-native-oss-license --help
Usage: react-native-oss-license [options]

Options:
  -f, --format <format>       require output format. options:[settings-bundle,license-tools-plugin,about-libraries]
  --dev                       include devDependencies (default: false)
  --depth <depth>             dependencies depth (default: null)
  --output-path <outputPath>  specify path where output file (default: "default path")
  --json                      output json to stdout (default: false)
  --only-direct-dependency    output only dependencies you write packages.json. (default: false)
  --version                   show current version
  -h, --help                  output usage information

> react-native-oss-license --format settings-bundle
output settings-bundle format to 'ios/com.k-tomoyasu.react-native-oss-license.Output'
```

`--format`でサポートしている形式を指定(`settings-bundle` or `license-tools-plugin` or `about-libraries`)するか、--jsonオプションを指定することが必須になっています。
`--format`オプション指定時は入力した形式のファイルを出力し、`--json`を指定した際は標準出力にライセンス情報を表示します。jsonを整形して独自の形式でライセンス表記するケースを想定したものです。

## 結果
### settings-bundle(iOS)
![settings-bundle-list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329122/c7674900-88cb-3fc3-2dcc-2c4906ac62c6.png)![settings-bundle-detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329122/7344e389-a2d0-a7cf-ef1a-5958ae3f7928.png)

### about-libraries(Android)
![about-libraries.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329122/7649dabc-1dca-aba4-e6b3-693833a0ec3e.png)

### license-tools-plugin(Android)
![license-tools-plugin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329122/b895d439-4c34-2874-ef14-504f62577c44.png)

## 謝辞
元ネタ記事の[Flutterで利用しているOSSライセンス一覧を生成するDart CLIを作ってみた](https://qiita.com/ko2ic/items/6a051218c6923b83e604) の[リポジトリ](https://github.com/ko2ic/dart_oss_licenses)がとても参考になりました。ありがとうございます！