みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

npm で依存関係のライセンスを確認する

NPM License Checker というそのものずばりの名前のツールを使って,依存関係のライセンスを確認してみます.

package.json

{
  "private": true,
  "dependencies": {
    "vue": "^3.3.4"
  },
  "devDependencies": {
    "license-checker": "^25.0.1"
  }
}

license-checker --production を実行すると,以下のようにproduction の依存関係の情報が出力されます.なお,公開レポジトリならばよいのですが,非公開ならば,自分自身を含まないようにするために,--excludePrivatePackages を追加するのが便利だと思います.

> license-checker --production

├─ @babel/parser
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/babel/babel
│  ├─ publisher: The Babel Team
│  ├─ url: https://babel.dev/team
│  ├─ path: @/node_modules/@babel/parser
│  └─ licenseFile: @/node_modules/@babel/parser/LICENSE
├─ @jridgewell/sourcemap-codec
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/jridgewell/sourcemap-codec
│  ├─ publisher: Rich Harris
│  ├─ path: @/node_modules/@jridgewell/sourcemap-codec
│  └─ licenseFile: @/node_modules/@jridgewell/sourcemap-codec/LICENSE
├─ @vue/compiler-core
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/vuejs/core
│  ├─ publisher: Evan You
│  ├─ path: @/node_modules/@vue/compiler-core
│  └─ licenseFile: @/node_modules/@vue/compiler-core/LICENSE
├─ @vue/compiler-dom
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/vuejs/core
│  ├─ publisher: Evan You
│  ├─ path: @/node_modules/@vue/compiler-dom
│  └─ licenseFile: @/node_modules/@vue/compiler-dom/LICENSE
├─ @vue/compiler-sfc
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/vuejs/core
│  ├─ publisher: Evan You
│  ├─ path: @/node_modules/@vue/compiler-sfc
│  └─ licenseFile: @/node_modules/@vue/compiler-sfc/LICENSE
├─ @vue/compiler-ssr
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/vuejs/core
│  ├─ publisher: Evan You
│  ├─ path: @/node_modules/@vue/compiler-ssr
│  └─ licenseFile: @/node_modules/@vue/compiler-ssr/LICENSE
├─ @vue/reactivity-transform
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/vuejs/core
│  ├─ publisher: Evan You
│  ├─ path: @/node_modules/@vue/reactivity-transform
│  └─ licenseFile: @/node_modules/@vue/reactivity-transform/LICENSE
├─ @vue/reactivity
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/vuejs/core
│  ├─ publisher: Evan You
│  ├─ path: @/node_modules/@vue/reactivity
│  └─ licenseFile: @/node_modules/@vue/reactivity/LICENSE
├─ @vue/runtime-core
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/vuejs/core
│  ├─ publisher: Evan You
│  ├─ path: @/node_modules/@vue/runtime-core
│  └─ licenseFile: @/node_modules/@vue/runtime-core/LICENSE
├─ @vue/runtime-dom
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/vuejs/core
│  ├─ publisher: Evan You
│  ├─ path: @/node_modules/@vue/runtime-dom
│  └─ licenseFile: @/node_modules/@vue/runtime-dom/LICENSE
├─ @vue/server-renderer
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/vuejs/core
│  ├─ publisher: Evan You
│  ├─ path: @/node_modules/@vue/server-renderer
│  └─ licenseFile: @/node_modules/@vue/server-renderer/LICENSE
├─ @vue/shared
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/vuejs/core
│  ├─ publisher: Evan You
│  ├─ path: @/node_modules/@vue/shared
│  └─ licenseFile: @/node_modules/@vue/shared/LICENSE
├─ csstype@3.1.2
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/frenic/csstype
│  ├─ publisher: Fredrik Nicol
│  ├─ path: @/node_modules/csstype
│  └─ licenseFile: @/node_modules/csstype/LICENSE
├─ estree-walker@2.0.2
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/Rich-Harris/estree-walker
│  ├─ publisher: Rich Harris
│  ├─ path: @/node_modules/estree-walker
│  └─ licenseFile: @/node_modules/estree-walker/LICENSE
├─ magic-string@0.30.3
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/rich-harris/magic-string
│  ├─ publisher: Rich Harris
│  ├─ path: @/node_modules/magic-string
│  └─ licenseFile: @/node_modules/magic-string/LICENSE
├─ nanoid@3.3.6
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/ai/nanoid
│  ├─ publisher: Andrey Sitnik
│  ├─ path: @/node_modules/nanoid
│  └─ licenseFile: @/node_modules/nanoid/LICENSE
├─ picocolors@1.0.0
│  ├─ licenses: ISC
│  ├─ repository: https://github.com/alexeyraspopov/picocolors
│  ├─ publisher: Alexey Raspopov
│  ├─ path: @/node_modules/picocolors
│  └─ licenseFile: @/node_modules/picocolors/LICENSE
├─ postcss@8.4.29
│  ├─ licenses: MIT
│  ├─ repository: https://github.com/postcss/postcss
│  ├─ publisher: Andrey Sitnik
│  ├─ path: @/node_modules/postcss
│  └─ licenseFile: @/node_modules/postcss/LICENSE
├─ source-map-js@1.0.2
│  ├─ licenses: BSD-3-Clause
│  ├─ repository: https://github.com/7rulnik/source-map-js
│  ├─ publisher: Valentin 7rulnik Semirulnik
│  ├─ path: @/node_modules/source-map-js
│  └─ licenseFile: @/node_modules/source-map-js/LICENSE
└─ vue@3.3.4
   ├─ licenses: MIT
   ├─ repository: https://github.com/vuejs/core
   ├─ publisher: Evan You
   ├─ path: @/node_modules/vue
   └─ licenseFile: @/node_modules/vue/LICENSE

すべて確認するのが面倒ならば,--summary オプションを追加します.

├─ MIT: 18
├─ ISC: 1
└─ BSD-3-Clause: 1

MIT, ISC, BSD-3-Clause のライセンスで構成されていることがわかりました.

CI/CD パイプラインで使用する

--onlyAllow オプションを利用して,指定されたライセンス以外が含まれている場合にエラーとなるようにします.先程の例では以下のように実行すると ISC ライセンスが含まれているためエラーとなります.

license-checker --production --excludePrivatePackages --onlyAllow 'MIT; BSD-3-Clause'

Package "picocolors@1.0.0" is licensed under "ISC" which is not permitted by the --onlyAllow flag. Exiting.

バージョンアップなどの過程で依存関係はしばしば変更されますので,自動的にライセンス確認ができるようにすると便利です.

なお,--failOn オプションも利用可能ですが,ライセンスの種類はたくさんあるので,ブラックリスト方式で管理すると漏れが発生する可能性があります.--onlyAllow オプションを利用して,ホワイトリスト方式で管理するのがおすすめです.