

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 从上游和外部连接请求 Python 程序包
<a name="python-upstream-external-connections-request"></a>

从 [pypi.org](https://pypi.org/) 导入 Python 程序包版本时，CodeArtifact 会导入该程序包版本中的所有资产。虽然大多数 Python 程序包都只包含少量资产，但有些程序包包含 100 多个资产，通常用于支持多种硬件架构和 Python 解释器。

对于现有程序包版本，将新资产发布到 pypi.org 是一种常见的做法。例如，在发布新版本的 Python 时，一些项目会发布新资产。使用 `pip install` 从 CodeArtifact 安装 Python 程序包时，保留在 CodeArtifact 存储库中的程序包版本会更新，以反映来自 pypi.org 的最新资产集。

同样，如果上游 CodeArtifact 存储库中的某个程序包版本有新的可用资产，而这些资产不存在于当前 CodeArtifact 存储库中，则它们将在运行 `pip install` 时保留在当前存储库中。

## 已撤销的程序包版本
<a name="python-yanked-versions"></a>

pypi.org 中的某些程序包版本标记为*已撤销*，这会向程序包安装程序（例如 pip）表明，除非该版本是唯一与版本说明符匹配的版本（使用 `==` 或 `===`），否则不应安装该版本。有关更多信息，请参阅 [PEP\$1592](https://peps.python.org/pep-0592/)。

如果 CodeArtifact 中的程序包版本最初是从外部连接提取到 [pypi.org](https://pypi.org/)，那么当您从 CodeArtifact 存储库安装程序包版本时，CodeArtifact 会确保从 pypi.org 提取已更新的程序包版本撤销元数据。

### 如何知道某个程序包版本是否已撤销
<a name="test-yanked-version"></a>

要检查某个程序包版本是否已在 CodeArtifact 中撤销，您可以尝试使用 `pip install packageName===packageVersion` 来安装。如果程序包版本已撤销，您会收到一条与以下内容类似的警告消息：

```
WARNING: The candidate selected for download or install is a yanked version
```

要查看程序包版本是否在 [pypi.org](https://pypi.org/) 中撤销，您可以访问该程序包版本的 pypi.org 列表，网址为 `https://pypi.org/project/packageName/packageVersion/`。

### 对私有程序包设置撤销状态
<a name="yanked-private-packages"></a>

CodeArtifact 不支持为直接发布到 CodeArtifact 存储库的程序包设置撤销元数据。

## 为什么 CodeArtifact 未提取程序包版本的最新撤销元数据或资产？
<a name="no-yanked-metadata"></a>

通常，CodeArtifact 会确保在从 CodeArtifact 存储库提取 Python 程序包版本时，撤销元数据是最新的，在 [pypi.org](https://pypi.org/) 上具有最新值。此外，程序包版本中的资产列表还会根据 pypi.org 和任何上游 CodeArtifact 存储库中的最新设置进行更新。无论您是第一次安装程序包版本且 CodeArtifact 将其从 pypi.org 导入到您的 CodeArtifact 存储库，还是之前已安装该程序包，都是如此。但在某些情况下，程序包管理器客户端（例如 pip）不会从 pypi.org 或上游存储库提取最新的撤销元数据。相反，CodeArtifact 将返回已存储在存储库中的数据。本节说明了发生这种情况的三种方式：

**上游配置：**如果使用 [disassociate-external-connection](external-connection.md#removing-an-external-connection) 从存储库或其上游移除与 pypi.org 的外部连接，则不再从 pypi.org 刷新撤销元数据。同样，如果您移除上游存储库，则已移除的存储库中和已移除存储库上游的资产将不再可供当前存储库使用。如果您使用 CodeArtifact [程序包来源控制](package-origin-controls.md)来阻止提取特定程序包的新版本，则情况也是如此，设置 `upstream=BLOCK` 会阻止刷新撤销元数据。

**程序包版本状态：**如果您将程序包版本的状态设置为除 `Published` 或 `Unlisted` 之外的任何其它状态，则不会刷新程序包版本的撤销元数据和资产。同样，如果您正在提取特定的程序包版本（例如 `torch 2.0.1`），而上游存储库中存在相同的程序包版本，但状态不是 `Published` 或 `Unlisted`，这也将阻止撤销元数据和资产从上游存储库传播到当前存储库。这是因为其它程序包版本状态表明这些版本不打算再在任何存储库中使用。

**直接发布：**如果您将特定的程序包版本直接发布到 CodeArtifact 存储库中，这将阻止从其上游存储库和 pypi.org 刷新程序包版本的撤销元数据和资产。例如，假设您使用 Web 浏览器从程序包版本 `torch 2.0.1` 下载资产（例如 `torch-2.0.1-cp311-none-macosx_11_0_arm64.whl`），然后使用 twine 以名称 `torch 2.0.1` 将其发布到您的 CodeArtifact 存储库。CodeArtifact 跟踪到程序包版本是通过直接发布到存储库，而不是通过与 pypi.org 或上游存储库的外部连接来进入域。在这种情况下，CodeArtifact 不会使撤销元数据与上游存储库或 pypi.org 保持同步。如果您将 `torch 2.0.1` 发布到上游存储库，情况也是如此，因为存在程序包版本，所以会阻止将撤销元数据和资产传播到上游图更下方的存储库。