package.jsonの独自ライセンス表記、"UNLICENSED"と"SEE LICENSE IN"の使い分け

  • npm
  • License

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

何を書くか

社内向け・非公開のパッケージに独自ライセンスを設定したい時、package.jsonのlicenseフィールドに何を書くべきか整理した。

npmのlicenseフィールドは基本SPDXライセンス識別子(かその式)前提でチェックされる。なので好きな文字列を自由に書けるわけではない。独自ライセンスにする場合の選択肢は実質2つ。

  • "UNLICENSED"(全部大文字)。SPDX自体の識別子ではないけど、npmが特別扱いしてくれる予約語。「これは誰にも使用許諾しません」という意味になる。
  • "SEE LICENSE IN <ファイル名>"。ライセンス文をpackage.json外の別ファイルに書いて、そこを見てもらう形。

組み合わせて書く

この2つは併記もできる。

{
"name": "example-package",
"version": "1.0.0",
"license": "UNLICENSED OR SEE LICENSE IN LICENSE.txt"
}

「権利は許諾しない」という意思表示(UNLICENSED)と、「詳細な条件はこのファイル見て」という案内(SEE LICENSE IN)を両方乗せられる。社内利用のルールや契約上の話まで書きたいなら、こっちの方が親切。

package.json単体だけ見る人にも「ライセンスの詳細はLICENSE.txt」と伝わるのが利点。完全に社内限定で誰もpackage.json単体を見ない前提なら、"UNLICENSED"だけでも困らない。

LICENSE.txtの中身

決まったフォーマットがあるわけではないので、普通に著作権表記と利用制限を書くだけでいい。

Copyright (c) 2025 Example Corp
All rights reserved. This software is proprietary and confidential.
Unauthorized copying, modification, distribution, or use is strictly
prohibited without prior written consent from Example Corp.

projenでの設定

const project = new typescript.TypeScriptProject({
defaultReleaseBranch: 'main',
name: 'example-package',
license: 'UNLICENSED OR SEE LICENSE IN LICENSE.txt',
});

補足

"Proprietary"や"Commercial"をそのままlicenseに書く例もネット上で見かけるけど、これらはSPDXのリストに無い文字列なので、npm installのたびにlicense should be a valid SPDX license expressionという警告が出る。動作は止まらないけどノイズになるので避けた方がいい。

未確認

古いnpm(3.x系)だと"SEE LICENSE IN"自体が一時期禁止されてた時期があったらしいけど、現行のnpmでは普通に使える。全バージョンを実機で厳密に確認したわけではない。