附录:许可证示例
摘要
本文档包含有关 PEP 639 在实际 示例 中应用的指导。
示例
基本示例
Setuptools 项目本身,截至 版本 59.1.1,在其项目源代码元数据中不使用 License 字段。此外,它不再明确指定 license_file/license_files,因为 Setuptools 依赖于其自动包含匹配常见模式的与许可证相关的文件,例如它使用的 LICENSE 文件。
它在其 setup.cfg 中包含以下与许可证相关的元数据:
[metadata]
classifiers =
License :: OSI Approved :: MIT License
迁移到 PEP 639 最简单的做法是改用以下方法:
[metadata]
license_expression = MIT
或者,在 pyproject.toml 的 [project] 表中:
[project]
license = "MIT"
分发包的输出核心元数据将是:
License-Expression: MIT
License-File: LICENSE
LICENSE 文件将存储在 sdist 中的 /setuptools-${VERSION}/LICENSE 和 wheel 中的 /setuptools-${VERSION}.dist-info/licenses/LICENSE,并在安装时从中解压到 site 目录(例如 site-packages);/ 是相应存档的根目录,${VERSION} 是核心元数据中 Setuptools 发布的版本。
高级示例
假设 Setuptools 要包含 vendored 到 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 本身及其 vendored 依赖项的综合许可证表达式将包含这些元数据,将所有许可证表达式合并为一个。这样的表达式可能是:
MIT AND (Apache-2.0 OR BSD-2-Clause)
此外,根据许可证的要求,必须在包中包含相关的许可证文件。假设 LICENSE 文件包含 MIT 许可证的文本以及 Setuptools、pyparsing、more_itertools 和 ordered-set 使用的版权声明;而 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
总而言之,我们的 setup.cfg 将是:
[metadata]
license_expression = 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
在 pyproject.toml 的 [project] 表中,可以通过 glob 模式指定许可证文件:
[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",
]
无论采用哪种方法,分发中的输出核心元数据将是:
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 作为 site 目录,并将 ${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
表达式示例
一些额外的有效 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