부록: 라이선싱 예제
초록
이 문서는 실제 사례에서 PEP 639 적용에 대한 예제를 안내합니다.
예제
기본 예제
Setuptools 프로젝트 자체는 버전 59.1.1기준으로 자체 프로젝트 소스 메타데이터에서 License 필드를 사용하지 않습니다. 또한, Setuptools는 LICENSE 파일과 같이 일반적인 패턴과 일치하는 라이선스 관련 파일을 자동으로 포함하는 자체 기능에 의존하기 때문에, 이전처럼 license_file/license_files를 명시적으로 지정하지 않습니다.
Setuptools는 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-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 파일에 MIT 라이선스의 텍스트와 Setuptools, pyparsing, more_itertools, ordered-set이 사용하는 저작권이 포함되어 있고, setuptools/_vendor/packaging/ 디렉터리의 LICENSE* 파일에 Apache 2.0 및 2-clause 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가 사이트 디렉터리이고 ${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