ライセンシングの例とユーザシナリオ

PEP 639 では、 配布物アーカイブ のライセンスを宣言する方法やライセンスファイルへのパス、そして、その他の法的に要求される情報を仕様化しています。この説明文書は、レガシーなライセンス宣言から標準化されたそれへどのようにして移行するのかに関する明確なガイダンスを提供することを目的としています。より新しいガイダンスを適用しようと試みる前に、好みのビルドバックエンドが PEP 639 をサポートしていることを確認してください。

ライセンシングの例

基本的な例

Setuptools プロジェクトそれ自体は、 version 75.6.0 時点で、自身のプロジェクトソースコードのメタデータ内の License フィールドを使っていません。さらに、共通のパターンにマッチさせることで現在使用している LICENSE のようなライセンスに関係するファイル群を自動的に含める自身の仕組みに立脚しているので、以前にはそうしていましたがもはや license_file / license_files を明示的に指定することもしていません。

以下のようなライセンスに関連するメタデータを pyproject.toml の中に含みます:

[project]
classifiers = [
    "License :: OSI Approved :: MIT License"
]

PEP 639 への最も単純な移行は、代わりにこれを使うことから構成されます:

[project]
license = "MIT"

あるいは、プロジェクトで setup.cfg を使っているなら、その中の [metadata] テーブルで:

[metadata]
license = MIT

配布パッケージ のためのコアとなるメタデータの出力はこんなふうになるでしょう:

License-Expression: MIT
License-File: LICENSE

LICENSE ファイルは、 sdist 内なら /setuptools-VERSION/LICENSE に、 wheel 内なら /setuptools-VERSION.dist-info/licenses/LICENSE に、そこから展開されるとインストール先のサイトディレクトリ (例えば site-packages/) に置かれることでしょう; ここで / はそれぞれのアーカイブのルートディレクトリであり、 {VERSION} はコアとなるメタデータ内の Setuptools のリリースのバージョンです。

先進的な例

仮に Setuptools が、 setuptools/_vendor/pkg_resources/_vendor/ のディレクトリ内に第三者のプロジェクトのライセンスを包含していたとしましょう; 特にこの場合は:

packaging==21.2
pyparsing==2.2.1
ordered-set==3.1.1
more_itertools==8.8.0

適切なライセンス表現は:

packaging: Apache-2.0 OR BSD-2-Clause
pyparsing: MIT
ordered-set: MIT
more_itertools: MIT

Setuptools 純正のものとベンダーが取り込んだものの両方をカバーするこみいったライセンス条項をすべてひとつにまとめて、これらのメタデータを包含することになるでしょう。そのような条項はこんなものになるでしょう:

MIT AND (Apache-2.0 OR BSD-2-Clause)

加えて、ライセンスの要求事項次第で、パッケージ内に適切なライセンスファイルが含まれていなければなりません。 LICENSE ファイルには Setuptools や pyparsingmore_itertoolsordered-set が使用する MIT ライセンスとコピーライトが含まれているものと思ってください; そして、setuptools/_vendor/packaging/ ディレクトリの LICENSE* ファイル群には Apache 2.0 と 2 項の BSD ライセンスの文言があり、Packaging コピーライト文言や ライセンス選択通知 があるものと思ってください。

明確にいうと、ライセンスファイル群はプロジェクトソースコードツリー内の以下の (プロジェクトルートと pyproject.toml からの相対) パスに位置するものと仮定しています:

LICENSE
setuptools/_vendor/packaging/LICENSE
setuptools/_vendor/packaging/LICENSE.APACHE
setuptools/_vendor/packaging/LICENSE.BSD

これらをすべて一緒にすると、 pyproject.toml はこんなふうになるでしょう:

[project]
license = "MIT AND (Apache-2.0 OR BSD-2-Clause)"
license-files = [
    "LICENSE*",
    "setuptools/_vendor/LICENSE*",
]

あるいは、別の方法としては、ライセンスファイル群を明示的に示すこともできます (パスはglobパターンとして解釈されるでしょう):

[project]
license = "MIT AND (Apache-2.0 OR BSD-2-Clause)"
license-files = [
    "LICENSE",
    "setuptools/_vendor/LICENSE",
    "setuptools/_vendor/LICENSE.APACHE",
    "setuptools/_vendor/LICENSE.BSD",
]

setup.cfg をプロジェクトで使っているなら、こんなふうに定義することができます:

[metadata]
license = MIT AND (Apache-2.0 OR BSD-2-Clause)
license_files =
    LICENSE
    setuptools/_vendor/packaging/LICENSE
    setuptools/_vendor/packaging/LICENSE.APACHE
    setuptools/_vendor/packaging/LICENSE.BSD

どちらのアプローチでも、配布物内のコアとなるメタデータの出力はこんな風になるでしょう:

License-Expression: MIT AND (Apache-2.0 OR BSD-2-Clause)
License-File: LICENSE
License-File: setuptools/_vendor/packaging/LICENSE
License-File: setuptools/_vendor/packaging/LICENSE.APACHE
License-File: setuptools/_vendor/packaging/LICENSE.BSD

結果として生成される sdist の中には、 / をアーカイブのルートディレクトリとし、 {VERSION} をコアとなるメタデータの中で指定された Setuptools のバージョン番号として、ライセンスファイル群が次のようなパスに配置されるでしょう:

/setuptools-{VERSION}/LICENSE
/setuptools-{VERSION}/setuptools/_vendor/packaging/LICENSE
/setuptools-{VERSION}/setuptools/_vendor/packaging/LICENSE.APACHE
/setuptools-{VERSION}/setuptools/_vendor/packaging/LICENSE.BSD

ビルド済みの wheel では、 / をルートディレクトリとし、 {VERSION} を先述の通りとして、ライセンスファイル群は次の場所に保存されるでしょう:

/setuptools-{VERSION}.dist-info/licenses/LICENSE
/setuptools-{VERSION}.dist-info/licenses/setuptools/_vendor/packaging/LICENSE
/setuptools-{VERSION}.dist-info/licenses/setuptools/_vendor/packaging/LICENSE.APACHE
/setuptools-{VERSION}.dist-info/licenses/setuptools/_vendor/packaging/LICENSE.BSD

最後に、インストールされたプロジェクトでは、 site-packages/ をサイトディレクトリとし、 {VERSION} を先述の通りとして、ライセンスファイル群は次の場所にインストールされるでしょう:

site-packages/setuptools-{VERSION}.dist-info/licenses/LICENSE
site-packages/setuptools-{VERSION}.dist-info/licenses/setuptools/_vendor/packaging/LICENSE
site-packages/setuptools-{VERSION}.dist-info/licenses/setuptools/_vendor/packaging/LICENSE.APACHE
site-packages/setuptools-{VERSION}.dist-info/licenses/setuptools/_vendor/packaging/LICENSE.BSD

表現 <Expression> の例

いくつかの追加の License-Expression の正当な値の例:

License-Expression: MIT
License-Expression: BSD-3-Clause
License-Expression: MIT AND (Apache-2.0 OR BSD-2-Clause)
License-Expression: MIT OR GPL-2.0-or-later OR (FSFUL AND BSD-2-Clause)
License-Expression: GPL-3.0-only WITH Classpath-Exception-2.0 OR BSD-3-Clause
License-Expression: LicenseRef-Public-Domain OR CC0-1.0 OR Unlicense
License-Expression: LicenseRef-Proprietary
License-Expression: LicenseRef-Custom-License

ユーザシナリオ

以下では、それぞれにガイダンスを提供しながら、ユーザ視点からのよくあるユースケースをカバーします。以下に述べることを法律上の推奨事項であると見做すべきでは ない ことを銘記するとともに、読者は、それぞれの状況に応じた細部について確信を持てないならば、それを法律上の管轄範囲とするライセンスを持った法律実務家に相談するべきす。

配布するつもりのないプライベートなパッケージがあります

そのパッケージが、例えば会社や組織あるいは家庭の外に公開・共有されていないなら、 通常は 厳格に公式のライセンス (ファイル) を含める必要があるわけではありませんし、だからここで何か追加の作業をする必要があるわけではないでしょう。

しかしながら、それでも、パッケージングツール群によって自動的に取り込まれるであろうプロジェクトのルートディレクトリの LICENSE.txt ファイルの中に、パッケージの設定の中にライセンス条項として LicenseRef-Proprietary や著作権情報やその他の法的通知を含めておくことは良い考えです。

プロジェクトを特定のライセンスの下で配布したい

特定のライセンスを使用するには、もし LICENSE または COPYING で始まるファイルを既に置いているのでなければ、単にリポジトリのルートディレクトリにある LICENSE.txt ファイルの中にそのテキストを貼り付けて、 使っているパッケージングツールがサポートしているなら pyproject.toml の中の [project] の下に license = "LICENSE-ID" を追加するか、そうでなければ設定ファイルの中に追加すれば良いだけです。 ChooseALicenseSPDX のようなサイトに行けば、 LICENSE-ID とコピー可能なライセンス条項を見つけることができるでしょう。

多くの人気のあるソースコードホスト・プロジェクトテンプレート・パッケージングツールによってライセンスファイルを加えることができ、将来に渡って表現をサポートするでしょう。

既にライセンスが付与された既存パッケージを維持管理しています

ライセンスファイルやプロジェクト内のメタデータが既に存在しているなら、新機能の利点を得るためには2,3の捻りを加えるだけで良いはずです。

プロジェクト設定ファイルにおいて、ライセンス条項を license (pyproject.toml[project] テーブル) の下か、使っているパッケージングツールでの相当する場所に置き、古いやり方である license テーブルサブキーや License:: 分類子を取り除くのを忘れないでください。既存の license 値は、そのままでも正当なもの (例えば MITApache-2.0 OR BSD-2-Clause 等) かもしれません; そうでなければ、採用しているライセンスに合致する識別子を SPDX ライセンスリスト で確認して下さい。

pyproject.toml の中の [project] の下の license-files か、使用しているツールの設定ファイルに、ライセンスファイル群を列挙しておくのを忘れないでください。

これが実際にどのように動作するのかに関する、簡明ではあるが一通り揃った実世界でのデモが、 基本的な例 に出ています。また、ライセンス分類子からライセンス条項へ対応付けるやり方に関するベストエフォートのガイダンスが PEP 639 の著者達によって提供された ライセンス分類子から SPDX 識別子へ にありますので、こちらもご覧ください。パッケージングツールが、レガシーのライセンスメタデータを自動的に変換する機能を持っているかもしれませんので、さらなる情報を得るために使っているツールの説明文書を調べて下さい。

私のパッケージには異なるライセンスの他のソースコードが含まれています

プロジェクトが、提供された依存関係ないし他のオープンソースソフトウェアからコピーされたファイル群のような、相異なるライセンスでカバーされたソースコードを含んでいるなら、関与するライセンスとそれらの間の関係を記述するために、ライセンス条項を構築することができます。

端的に言えば、 License-1 AND License-2両方の ライセンスが適用されること (例えば、同梱されたあるファイルがもう一つの方のライセンスの下にある) を意味し、また、 License-1 OR License-2 では、ユーザの選択によって、 いずれか一方の ライセンスを使用することができます (例えば、複数のライセンスから一つを選ぶことをユーザに許したい) 。もっと込み入った状況でさえもカバーできる表現を組み立てるためのグループ化のために括弧 (()) を使うことができます。

プロジェクトの設定ファイルで、 (pyproject.toml[project] テーブルの) license の下にライセンス表現を入れるか、または、使用しているパッケージングツールの同等物を入れるか、いずれかを行なって、旧来の license テーブルサブキーや License:: 分類子を削除するのを忘れないでください。

また、すべてのライセンスの全文をプロジェクトリポジトリのどこかにファイルの形で追加しておくのを忘れないでください。 (ツールが対応しているなら) pyproject.toml 内の [project] の下の license-files の下に、それら一つひとつの相対パスか glob パターンを列挙するか、使用しているツールの設定ファイルに列挙して下さい。

例として、もしプロジェクトが MIT ライセンスを適用していて、しかし、他所から提供された依存関係 (ここでは packaging としましょう) が Apache 2.0 もしくは 2条項 BSD でライセンスされているなら、ライセンス表現は MIT AND (Apache-2.0 OR BSD-2-Clause) のようになるでしょう。すべてのライセンス全文をリポジトリに入れておくために、リポジトリのルートディレクトリに LICENSE.txt を置き、 _vendor/ サブディレクトリの下に LICENSE-APACHE.txtLICENSE-BSD.txt を置くでしょうし、 glob パターンとして ["LICENSE.txt", "_vendor/packaging/LICENSE*"] のように指定するか、あるいは、リテラルのファイルパスとして ["LICENSE.txt", "_vendor/LICENSE-APACHE.txt", "_vendor/LICENSE-BSD.txt"] のように指定することでしょう。

これを現実世界の複雑なプロジェクト向けに完全に作業を尽くした、エンドトゥーエンドなアプリケーションのための 先進的な例 を、多くの技術面での詳細とともに見てほしいのと、さらなる手助けや SPDX の識別子と表現を使った例を チュートリアル で当たってみて下さい。