wandfuldays

pnpmでGPLライセンス混入を防ぐ方法|GitHub ActionsによるCI実装例

2026-02-14

pnpm licenses ls を使ってコピーレフトライセンス混入をCIで自動検出。

こんにちは、wandです。

Node.js で開発していると、多数の npm パッケージに依存することになります。
そのとき気になるのが「ライセンス管理」です。

特にプロプライエタリ製品を開発している場合、GPL などのコピーレフトライセンスを意図せず取り込んでしまうと、公開義務などの法的リスクにつながる可能性があります。

この記事では、pnpm プロジェクトでライセンスチェックをCI(GitHub Actions)に組み込んで継続的に管理する方法を解説します。

npm パッケージのライセンスについて

npm パッケージにはさまざまなライセンスが存在します。

代表的なもの:

  • MIT – 非常に寛容なライセンス
  • Apache-2.0 – 特許条項を含む寛容ライセンス
  • GPL-3.0 – 強いコピーレフトライセンス
  • LGPL-3.0 – GPLより条件が緩いがコピーレフト系
  • AGPL-3.0 – ネットワーク越し利用も対象とするGPL

コピーレフトとは?

コピーレフトとは、「対象ソフトウェアを改変・再配布する場合、同じライセンス条件を維持することを求める考え方」です。
特に GPL 系ライセンスでは、派生物に対してソースコード公開義務が生じる可能性があります。

理念としては合理的ですが、プロプライエタリ製品とは両立しにくいケースもあります。
そのため、「知らないうちに GPL を入れていた」という状態を防ぐ仕組みが重要になります。
その最も確実な方法が CIでの自動チェックです。

パッケージマネージャー別ライセンス管理

主要な Node.js パッケージマネージャーとして以下があげられます:

  • npm
  • yarn
  • pnpm

npm / yarn の場合 | license-checker

license-checker パッケージを使ってライセンス一覧を取得できます。
ただし最終更新は2019年で、現在は積極的にメンテナンスされているとは言い難い状況です。

また license-checker は npm / yarn の依存解決構造を前提としているため、 pnpm の独自の node_modules 構造では正しく解析できない場合があります。

実際、npm や yarn から pnpm に移行した場合、 気づかないうちにライセンスチェックが機能しなくなっているケースがありました。
pnpm プロジェクトでは、後述する pnpm licenses ls を使用するのが確実です。

pnpm の場合 | pnpm licenses ls

pnpm には標準で以下のコマンドがあります。

pnpm licenses ls

追加パッケージ不要で、依存関係のライセンス一覧を出力できます。
これが最もシンプルかつ確実な方法です。

GitHub Actions で GPL 系ライセンスをブロックする

以下は、GPL 系ライセンスが含まれていないことを CI で検証する例です。

name: License Check

on:
  pull_request:
  push:
    branches: [ main ]

jobs:
  license-check:
    runs-on: ubuntu-latest
    timeout-minutes: 1
    steps:
      - uses: actions/checkout@v6.0.2
      - uses: pnpm/action-setup@v4.2.0
      - name: Check licenses
        run: |
          set -euo pipefail
          ! pnpm licenses ls --prod --no-optional | grep -q GPL

コマンドのポイント解説

--prod

devDependencies を除外します。

開発専用パッケージ(例:テストツール)まで本番ポリシーで縛らない場合に有効です。

--no-optional

optionalDependencies を除外します。

使用していない optional パッケージによる誤検知を防げます。

例:一部環境でのみ使用されるネイティブ依存など。

まとめ

pnpm プロジェクトでは、

  • pnpm licenses ls を使う
  • CI に組み込む
  • GPL 系をブロックする

ことで、ライセンスリスクを継続的に管理できます。

ライセンス管理は後から気づくと修正コストが大きくなりますので、
依存追加のタイミングで自動的に検出できる仕組みを入れておくことが重要です。
ぜひプロジェクトに組み込んでみてください!


wand

「wand」は魔法の杖を意味します。魔法のようにさまざまなものを自分の手で生み出せるようになりたい、そんな思いを込めました。 ハンドメイド、家庭菜園、DIY、プログラミング等、「つくる」をテーマに色々なことをしていきたいと思っています。 Amazonのアソシエイトとして、wand は適格販売により収入を得ています。 GitHub: https://github.com/wand2016