Skip to content

LICENSE file is missing from the sdist since the switch to uv_build (0.27.x) #20

Description

@BastianZim

Summary

Since the move from Poetry to the uv build backend, the published source distributions no longer contain the LICENSE file. The file is still present in the repository at each tag — it just never makes it into the sdist (or the wheel metadata).

Reproduction

$ pip download --no-binary :all: --no-deps qcs-api-client==0.26.5 -d .
$ tar tzf qcs_api_client-0.26.5.tar.gz | awk -F/ 'NF<=2'
qcs_api_client-0.26.5/LICENSE          # <-- present
qcs_api_client-0.26.5/PKG-INFO
qcs_api_client-0.26.5/README.md
qcs_api_client-0.26.5/pyproject.toml
qcs_api_client-0.26.5/qcs_api_client
 
$ pip download --no-binary :all: --no-deps qcs-api-client==0.27.6 -d .
$ tar tzf qcs_api_client-0.27.6.tar.gz | awk -F/ 'NF<=2'
qcs_api_client-0.27.6/PKG-INFO         # <-- no LICENSE
qcs_api_client-0.27.6/README.md
qcs_api_client-0.27.6/pyproject.toml
qcs_api_client-0.27.6/pyproject.toml.orig
qcs_api_client-0.27.6/qcs_api_client

0.27.7 is affected as well. PKG-INFO also carries no License:, License-Expression: or License-File: field, so there is no license information in the distribution metadata either.

Cause

pyproject.toml declares neither project.license nor project.license-files:

[project]
name = "qcs_api_client"
version = "0.27.6"
description = "A client library for accessing Rigetti QCS API"
include = ["qcs_api_client/py.typed"]
readme = "README.md"
requires-python = ">=3.10,<4.0"

Poetry used to include LICENSE implicitly. uv_build does not — it only ships what is declared, so with no license-files entry the file is dropped from both the sdist and the wheel's .dist-info.

Impact

Downstream redistributors that build from the sdist have to ship the license text with the package, and they only have the sdist to work from. On conda-forge the recipe fails outright, because license_file: LICENSE cannot be resolved (see conda-forge/qcs-api-client-feedstock#46); we have had to vendor a copy of the Apache-2.0 text into the recipe as a workaround.

More generally, Apache-2.0 §4(a) requires that recipients of the Work be given a copy of the License, so the sdist and wheel are currently not self-consistent with the license they are distributed under.

Suggested fix

Declare the license explicitly in pyproject.toml:

[project]
name = "qcs_api_client"
license = "Apache-2.0"
license-files = ["LICENSE"]

uv_build includes everything matched by project.license-files in both the sdist and the wheel's .dist-info, and the PEP 639 License-Expression / License-File metadata fields then get populated too.

If you would rather not adopt PEP 639 metadata yet, [tool.uv.build-backend] source-include = ["LICENSE"] will at least get the file back into the sdist.

Happy to open a PR if that would help.

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentation

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions