- ブラウザURL入力
- DNS名前→IP
- ルータ経路選択
- ロードバランサ振り分け
- Nginx受け口
- アプリ処理今ここ
- 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 と並べ、例を挙げます。
- ・仕様の説明: 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回実行して同じ結果)。
2026-09-24T17:49:42 sha256 d385626c45a8118e lockfileVersion 3entries (excluding root ""): 583491 MIT32 Apache-2.018 ISC13 MPL-2.010 LGPL-3.0-or-later7 BSD-2-Clause3 Apache-2.0 AND LGPL-3.0-or-later3 BSD-3-Clause1 Apache-2.0 AND LGPL-3.0-or-later AND MIT1 BlueOak-1.0.01 Python-2.01 CC-BY-4.01 CC0-1.01 0BSDsum 583flags: 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件だけでした。
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 にあります。
| 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 を開くと、何が見つかりますか。
lockfile の583件を数える
583件の欄を1行ずつ数えると、MIT が491件で、OR 式は0件でした。ただしこれは lockfile に載った解決結果で、実在は506件、LGPL を含む14件のうち実在は1件です。
分かること 分からないこと欄に書かれた式の分布 式の後ろにある同梱物AND・OR を含む式の件数 手元に実在するかdev・optional の印 配布物に入るか
1件の README を開く
欄は LGPL-3.0-or-later の1語でも、README には29個の同梱ライブラリが並び、特許ライセンスやカンマ区切りの行もあります。LICENSE ファイルは無く、情報は 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)がある。式は書いた人の申告として読む。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
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 なものなど、手元に入っていないエントリも含む。