📄
npm workspaces のモノレポ構成で使用しているパッケージのライセンスを GitHub の Licensed で取得する
最近携わっているプロジェクトでは npm workspaces を使ったモノレポ構成で作ることが多いです。その中でインストールされている個々の npm パッケージのライセンスについて提供する機会があり、以下の 2 つの機能を満たしているツールを探していたところ GitHub 社製の Licensed が最適な選択肢に見えたため、これを使って試してみました。
- npm workspaces に対応していて対象のワークスペースを指定できる
- package.json に指定しているパッケージだけではなく、依存しているすべてのパッケージのライセンスを再帰的に出力してくれる
インストール
Licensed は Ruby gems ですが今回は brew を使ってインストールします。[1]
$ brew install cmake pkg-config
$ brew install licensed
対象のプロジェクト構成
npm workspaces として作成し、ワークスペースとして指定した packages/infra
と packages/server
が存在しています。
今回は packages/server
の package.json から devDependencies
を除いた npm のライセンス一覧を取得したいと思います。
├── package-lock.json
├── package.json
└── packages
├── infra
│ └── package.json
└── server
└── package.json
実行手順
プロジェクトルートに以下のような .licensed.yml
を置きます。
sources:
npm: true # npm が対象
npm:
production_only: true # devDependencies は除く
apps:
- source_path: packages/server # 対象のディレクトリを指定
最低限の設定です。出力したい対象のワークスペースを source_path
に指定します。
これで licensed cache
コマンドを実行すると、パッケージの依存関係も含めてファイルが出力されます。
$ licenced cache
出力結果
.licenses/server/npm
以下に各パッケージの名前が記載された yaml ファイルが出力されています。
.licenses
└── server
└── npm
├── accepts.dep.yml
├── array-flatten.dep.yml
├── body-parser.dep.yml
├── bytes.dep.yml
...
各ファイル名が以下のコマンドの結果と一致することを確認してみてください。
$ npm list -w packages/server --omit dev --all
yaml ファイルにはライセンス情報やバージョン番号などが記載されています。
---
name: accepts
version: 1.3.8
type: npm
summary: Higher-level content negotiation
homepage:
license: mit
licenses:
- sources: LICENSE
text: |
(The MIT License)
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
...
これで npm workspaces を使った場合でもライセンスの出力ができました。
あとはシェル等を使って適当に一覧に整形してやれば良さそうです。
Discussion