📄

npm workspaces のモノレポ構成で使用しているパッケージのライセンスを GitHub の Licensed で取得する

2024/05/14に公開

最近携わっているプロジェクトでは 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/infrapackages/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 を使った場合でもライセンスの出力ができました。
あとはシェル等を使って適当に一覧に整形してやれば良さそうです。

脚注
  1. macOS を使っています。他の OS でのインストール方法はこちらを参照してください。 ↩︎

Discussion