Flutterで利用しているOSSライセンス一覧を生成するDart CLIを作ってみたを読んでReact Native版を作ってみました。
npmパッケージのライセンスをios, androidで表示するためのファイルを出力し、画像のようなライセンスの一覧が作れます。
リポジトリは以下です。
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パッケージのライセンス一覧を出力するところまでで、マージ部分はユーザに委ねられており、最終的にアプリでライセンスを表示するには次のような作業をすることになります。
- iOSのライブラリ表記をツールで生成する
-
react-native-oss-license
で1.の形式に合わせたファイルを出力する - 1.2.の結果をマージする
- Androidのライブラリ表記をツールで生成する
-
react-native-oss-license
で3.の形式に合わせたファイルを出力する - 4.5.の結果をマージする
- アプリで一覧を表示するように実装する
また、現在サポートしているツールはLicensePlist, license-tools-plugin, AboutLibrariesの3つです。
各ツールの入力と出力
iOSではLicensePlistがよく使われており、出力されたplistファイルを利用して設定アプリにライセンス一覧を表記できます。
Androidではoss-license-pluginやlicense-tools-plugin、AboutLibrariesでアプリ内にライセンスを表示するためのActivity,Fragmentまたは静的ファイルを得ることができます。
react-native-oss-licenseではpackage.json, node_modules以下のファイルを入力に、上記のiOS, Androidのツールに合わせた形式のファイルを出力します。
ツールごとの入出力
tool | プラットフォーム | 入力 | 出力 |
---|---|---|---|
LicensePlist | iOS | cocoapods, Carthage, Swift Package Managerの依存関係の記述、ライブラリのファイル | plist |
AboutLibraries | Android | build.gradle | Activity |
license-tools-plugin | Android | build.gradle | yml, ymlから生成されるhtmlなど |
react-native-oss-license | iOS, Android(React Native) | package.json, node_modules以下のファイル | plist, AboutLibraries用のstrings.xml, liense-tools-plugin用のyml |
処理の流れは以下のようになっています。
- package.jsonから利用しているパッケージの情報を取得
- node_modules以下からLICENSEファイル取得
- iOS, Androidの各形式に合わせたファイルを出力
CLI
CLIは次のようなオプションがあります。
> 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)
about-libraries(Android)
license-tools-plugin(Android)
謝辞
元ネタ記事のFlutterで利用しているOSSライセンス一覧を生成するDart CLIを作ってみた のリポジトリがとても参考になりました。ありがとうございます!