mirror of
https://github.com/astral-sh/uv.git
synced 2025-08-11 06:18:03 +00:00

Some checks are pending
CI / mkdocs (push) Waiting to run
CI / Determine changes (push) Waiting to run
CI / lint (push) Waiting to run
CI / cargo clippy | ubuntu (push) Blocked by required conditions
CI / cargo clippy | windows (push) Blocked by required conditions
CI / cargo dev generate-all (push) Blocked by required conditions
CI / cargo shear (push) Waiting to run
CI / cargo test | ubuntu (push) Blocked by required conditions
CI / cargo test | macos (push) Blocked by required conditions
CI / cargo test | windows (push) Blocked by required conditions
CI / check windows trampoline | aarch64 (push) Blocked by required conditions
CI / check windows trampoline | i686 (push) Blocked by required conditions
CI / check windows trampoline | x86_64 (push) Blocked by required conditions
CI / test windows trampoline | i686 (push) Blocked by required conditions
CI / test windows trampoline | x86_64 (push) Blocked by required conditions
CI / typos (push) Waiting to run
CI / build binary | linux libc (push) Blocked by required conditions
CI / build binary | linux musl (push) Blocked by required conditions
CI / build binary | macos aarch64 (push) Blocked by required conditions
CI / build binary | macos x86_64 (push) Blocked by required conditions
CI / build binary | windows x86_64 (push) Blocked by required conditions
CI / build binary | windows aarch64 (push) Blocked by required conditions
CI / cargo build (msrv) (push) Blocked by required conditions
CI / build binary | freebsd (push) Blocked by required conditions
CI / ecosystem test | pydantic/pydantic-core (push) Blocked by required conditions
CI / smoke test | windows aarch64 (push) Blocked by required conditions
CI / ecosystem test | prefecthq/prefect (push) Blocked by required conditions
CI / ecosystem test | pallets/flask (push) Blocked by required conditions
CI / smoke test | linux (push) Blocked by required conditions
CI / smoke test | macos (push) Blocked by required conditions
CI / smoke test | windows x86_64 (push) Blocked by required conditions
CI / integration test | conda on ubuntu (push) Blocked by required conditions
CI / integration test | deadsnakes python3.9 on ubuntu (push) Blocked by required conditions
CI / integration test | free-threaded on linux (push) Blocked by required conditions
CI / integration test | free-threaded on windows (push) Blocked by required conditions
CI / integration test | pypy on ubuntu (push) Blocked by required conditions
CI / integration test | pypy on windows (push) Blocked by required conditions
CI / integration test | graalpy on ubuntu (push) Blocked by required conditions
CI / integration test | graalpy on windows (push) Blocked by required conditions
CI / integration test | github actions (push) Blocked by required conditions
CI / integration test | determine publish changes (push) Blocked by required conditions
CI / check system | alpine (push) Blocked by required conditions
CI / integration test | uv publish (push) Blocked by required conditions
CI / check cache | ubuntu (push) Blocked by required conditions
CI / check cache | macos aarch64 (push) Blocked by required conditions
CI / check system | python on debian (push) Blocked by required conditions
CI / check system | python on fedora (push) Blocked by required conditions
CI / check system | python on ubuntu (push) Blocked by required conditions
CI / check system | python on opensuse (push) Blocked by required conditions
CI / check system | python on rocky linux 8 (push) Blocked by required conditions
CI / check system | python on rocky linux 9 (push) Blocked by required conditions
CI / check system | pypy on ubuntu (push) Blocked by required conditions
CI / check system | pyston (push) Blocked by required conditions
CI / check system | windows registry (push) Blocked by required conditions
CI / check system | python on macos aarch64 (push) Blocked by required conditions
CI / check system | homebrew python on macos aarch64 (push) Blocked by required conditions
CI / check system | python on macos x86-64 (push) Blocked by required conditions
CI / check system | python3.10 on windows x86-64 (push) Blocked by required conditions
CI / check system | python3.10 on windows x86 (push) Blocked by required conditions
CI / check system | python3.13 on windows x86-64 (push) Blocked by required conditions
CI / check system | python3.12 via chocolatey (push) Blocked by required conditions
CI / check system | python3.9 via pyenv (push) Blocked by required conditions
CI / check system | python3.13 (push) Blocked by required conditions
CI / check system | conda3.11 on macos aarch64 (push) Blocked by required conditions
CI / check system | conda3.8 on macos aarch64 (push) Blocked by required conditions
CI / check system | conda3.11 on linux x86-64 (push) Blocked by required conditions
CI / check system | conda3.8 on linux x86-64 (push) Blocked by required conditions
CI / check system | conda3.11 on windows x86-64 (push) Blocked by required conditions
CI / check system | conda3.8 on windows x86-64 (push) Blocked by required conditions
CI / check system | amazonlinux (push) Blocked by required conditions
CI / check system | embedded python3.10 on windows x86-64 (push) Blocked by required conditions
CI / benchmarks (push) Blocked by required conditions
<!-- Thank you for contributing to uv! To help us out with reviewing, please consider the following: - Does this pull request include a summary of the change? (See below.) - Does this pull request include a descriptive title? - Does this pull request include references to any relevant issues? --> ## Summary Use `UV_INDEX` instead of the deprecated `UV_EXTRA_INDEX_URL`. <!-- What's the purpose of the change? What does it do, and why? --> ## Test Plan It is a minor documentation change. <!-- How was it tested? -->
180 lines
7.1 KiB
Markdown
180 lines
7.1 KiB
Markdown
---
|
|
title: Using alternative package indexes
|
|
description:
|
|
A guide to using alternative package indexes with uv, including Azure Artifacts, Google Artifact
|
|
Registry, AWS CodeArtifact, and more.
|
|
---
|
|
|
|
# Using alternative package indexes
|
|
|
|
While uv uses the official Python Package Index (PyPI) by default, it also supports alternative
|
|
package indexes. Most alternative indexes require various forms of authentication, which requires
|
|
some initial setup.
|
|
|
|
!!! important
|
|
|
|
Please read the documentation on [using multiple indexes](../../pip/compatibility.md#packages-that-exist-on-multiple-indexes)
|
|
in uv — the default behavior is different from pip to prevent dependency confusion attacks, but
|
|
this means that uv may not find the versions of a package as you'd expect.
|
|
|
|
## Azure Artifacts
|
|
|
|
uv can install packages from
|
|
[Azure DevOps Artifacts](https://learn.microsoft.com/en-us/azure/devops/artifacts/start-using-azure-artifacts?view=azure-devops&tabs=nuget%2Cnugetserver).
|
|
Authenticate to a feed using a
|
|
[Personal Access Token](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows)
|
|
(PAT) or interactively using the [`keyring`](https://github.com/jaraco/keyring) package.
|
|
|
|
### Using a PAT
|
|
|
|
If there is a PAT available (eg
|
|
[`$(System.AccessToken)` in an Azure pipeline](https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#systemaccesstoken)),
|
|
credentials can be provided via the "Basic" HTTP authentication scheme. Include the PAT in the
|
|
password field of the URL. A username must be included as well, but can be any string.
|
|
|
|
For example, with the token stored in the `$ADO_PAT` environment variable, set the index URL with:
|
|
|
|
```console
|
|
$ export UV_INDEX=https://dummy:$ADO_PAT@pkgs.dev.azure.com/{organisation}/{project}/_packaging/{feedName}/pypi/simple/
|
|
```
|
|
|
|
### Using `keyring`
|
|
|
|
If there is not a PAT available, authenticate to Artifacts using the
|
|
[`keyring`](https://github.com/jaraco/keyring) package with
|
|
[the `artifacts-keyring` plugin](https://github.com/Microsoft/artifacts-keyring). Because these two
|
|
packages are required to authenticate to Azure Artifacts, they must be pre-installed from a source
|
|
other than Artifacts.
|
|
|
|
The `artifacts-keyring` plugin wraps
|
|
[the Azure Artifacts Credential Provider tool](https://github.com/microsoft/artifacts-credprovider).
|
|
The credential provider supports a few different authentication modes including interactive login —
|
|
see [the tool's documentation](https://github.com/microsoft/artifacts-credprovider) for information
|
|
on configuration.
|
|
|
|
uv only supports using the `keyring` package in
|
|
[subprocess mode](https://github.com/astral-sh/uv/blob/main/PIP_COMPATIBILITY.md#registry-authentication).
|
|
The `keyring` executable must be in the `PATH`, i.e., installed globally or in the active
|
|
environment. The `keyring` CLI requires a username in the URL, so the index URL must include the
|
|
default username `VssSessionToken`.
|
|
|
|
```console
|
|
$ # 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
|
|
|
|
$ # Configure the index URL with the username
|
|
$ export UV_INDEX=https://VssSessionToken@pkgs.dev.azure.com/{organisation}/{project}/_packaging/{feedName}/pypi/simple/
|
|
```
|
|
|
|
## Google Artifact Registry
|
|
|
|
uv can install packages from
|
|
[Google Artifact Registry](https://cloud.google.com/artifact-registry/docs). Authenticate to a
|
|
repository using password authentication or using [`keyring`](https://github.com/jaraco/keyring)
|
|
package.
|
|
|
|
!!! note
|
|
|
|
This guide assumes `gcloud` CLI has previously been installed and setup.
|
|
|
|
### Password authentication
|
|
|
|
Credentials can be provided via "Basic" HTTP authentication scheme. Include access token in the
|
|
password field of the URL. Username must be `oauth2accesstoken`, otherwise authentication will fail.
|
|
|
|
For example, with the token stored in the `$ARTIFACT_REGISTRY_TOKEN` environment variable, set the
|
|
index URL with:
|
|
|
|
```bash
|
|
export ARTIFACT_REGISTRY_TOKEN=$(gcloud auth application-default print-access-token)
|
|
export UV_INDEX=https://oauth2accesstoken:$ARTIFACT_REGISTRY_TOKEN@{region}-python.pkg.dev/{projectId}/{repositoryName}/simple
|
|
```
|
|
|
|
### Using `keyring`
|
|
|
|
You can also authenticate to Artifact Registry using [`keyring`](https://github.com/jaraco/keyring)
|
|
package with
|
|
[`keyrings.google-artifactregistry-auth` plugin](https://github.com/GoogleCloudPlatform/artifact-registry-python-tools).
|
|
Because these two packages are required to authenticate to Artifact Registry, they must be
|
|
pre-installed from a source other than Artifact Registry.
|
|
|
|
The `artifacts-keyring` plugin wraps [gcloud CLI](https://cloud.google.com/sdk/gcloud) to generate
|
|
short-lived access tokens, securely store them in system keyring and refresh them when they are
|
|
expired.
|
|
|
|
uv only supports using the `keyring` package in
|
|
[subprocess mode](https://github.com/astral-sh/uv/blob/main/PIP_COMPATIBILITY.md#registry-authentication).
|
|
The `keyring` executable must be in the `PATH`, i.e., installed globally or in the active
|
|
environment. The `keyring` CLI requires a username in the URL and it must be `oauth2accesstoken`.
|
|
|
|
```bash
|
|
# 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
|
|
|
|
# Configure the index URL with the username
|
|
export UV_INDEX=https://oauth2accesstoken@{region}-python.pkg.dev/{projectId}/{repositoryName}/simple
|
|
```
|
|
|
|
## AWS CodeArtifact
|
|
|
|
uv can install packages from
|
|
[AWS CodeArtifact](https://docs.aws.amazon.com/codeartifact/latest/ug/using-python.html).
|
|
|
|
The authorization token can be retrieved using the `awscli` tool.
|
|
|
|
!!! note
|
|
|
|
This guide assumes the AWS CLI has previously been authenticated.
|
|
|
|
First, declare some constants for your CodeArtifact repository:
|
|
|
|
```bash
|
|
export AWS_DOMAIN="<your-domain>"
|
|
export AWS_ACCOUNT_ID="<your-account-id>"
|
|
export AWS_REGION="<your-region>"
|
|
export AWS_CODEARTIFACT_REPOSITORY="<your-repository>"
|
|
```
|
|
|
|
Then, retrieve a token from the `awscli`:
|
|
|
|
```bash
|
|
export AWS_CODEARTIFACT_TOKEN="$(
|
|
aws codeartifact get-authorization-token \
|
|
--domain $AWS_DOMAIN \
|
|
--domain-owner $AWS_ACCOUNT_ID \
|
|
--query authorizationToken \
|
|
--output text
|
|
)"
|
|
```
|
|
|
|
And configure the index URL:
|
|
|
|
```bash
|
|
export UV_INDEX="https://aws:${AWS_CODEARTIFACT_TOKEN}@${AWS_DOMAIN}-${AWS_ACCOUNT_ID}.d.codeartifact.${AWS_REGION}.amazonaws.com/pypi/${AWS_CODEARTIFACT_REPOSITORY}/simple/"
|
|
```
|
|
|
|
### Publishing packages
|
|
|
|
If you also want to publish your own packages to AWS CodeArtifact, you can use `uv publish` as
|
|
described in the [publishing guide](../package.md). You will need to set `UV_PUBLISH_URL` separately
|
|
from the credentials:
|
|
|
|
```bash
|
|
# Configure uv to use AWS CodeArtifact
|
|
export UV_PUBLISH_URL="https://${AWS_DOMAIN}-${AWS_ACCOUNT_ID}.d.codeartifact.${AWS_REGION}.amazonaws.com/pypi/${AWS_CODEARTIFACT_REPOSITORY}/"
|
|
export UV_PUBLISH_USERNAME=aws
|
|
export UV_PUBLISH_PASSWORD="$AWS_CODEARTIFACT_TOKEN"
|
|
|
|
# Publish the package
|
|
uv publish
|
|
```
|
|
|
|
## Other indexes
|
|
|
|
uv is also known to work with JFrog's Artifactory.
|