跳到内容

使用替代包索引

虽然 uv 默认使用官方 Python 包索引 (PyPI),但它也支持替代包索引。大多数替代索引需要各种形式的身份验证,这需要一些初始设置。

重要

如果使用 pip 接口,请阅读关于 uv 中使用多个索引的文档 —— 其默认行为与 pip 不同,旨在防止依赖混淆攻击,但这意味着 uv 可能无法按预期找到包的版本。

Azure Artifacts

uv 可以从 Azure Artifacts 安装包,既可以通过使用个人访问令牌 (PAT),也可以使用 keyring 包。

要使用 Azure Artifacts,请将该索引添加到您的项目中

pyproject.toml
[[tool.uv.index]]
name = "private-registry"
url = "https://pkgs.dev.azure.com/<ORGANIZATION>/<PROJECT>/_packaging/<FEED>/pypi/simple/"

使用 Azure 访问令牌进行身份验证

如果有可用的个人访问令牌 (PAT)(例如 Azure 流水线中的 $(System.AccessToken)),则可以通过“Basic” HTTP 身份验证方案提供凭据。将 PAT 包含在 URL 的密码字段中。用户名也必须包含在内,但可以是任何字符串。

例如,假设令牌存储在 $AZURE_ARTIFACTS_TOKEN 环境变量中,请通过以下方式为索引设置凭据

export UV_INDEX_PRIVATE_REGISTRY_USERNAME=dummy
export UV_INDEX_PRIVATE_REGISTRY_PASSWORD="$AZURE_ARTIFACTS_TOKEN"

注意

PRIVATE_REGISTRY 应与您在 pyproject.toml 中定义的索引名称匹配。

使用 keyringartifacts-keyring 进行身份验证

您还可以使用 keyring 包和 artifacts-keyring 插件向 Artifacts 进行身份验证。由于这两个包是向 Azure Artifacts 进行身份验证所必需的,因此必须从 Artifacts 以外的来源预先安装它们。

artifacts-keyring 插件封装了 Azure Artifacts 凭据提供程序工具。该凭据提供程序支持多种不同的身份验证模式,包括交互式登录 —— 有关配置的信息,请参见工具的文档

uv 仅支持在子进程模式下使用 keyring 包。keyring 可执行文件必须位于 PATH 中,即全局安装或在活动环境中安装。keyring CLI 要求 URL 中包含用户名,并且必须为 VssSessionToken

# Pre-install keyring and the Artifacts plugin from the public PyPI
uv tool install keyring --with artifacts-keyring

# Enable keyring authentication
export UV_KEYRING_PROVIDER=subprocess

# Set the username for the index
export UV_INDEX_PRIVATE_REGISTRY_USERNAME=VssSessionToken

注意

tool.uv.keyring-provider 设置可用于在您的 uv.tomlpyproject.toml 中启用 keyring。

同样,索引的用户名可以直接添加到索引 URL 中。

将包发布到 Azure Artifacts

如果您还想将自己的包发布到 Azure Artifacts,可以使用构建和发布指南中描述的 uv publish 命令。

首先,将 publish-url 添加到您要发布包的索引中。例如

pyproject.toml
[[tool.uv.index]]
name = "private-registry"
url = "https://pkgs.dev.azure.com/<ORGANIZATION>/<PROJECT>/_packaging/<FEED>/pypi/simple/"
publish-url = "https://pkgs.dev.azure.com/<ORGANIZATION>/<PROJECT>/_packaging/<FEED>/pypi/upload/"

然后,配置凭据(如果不使用 keyring)

$ export UV_PUBLISH_USERNAME=dummy
$ export UV_PUBLISH_PASSWORD="$AZURE_ARTIFACTS_TOKEN"

发布包

$ uv publish --index private-registry

若要在不将 publish-url 添加到项目的情况下使用 uv publish,您可以设置 UV_PUBLISH_URL

$ export UV_PUBLISH_URL=https://pkgs.dev.azure.com/<ORGANIZATION>/<PROJECT>/_packaging/<FEED>/pypi/upload/
$ uv publish

请注意,这种方法不是首选,因为 uv 无法在上传构件之前检查包是否已发布。

Google Artifact Registry

uv 可以从 Google Artifact Registry 安装包,既可以通过使用访问令牌,也可以使用 keyring 包。

注意

本指南假定已安装并配置了 gcloud CLI。

要使用 Google Artifact Registry,请将该索引添加到您的项目中

pyproject.toml
[[tool.uv.index]]
name = "private-registry"
url = "https://<REGION>-python.pkg.dev/<PROJECT>/<REPOSITORY>/simple/"

使用 Google 访问令牌进行身份验证

凭据可以通过“Basic” HTTP 身份验证方案提供。将访问令牌包含在 URL 的密码字段中。用户名必须是 oauth2accesstoken,否则身份验证将失败。

使用 gcloud 生成令牌

export ARTIFACT_REGISTRY_TOKEN=$(
    gcloud auth application-default print-access-token
)

注意

您可能需要传递额外的参数(如 --project)来正确生成令牌,这是一个基本示例。

然后通过以下方式为索引设置凭据

export UV_INDEX_PRIVATE_REGISTRY_USERNAME=oauth2accesstoken
export UV_INDEX_PRIVATE_REGISTRY_PASSWORD="$ARTIFACT_REGISTRY_TOKEN"

注意

PRIVATE_REGISTRY 应与您在 pyproject.toml 中定义的索引名称匹配。

使用 keyringkeyrings.google-artifactregistry-auth 进行身份验证

您还可以使用 keyring 包和 keyrings.google-artifactregistry-auth 插件向 Artifact Registry 进行身份验证。由于这两个包是向 Artifact Registry 进行身份验证所必需的,因此必须从 Artifact Registry 以外的来源预先安装它们。

keyrings.google-artifactregistry-auth 插件封装了 gcloud CLI,用于生成短效访问令牌,并将它们安全地存储在系统 keyring 中,并在过期时刷新它们。

uv 仅支持在子进程模式下使用 keyring 包。keyring 可执行文件必须位于 PATH 中,即全局安装或在活动环境中安装。keyring CLI 要求 URL 中包含用户名,并且必须为 oauth2accesstoken

# Pre-install keyring and Artifact Registry plugin from the public PyPI
uv tool install keyring --with keyrings.google-artifactregistry-auth

# Enable keyring authentication
export UV_KEYRING_PROVIDER=subprocess

# Set the username for the index
export UV_INDEX_PRIVATE_REGISTRY_USERNAME=oauth2accesstoken

注意

tool.uv.keyring-provider 设置可用于在您的 uv.tomlpyproject.toml 中启用 keyring。

同样,索引的用户名可以直接添加到索引 URL 中。

将包发布到 Google Artifact Registry

如果您还想将自己的包发布到 Google Artifact Registry,可以使用构建和发布指南中描述的 uv publish 命令。

首先,将 publish-url 添加到您要发布包的索引中。例如

pyproject.toml
[[tool.uv.index]]
name = "private-registry"
url = "https://<REGION>-python.pkg.dev/<PROJECT>/<REPOSITORY>/simple/"
publish-url = "https://<REGION>-python.pkg.dev/<PROJECT>/<REPOSITORY>/"

然后,配置凭据(如果不使用 keyring)

$ export UV_PUBLISH_USERNAME=oauth2accesstoken
$ export UV_PUBLISH_PASSWORD="$ARTIFACT_REGISTRY_TOKEN"

发布包

$ uv publish --index private-registry

若要在不将 publish-url 添加到项目的情况下使用 uv publish,您可以设置 UV_PUBLISH_URL

$ export UV_PUBLISH_URL=https://<REGION>-python.pkg.dev/<PROJECT>/<REPOSITORY>/
$ uv publish

请注意,这种方法不是首选,因为 uv 无法在上传构件之前检查包是否已发布。

AWS CodeArtifact

uv 可以从 AWS CodeArtifact 安装包,既可以通过使用访问令牌,也可以使用 keyring 包。

注意

本指南假定已安装并配置了 awscli

索引的声明方式如下

pyproject.toml
[[tool.uv.index]]
name = "private-registry"
url = "https://<DOMAIN>-<ACCOUNT_ID>.d.codeartifact.<REGION>.amazonaws.com/pypi/<REPOSITORY>/simple/"

使用 AWS 访问令牌进行身份验证

凭据可以通过“Basic” HTTP 身份验证方案提供。将访问令牌包含在 URL 的密码字段中。用户名必须是 aws,否则身份验证将失败。

使用 awscli 生成令牌

export AWS_CODEARTIFACT_TOKEN="$(
    aws codeartifact get-authorization-token \
    --domain <DOMAIN> \
    --domain-owner <ACCOUNT_ID> \
    --query authorizationToken \
    --output text
)"

注意

您可能需要传递额外的参数(如 --region)来正确生成令牌,这是一个基本示例。

然后通过以下方式为索引设置凭据

export UV_INDEX_PRIVATE_REGISTRY_USERNAME=aws
export UV_INDEX_PRIVATE_REGISTRY_PASSWORD="$AWS_CODEARTIFACT_TOKEN"

注意

PRIVATE_REGISTRY 应与您在 pyproject.toml 中定义的索引名称匹配。

使用 keyringkeyrings.codeartifact 进行身份验证

您还可以使用 keyring 包和 keyrings.codeartifact 插件向 Artifact Registry 进行身份验证。由于这两个包是向 Artifact Registry 进行身份验证所必需的,因此必须从 Artifact Registry 以外的来源预先安装它们。

keyrings.codeartifact 插件封装了 boto3,用于生成短效访问令牌,并将它们安全地存储在系统 keyring 中,并在过期时刷新它们。

uv 仅支持在子进程模式下使用 keyring 包。keyring 可执行文件必须位于 PATH 中,即全局安装或在活动环境中安装。keyring CLI 要求 URL 中包含用户名,并且必须为 aws

# Pre-install keyring and AWS CodeArtifact plugin from the public PyPI
uv tool install keyring --with keyrings.codeartifact

# Enable keyring authentication
export UV_KEYRING_PROVIDER=subprocess

# Set the username for the index
export UV_INDEX_PRIVATE_REGISTRY_USERNAME=aws

注意

tool.uv.keyring-provider 设置可用于在您的 uv.tomlpyproject.toml 中启用 keyring。

同样,索引的用户名可以直接添加到索引 URL 中。

将包发布到 AWS CodeArtifact

如果您还想将自己的包发布到 AWS CodeArtifact,可以使用构建和发布指南中描述的 uv publish 命令。

首先,将 publish-url 添加到您要发布包的索引中。例如

pyproject.toml
[[tool.uv.index]]
name = "private-registry"
url = "https://<DOMAIN>-<ACCOUNT_ID>.d.codeartifact.<REGION>.amazonaws.com/pypi/<REPOSITORY>/simple/"
publish-url = "https://<DOMAIN>-<ACCOUNT_ID>.d.codeartifact.<REGION>.amazonaws.com/pypi/<REPOSITORY>/"

然后,配置凭据(如果不使用 keyring)

$ export UV_PUBLISH_USERNAME=aws
$ export UV_PUBLISH_PASSWORD="$AWS_CODEARTIFACT_TOKEN"

发布包

$ uv publish --index private-registry

若要在不将 publish-url 添加到项目的情况下使用 uv publish,您可以设置 UV_PUBLISH_URL

$ export UV_PUBLISH_URL=https://<DOMAIN>-<ACCOUNT_ID>.d.codeartifact.<REGION>.amazonaws.com/pypi/<REPOSITORY>/
$ uv publish

请注意,这种方法不是首选,因为 uv 无法在上传构件之前检查包是否已发布。

JFrog Artifactory

uv 可以从 JFrog Artifactory 安装包,既可以使用用户名和密码,也可以使用 JWT 令牌。

要使用它,请将该索引添加到您的项目中

pyproject.toml
[[tool.uv.index]]
name = "private-registry"
url = "https://<organization>.jfrog.io/artifactory/api/pypi/<repository>/simple"

使用用户名和密码进行身份验证

$ export UV_INDEX_PRIVATE_REGISTRY_USERNAME="<username>"
$ export UV_INDEX_PRIVATE_REGISTRY_PASSWORD="<password>"

使用 JWT 令牌进行身份验证

$ export UV_INDEX_PRIVATE_REGISTRY_USERNAME=""
$ export UV_INDEX_PRIVATE_REGISTRY_PASSWORD="$JFROG_JWT_TOKEN"

注意

将环境变量名称中的 PRIVATE_REGISTRY 替换为您在 pyproject.toml 中定义的实际索引名称。

将包发布到 JFrog Artifactory

publish-url 添加到您的索引定义中

pyproject.toml
[[tool.uv.index]]
name = "private-registry"
url = "https://<organization>.jfrog.io/artifactory/api/pypi/<repository>/simple"
publish-url = "https://<organization>.jfrog.io/artifactory/api/pypi/<repository>"

重要

如果您在 JFrog 中使用 --token "$JFROG_TOKEN"UV_PUBLISH_TOKEN,您将收到 401 未授权错误,因为 JFrog 要求用户名为空,而当使用 --token 时,uv 会传递 __token__ 作为用户名。

要进行身份验证,请将您的令牌作为密码传递,并将用户名设置为空字符串

$ uv publish --index <index_name> -u "" -p "$JFROG_TOKEN"

或者,您可以设置环境变量

$ export UV_PUBLISH_USERNAME=""
$ export UV_PUBLISH_PASSWORD="$JFROG_TOKEN"
$ uv publish --index private-registry

注意

发布环境变量 (UV_PUBLISH_USERNAMEUV_PUBLISH_PASSWORD) 不包含索引名称。