Dev Study
← コードの外の約束 — 個人情報・ライセンス・生成物の権利
レッスン 8 / 10·約 9 分·第23期 コードの外の約束

license 欄は要約 — AND は「全部に従う」、OR は「どれかを選ぶ」

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理今ここ
  7. DB保存

義務はコードそのものではなく、それで何をしたかに付いてきます。今回は依存の一覧に書かれたライセンスの1語を、どこまで信じてよいかを読みます。

まず結論

package-lock.json の license 欄は、パッケージの許諾条件を1行の SPDX 式に縮めた要約です。式の AND は「同時に全部に従う」、OR は「どれかを選ぶ」で、1語の後ろには29個ものライブラリと、欄には書かれない条件が控えていることがあります。

欄を数えて分かるのは「何が lockfile に載っているか」までです。このマシンに入っているか、実際に誰かへ配布しているかは、別に確かめる問いです。本回は一次ソースが何を書いているかの紹介で、個別の事案の適否は判断しません。

? 読む前に予測

SPDX 仕様は `LGPL-2.1-only OR BSD-3-Clause AND MIT` という式を例に挙げています。この式の読み方として仕様が説明しているのはどれでしょうか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

1行の式が表しているもの

npm の package.json 文書は、license 欄の書き方をこう指示します。

If you're using a common license such as BSD-2-Clause or MIT, add a current SPDX license identifier for the license you're using

複数のライセンスにまたがるときは use an SPDX license expression syntax version 2.0 string とあります。このリポジトリで手元にある506件(このマシンに実在する506件。後述)を調べると、lockfile の license 欄は各パッケージの package.json の license と全件一致しました。

式の演算子を、SPDX 仕様(3.0.1 の Annex B)は次のように定義します。

If presented with a choice between two or more licenses, use the disjunctive binary "OR" operator

If required to simultaneously comply with two or more licenses, use the conjunctive binary "AND" operator

OR は選択、AND は同時に従うことです。「AND と OR は意味が逆」と覚えるのは教材側の要約で、仕様の語は「選ぶ」と「同時に全部」です。

2つが混ざるときの順序も決まっています。仕様は優先順位を + / WITH / AND / OR と並べ、例を挙げます。

LGPL-2.1-only OR BSD-3-Clause AND MIT の読み方(SPDX 仕様の例)
LGPL-2.1-only OR BSD-3-Clause AND MIT書かれた式
AND が先に結ばれる
LGPL-2.1-only1つ目の候補
BSD-3-Clause AND MIT2つに同時に従う組
OR で選ぶ
どちらか一方を選ぶ選んだ側の条件に従う
  • ・仕様の説明: a license choice between either LGPL-2.1-only and the expression BSD-3-Clause AND MIT
  • ・順序を変えたいときは括弧で書く。MIT AND (LGPL-2.1-or-later OR BSD-3-Clause) は先に選んでから MIT を適用する
具体実物

このリポジトリの lockfile を数える

このサイトの package-lock.json(lockfileVersion 3)を、license 欄ごとに数えました。l8-count.py は lockfile を読んで欄の値を数えるだけの検証用スクリプトです(2026-09-24、2回実行して同じ結果)。

$ python3 l8-count.py(先頭18行)コマンド出力
2026-09-24T17:49:42 sha256 d385626c45a8118e lockfileVersion 3
entries (excluding root ""): 583
491 MIT
32 Apache-2.0
18 ISC
13 MPL-2.0
10 LGPL-3.0-or-later
7 BSD-2-Clause
3 Apache-2.0 AND LGPL-3.0-or-later
3 BSD-3-Clause
1 Apache-2.0 AND LGPL-3.0-or-later AND MIT
1 BlueOak-1.0.0
1 Python-2.0
1 CC-BY-4.0
1 CC0-1.0
1 0BSD
sum 583
flags: dev 375 optional 86 devOptional 1

583件で、OR を含む式は0件でした。AND を含む式は4件で、どれも LGPL-3.0-or-later と一緒です。LGPL を含む行(7・9・11行目)を合わせた14件は、すべて @img/ で始まる optional なパッケージで、CPU が限定されています(うち13件は OS も限定)。

ここで数えたのは lockfile に載った解決結果です。このマシンに実在するのは506件で、77件は別の OS・CPU 用などで入っていません。LGPL の14件のうち実在は1件だけでした。

$ npm ls sharp @img/sharp-libvips-darwin-arm64コマンド出力
study-site@0.1.0 /Users/kazu/coding/study-site
└─┬ next@16.2.9
└─┬ sharp@0.34.5
├─┬ @img/sharp-darwin-arm64@0.34.5
│ └── @img/sharp-libvips-darwin-arm64@1.2.4 deduped
└── @img/sharp-libvips-darwin-arm64@1.2.4

直接入れた覚えの無い LGPL のパッケージが、Next.js → sharp(画像処理)を経て入っています。lockfile 上で next は sharp を optionalDependencies に持ちます。

✓ ここまでの確認

このリポジトリの lockfile で `@img/sharp-win32-x64` の license 欄は `Apache-2.0 AND LGPL-3.0-or-later` です。SPDX 仕様の定義に沿った読み方はどれですか。

抽象原理

1語の後ろにあるもの

license 欄は、パッケージ作者が書いた1行です。条件そのものは、その ID が指すライセンス本文の側にあります。

たとえば LGPLv3 の本文は 7,652 バイトしかありません。冒頭にこうあります。

This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below.

LGPLv3 は GPLv3 の条件を取り込み、許可を足す文書です。 LGPL の本文だけを読んでも条件は揃いません。欄の LGPL-3.0-or-later の1語は、2つの文書を指しています。

もう1つ、欄は何を指しているかも要約しています。1つのパッケージが、別々のライセンスで提供される多くのライブラリを抱えていても、欄には1行しか書けません。何が同梱されているかは、欄ではなくパッケージの中を見ないと分かりません。

そして欄の集計は、「入っている」と「配布している」を区別しません。 lockfile に載っていても手元に無いもの、開発中にしか使わない印の付いたもの(dev は375件)もあります。このコースでは、義務はコードそのものではなく、それで何をしたかに付いてくるものとして読みます。どれが配布物に入るかは、欄とは別に確かめる問いです。

具体実物

LGPL-3.0-or-later と書かれた1件を開く

実在する LGPL の1件、@img/sharp-libvips-darwin-arm64@1.2.4 を開きます。package.json の license は LGPL-3.0-or-later、説明は Prebuilt libvips and dependencies for use with sharp on macOS 64-bit ARM です。

パッケージ直下は README.md・lib・package.json・versions.json の4つだけで、LICENSE・COPYING・NOTICE 系のファイルは1つもありません(lib 以下も含めて)。ライセンスの情報は README にあります。

README.md の ## Licensing の表(29行のうち6行を抜粋)表
| aom | BSD 2-Clause + Alliance for Open Media Patent License 1.0 |
| cairo | Mozilla Public License 2.0 |
| glib | LGPLv3 |
| highway | Apache-2.0 License, BSD 3-Clause |
| libvips | LGPLv3 |
| mozjpeg | zlib License, IJG License, BSD-3-Clause |

表はリンクを外して抜粋しています。全体は 29行で、LGPLv3 は8行、MIT Licence も8行です。1行目の aom は特許ライセンスを伴い、4行目の highway は2つのライセンスをカンマで並べています。AND か OR かは書かれていません。 README は SPDX の式で書かれていないので、各行を SPDX の ID にどう対応させるかは読む側の判断になります。

表の後にはこうあります。

Use of libraries under the terms of the LGPLv3 is via the "any later version" clause of the LGPLv2 or LGPLv2.1.

欄の LGPL-3.0-or-later からは見えない経緯です。

✓ ここまでの確認

lockfile で `LGPL-3.0-or-later` の1語になっている `@img/sharp-libvips-darwin-arm64@1.2.4` の README を開くと、何が見つかりますか。

⇄ 2つを見比べる
具体例 A

lockfile の583件を数える

583件の欄を1行ずつ数えると、MIT が491件で、OR 式は0件でした。ただしこれは lockfile に載った解決結果で、実在は506件、LGPL を含む14件のうち実在は1件です。

数から分かること・分からないこと表
分かること 分からないこと
欄に書かれた式の分布 式の後ろにある同梱物
AND・OR を含む式の件数 手元に実在するか
dev・optional の印 配布物に入るか
具体例 B

1件の README を開く

欄は LGPL-3.0-or-later の1語でも、README には29個の同梱ライブラリが並び、特許ライセンスやカンマ区切りの行もあります。LICENSE ファイルは無く、情報は README の表だけです。

欄と README の差表
lockfile の欄 README の表
LGPL-3.0-or-later 29行(LGPLv3 8・MIT 8 ほか)
式で書かれている SPDX の式ではない
LGPLv2 / 2.1 経由と注記

583件を広く浅く数えた結果と、1件を深く開いた結果。両方から言える、license 欄の限界は何でしょうか。

欄を書いたのは誰か、欄には何行まで書けるか、を考えてみてください。

ここから先は法務へ

(a) エンジニアが気づける信号: lockfile に AND・OR を含む式や LGPL・GPL 系の ID が現れた。依存の追加で見覚えの無いパッケージが増えた。README に欄と違う内訳や特許ライセンスが書かれている。LICENSE ファイルが見当たらない。

(b) 法務に持っていく材料: 該当パッケージの名前・版・欄の値、npm ls の経路、README や同梱ファイルのライセンス記述の写し、そしてそれが配布物に入るかの事実(ブラウザへ配る JS か、サーバ上だけで動くか、手元にしか無いか)。最後の点は技術側にしか確かめられません。

(c) この回が言っていないこと: 組み合わせて配布してよいか(互換性)、LGPL の条件を満たしているか、README の各行が SPDX のどの ID に当たるか。どれも本回では判断していません。

この章のまとめ

  • lockfile の license 欄は、作者が書いた1行の SPDX 式。要約であって条件そのものではない。
  • SPDX 仕様で AND は「同時に全部に従う」、OR は「どれかを選ぶ」。括弧が無ければ AND が先に結ばれる。
  • このリポジトリの lockfile は583件、OR 式は0件、LGPL を含む式は14件。実在は506件で、LGPL の実在は1件。
  • LGPL-3.0-or-later の1件を開くと、LICENSE ファイルは無く、README に29行の同梱ライブラリの表がある。
  • LGPLv3 の本文は GPLv3 を取り込む追加の許可で、1語が2つの文書を指す。
  • 公式文書の例にも廃止扱いの ID(GPL-3.0)がある。式は書いた人の申告として読む。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 3正解: 0

SPDX 仕様の例 `MIT AND (LGPL-2.1-or-later OR BSD-3-Clause)` について、仕様の説明と合うのはどれですか。

用語集(3語)
SPDX ライセンス式
ライセンス ID を AND・OR・WITH・括弧で組み合わせる書き方。SPDX Specification 3.0.1 の Annex B が定める。AND は同時に全部に従う、OR は選ぶ。括弧が無ければ AND が OR より先に結ばれる。
SPDX License List
ライセンス ID の一覧。3.29.0(2026-09-16)は740件で、うち32件は廃止扱い(deprecated)。例: `GPL-3.0` は廃止扱いで、後継は `GPL-3.0-only` / `GPL-3.0-or-later`。
lockfile
依存の解決結果を道具が書き出すファイル。npm では package-lock.json。載っているのは解決結果で、OS・CPU 限定の optional なものなど、手元に入っていないエントリも含む。