构建和发布包
uv 支持通过 uv build
将 Python 包构建为源码和二进制发行版,并通过 uv publish
将它们上传到注册中心。
为打包准备项目
在尝试发布项目之前,你需要确保它已准备好打包分发。
如果你的项目在 pyproject.toml
中没有包含 [build-system]
定义,uv 默认不会构建它。这意味着你的项目可能还没有准备好分发。在项目概念文档中详细了解声明构建系统的影响。
注意
如果你有不想发布的内部包,可以将它们标记为私有:
此设置会使 PyPI 拒绝上传你的包进行发布。它不会影响其他注册中心的安全或隐私设置。
我们还建议仅生成每个项目的令牌:如果没有与项目匹配的 PyPI 令牌,就不会意外发布。
构建包
使用 uv build
构建包:
默认情况下,uv build
将在当前目录中构建项目,并将构建产物放在 dist/
子目录中。
或者,uv build <SRC>
将在指定目录中构建包,而 uv build --package <PACKAGE>
将在当前工作区中构建指定的包。
信息
默认情况下,uv build
在解析 pyproject.toml
的 build-system.requires
部分的构建依赖项时,会遵循 tool.uv.sources
。发布包时,我们建议运行 uv build --no-sources
,以确保在 tool.uv.sources
禁用时包能够正确构建,就像使用其他构建工具(如pypa/build
)时那样。
发布你的包
使用 uv publish
发布你的包:
通过 --token
或 UV_PUBLISH_TOKEN
设置 PyPI 令牌,或者通过 --username
或 UV_PUBLISH_USERNAME
设置用户名,并通过 --password
或 UV_PUBLISH_PASSWORD
设置密码。如果要从 GitHub Actions 发布到 PyPI,则无需设置任何凭据。相反,将受信任的发布者添加到 PyPI 项目。
注意
PyPI 不再支持使用用户名和密码进行发布,你需要生成一个令牌。使用令牌等同于设置 --username __token__
并将令牌用作密码。
如果你通过 [[tool.uv.index]]
使用自定义索引,请添加 publish-url
并使用 uv publish --index <name>
。例如:
[[tool.uv.index]]
name = "testpypi"
url = "https://test.pypi.org/simple/"
publish-url = "https://test.pypi.org/legacy/"
explicit = true
注意
使用 uv publish --index <name>
时,必须存在 pyproject.toml
,即在发布 CI 作业中需要有检出步骤。
尽管 uv publish
会重试失败的上传,但仍有可能在发布过程中出现失败,导致部分文件已上传,部分文件仍缺失。对于 PyPI,你可以重试完全相同的命令,已存在的相同文件将被忽略。对于其他注册中心,使用 --check-url <index url>
并指定包所属的索引 URL(不是发布 URL)。使用 --index
时,索引 URL 将用作检查 URL。uv 将跳过上传与注册中心中相同的文件,并且还将处理竞争的并行上传。请注意,现有文件必须与之前上传到注册中心的文件完全匹配,这可避免意外发布相同版本但内容不同的源发行版和 wheel 文件。
安装你的软件包
使用 uv run
测试软件包是否可以安装和导入:
--no-project
标志用于避免从本地项目目录安装软件包。
Tip
如果你最近安装了该软件包,可能需要包含 --refresh-package <PACKAGE>
选项,以避免使用软件包的缓存版本。
后续步骤
要了解有关发布软件包的更多信息,请查看 PyPA 指南 中关于构建和发布的内容。
或者,继续阅读关于将 uv 与其他软件集成的 指南。