クロスプラットフォーム開発におけるOSSライセンスの自動出力を行う

前提としてモバイルアプリのライセンスの表記について。
Web開発であればソースコードが閲覧できるためソースコード内にライセンス表記が含まれていれば、サイト内にライセンス用のページを作成する必要がありませんが、モバイルアプリ開発である場合は、少し状況が違ってきます。
モバイルアプリにおいてはソースコードの配布というよりも、アプリの配布になるためアプリ内に明示的にOSSのライセンス表記して誰でも簡単に閲覧できるする必要が有ります。

せっかく作ったアプリが規約に引っかかってしまわないためにも、ライセンス周りは以下の3つを実装し自分を守るようにしましょう。
– 利用規約
– プライバシーポリシー
– OSSライセンスの表示

さて、前置きはここまでにしてnpmパッケージを自動出力させます。おそらくこの方法を使用すればReact Nativeのアプリ開発でも使えるはずです。

OSSライセンスの自動出力

license-checker – npmを導入してインストールされているnpmパッケージの情報をjsonファイルとして保存、出力されたファイルをページ内で読み込むというフローになります。

ではインストールして使用してみましょう、インストールはglobalでやっておくと、今後license-checkerコマンドをが使えるので便利です。

$ npm install -g license-checker
license-checker@25.0.1

   --production only show production dependencies.
   --development only show development dependencies.
   --unknown report guessed licenses as unknown licenses.
   --start [path of the initial json to look for]
   --onlyunknown only list packages with unknown or guessed licenses.
   --json output in json format.
   --csv output in csv format.
   --csvComponentPrefix column prefix for components in csv file
   --out [filepath] write the data to a specific file.
   --customPath to add a custom Format file in JSON
   --exclude [list] exclude modules which licenses are in the comma-separated list from the output
   --relativeLicensePath output the location of the license files as relative paths
   --summary output a summary of the license usage
   --failOn [list] fail (exit with code 1) on the first occurrence of the licenses of the semicolon-separated list
   --onlyAllow [list] fail (exit with code 1) on the first occurrence of the licenses not in the semicolon-seperated list
   --direct look for direct dependencies only
   --packages [list] restrict output to the packages (package@version) in the semicolon-seperated list
   --excludePackages [list] restrict output to the packages (package@version) not in the semicolon-seperated list
   --excludePrivatePackages restrict output to not include any package marked as private

   --version The current version
   --help  The text you are reading right now :)

以下のコマンドで./license.jsonにJSONファイルが出力されます。

$ license-checker --packages --json ./license.json

自作パッケージを除外

ここで一個注意しておきたいのが、先程出力したJSONファイルには自作したnpmパッケージも一つのパッケージとして出力されます。もしも、自作したnpmパッケージを除外したい場合は、パッケージの内のpackage.jsonを"private": trueになるように編集してください

{
  "name": "your-package",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "RyotArch",
  "private": true // privateをtrueにします
}

ソースの解析

さて、JSONデータが準備できたらパースしていい感じに表示します。

 import licensesJson from './license.json';

const licenseKeys = Object.keys(licenses);
const newLicenses = {};
const versions = {};

licenseKeys.forEach((key) => {
  const license: any = licenseObject[key];
  if (!license.private) {
    const tmp = key.match(/(.+)@(.+)$/)
    if (!tmp) {
      return;
    }
    const name = tmp[1];
    const version = tmp[2];
    if (!versions.hasOwnProperty(name)) {
      newLicenses[key] = license;
      versions[name] = version;
    } else if (compareVersions(versions[name], version) < 1) {
      delete newLicenses[name + '@' + versions[name]]
      newLicenses[key] = license;
      versions[name] = version;
    }
  }
});

console.log(newLicenses); // あとはページに表示する

参考リンク

関連記事