

亚马逊 CodeCatalyst 不再向新买家开放。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [如何从中迁移 CodeCatalyst](migration.md)。

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

# 在中发布和共享软件包 CodeCatalyst
<a name="packages"></a>

Amazon CodeCatalyst 包含完全托管的软件包存储库服务，可让您的开发团队轻松安全地存储和共享用于应用程序开发的软件包。这些包存储在包存储库中，这些存储库是在中的项目中创建和组织的 CodeCatalyst。

单个软件包存储库可以存储每种支持的软件包类型的软件包。 CodeCatalyst 支持以下软件包格式：
+ npm
+ Maven
+ NuGet
+ Python

可以发现程序包存储库中的程序包，并在包含该存储库的项目的成员之间共享此程序包。

要将程序包发布到存储库和使用存储库中的程序包，请将程序包管理器配置为使用存储库端点（URL）。然后，您可以使用程序包管理器将程序包发布到存储库。您可以使用 Maven、Gradle、npm、yarn、nuget、dotnet、pip 和 twine 等程序包管理器。

您也可以将 CodeCatalyst 工作流程配置为使用 CodeCatalyst 软件包存储库。有关在工作流中使用程序包的更多信息，请参阅[将程序包存储库连接到工作流](workflows-packages.md)。

您可以将一个程序包存储库中的程序包提供给同一项目中的另一个存储库，方法是将前者添加为上游存储库。上游存储库可用的所有程序包版本也可供下游存储库使用。有关更多信息，请参阅 [配置并使用上游存储库](packages-upstream-repositories.md)。

您可以通过创建一种名为**网关**的特殊类型的存储 CodeCatalyst 库来向仓库提供开源软件包。上游到网关存储库允许您使用来自热门公共存储库（例如 npmjs.com 和 pypi.org）的软件包，并自动将其缓存在存储库中。 CodeCatalyst 有关更多信息，请参阅 [连接到公共外部存储库](packages-connect-external.md)。

**Topics**
+ [程序包概念](packages-concepts.md)
+ [配置并使用程序包存储库](packages-repositories.md)
+ [配置并使用上游存储库](packages-upstream-repositories.md)
+ [连接到公共外部存储库](packages-connect-external.md)
+ [发布和修改程序包](working-with-packages.md)
+ [使用 npm](packages-npm.md)
+ [使用 Maven](packages-maven.md)
+ [使用 NuGet](packages-nuget.md)
+ [使用 Python](packages-python.md)
+ [程序包配额](packages-quotas.md)

# 程序包概念
<a name="packages-concepts"></a>

以下是管理、发布或使用中的软件包时需要了解的一些概念和术语 CodeCatalyst。

## 软件包
<a name="packages-concepts-packages"></a>

软件*包*是一个包含安装软件和解决任何依赖关系所需的软件和元数据的捆绑包。 CodeCatalyst 支持 npm 包格式。

程序包中包括：
+ 一个名称（例如，`webpack` 是一个流行的 npm 程序包的名称）
+ 一个可选的[命名空间](#packages-concepts-package-namespaces)（例如，`@types/node` 中的 `@types`）
+ 一组[版本](#packages-concepts-package-versions)（例如，`1.0.0`、`1.0.1`、`1.0.2`）
+ 程序包级别的元数据（例如 npm dist 标签）

## 程序包命名空间
<a name="packages-concepts-package-namespaces"></a>

某些程序包格式支持分层程序包名称，用于将程序包组织成逻辑组，有助于避免名称冲突。具有相同名称的程序包可以存储在不同的命名空间中。例如，npm 支持作用域，而 npm 程序包 `@types/node` 的作用域为 `@types`，名称为 `node`。`@types` 作用域中还有许多其他的程序包名称。在中 CodeCatalyst，作用域（“类型”）被称为包命名空间，名称（“节点”）被称为包名称。对于 Maven 程序包，程序包命名空间与 Maven GroupId 相对应。Maven 程序包 `org.apache.logging.log4j:log4j` 的 groupID（程序包命名空间）为 `org.apache.logging.log4j`，artifactID（程序包名称）为 `log4j`。某些程序包格式（例如 Python）不支持其概念类似于 npm 作用域或 Maven groupID 的分层名称。如果无法对程序包名称进行分组，则可能更难避免名称冲突。

## 程序包版本
<a name="packages-concepts-package-versions"></a>

*程序包版本*标识程序包的特定版本，例如 `@types/node@12.6.9`。版本号格式和语义因不同的程序包格式而异。例如，npm 程序包版本必须符合[语义版本控制规范](https://semver.org/)。在中 CodeCatalyst，软件包版本由版本标识符、 package-version-level元数据和一组资源组成。

## 资产
<a name="packages-concepts-assets"></a>

*资产*是存储在中与软件包版本关联 CodeCatalyst 的单个文件，例如 npm `.tgz` 文件或 Maven POM 或 JAR 文件。

## 程序包存储库
<a name="packages-concepts-repository"></a>

 CodeCatalyst *包存储库*包含一组[包](#packages-concepts-packages)，其中包含软件[包版本](#packages-concepts-package-versions)，每个版本都映射到一组[资产](#packages-concepts-assets)。程序包存储库是多语言的，这意味着单个存储库可以包含任何受支持类型的程序包。每个包存储库都公开端点，用于使用 (、)、CLI `nuget`、Maven CL `npm` I NuGet CLIs (`dotnet`) 和 Pyth CLIs on `mvn``pip`（`twine`和）等工具获取和发布包。有关中的 CodeCatalyst软件包配额（包括在每个空间中可以创建多少个软件包存储库）的信息，请参阅[程序包配额](packages-quotas.md)。

您可以通过将一个程序包存储库设置为上游来将它链接到另一个程序包存储库。在将存储库设置为上游时，可以使用来自该上游的任何程序包以及链中的任何其他上游存储库。有关更多信息，请参阅 [上游存储库](#packages-concepts-upstream-repositories)。

网关存储库是一种特殊类型的程序包存储库，用于从官方外部程序包授权机构处拉取和存储程序包。有关更多信息，请参阅 [网关存储库](#packages-concepts-gateway-repositories)。

## 上游存储库
<a name="packages-concepts-upstream-repositories"></a>

您可以使用 CodeCatalyst 在两个软件包存储库之间创建上游关系。当可以从下游存储库的程序包存储库端点访问其中的程序包版本时，一个程序包存储库将为另一个程序包存储库的*上游*。利用上游关系，可从客户端的角度有效地合并两个程序包存储库的内容。

例如，如果软件包管理器请求存储库中不存在的软件包版本，则 CodeCatalyst 会在已配置的上游存储库中搜索该软件包的版本。按配置顺序搜索上游存储库，一旦找到软件包， CodeCatalyst 就会停止搜索。

## 网关存储库
<a name="packages-concepts-gateway-repositories"></a>

*网关存储库*是一种特殊类型的程序包存储库，它与支持的外部官方程序包授权机构相连。在将网关存储库添加为[上游存储库](#packages-concepts-upstream-repositories)时，可以从相应的官方程序包授权机构处使用程序包。您的下游存储库不与公有存储库进行通信，相反，所有内容都由网关存储库进行中继。通过此方式使用的程序包同时存储在网关存储库和收到原始请求的下游存储库中。

网关存储库是预定义的，但必须在要使用的每个项目中创建它们。以下列表包含可以在中创建的每个网关存储库 CodeCatalyst 以及它们所连接的包权限。
+ **npm-public-registry-gateway**提供来自 npmjs.com 的 npm 软件包。
+ **maven-central-gateway**提供来自 Maven Central 存储库的 Maven 软件包。
+ **google-android-gateway**提供来自谷歌安卓系统的 Maven 软件包。
+ **commonsware-gateway** 提供的 Maven CommonsWare
+ **gradle-plugins-gateway**提供来自 Gradle 插件的 Maven 软件包。
+ **nuget-gallery-gateway**提供 NuGet 图库中的 NuGet 软件包。
+ **pypi-gateway** 提供来自 Python 包索引的 Python 程序包。

# 配置并使用程序包存储库
<a name="packages-repositories"></a>

在中 CodeCatalyst，软件包存储在软件包存储库中并进行管理。要将包发布到 CodeCatalyst 或使用来自 CodeCatalyst （或任何支持的公共包存储库）的包，您必须创建一个包存储库并将包管理器连接到该存储库。

**Topics**
+ [创建程序包存储库](packages-repositories-create.md)
+ [连接到程序包存储库](packages-repositories-connect.md)
+ [删除程序包存储库](packages-repositories-delete.md)

# 创建程序包存储库
<a name="packages-repositories-create"></a>

要在中创建软件包存储库，请执行以下步骤 CodeCatalyst。

**创建程序包存储库**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 导航到要在其中创建程序包存储库的项目。

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择**创建程序包存储库**。

1. 在**程序包存储库详细信息**部分中，添加以下项：

   1. **存储库名称**。考虑使用描述性名称，其中包含诸如项目或团队名称或存储库的使用方式之类的详细信息。

   1. （可选）**描述**。当您在一个项目中拥有跨多个团队的多个存储库时，存储库描述特别有用。

1. 在 “上**游存储库**” 部分，**选择 “选择上游存储库**”，添加要通过软件包存储库访问的任何 CodeCatalyst 软件包存储库。您可以添加 **Gateway 存储库**以连接到外部软件包存储库或其他**CodeCatalyst 存储库**。

   1. 当从程序包存储库请求程序包时，将按照上游存储库在此列表中的显示顺序搜索这些上游存储库。找到包裹后， CodeCatalyst 将停止搜索。要更改上游存储库的顺序，您可以将存储库拖放到列表中。

1. 选择**创建**以创建您的程序包存储库。

# 连接到程序包存储库
<a name="packages-repositories-connect"></a>

要发布到或使用其中的软件包 CodeCatalyst，您必须使用软件包存储库端点信息和 CodeCatalyst 凭据配置软件包管理器。如果您尚未创建存储库，则可以按照[创建程序包存储库](packages-repositories-create.md)中的说明执行此操作。

有关如何将包管理器连接到软件 CodeCatalyst 包存储库的说明，请参阅以下文档。
+ [配置并使用 Gradle Groovy](packages-maven-gradle.md)
+ [配置并使用 mvn](packages-maven-mvn.md)
+ [配置并使用 nuget 或 dotnet CLI](packages-nuget-cli.md)
+ [配置并使用 npm](packages-npm-use.md)
+ [配置 pip 并安装 Python 程序包](packages-python-pip.md)
+ [配置 Twine 并发布 Python 程序包](packages-python-twine.md)

# 删除程序包存储库
<a name="packages-repositories-delete"></a>

要在中删除软件包存储库，请执行以下步骤 CodeCatalyst。

**删除程序包存储库**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 导航到包含要删除的程序包存储库的项目。

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择要删除的存储库。

1. 选择**删除**。

1. 查看提供的有关删除程序包存储库的效果的信息。

1. 在输入框中输入 `delete`，然后选择**删除**。

# 配置并使用上游存储库
<a name="packages-upstream-repositories"></a>

您可以将网关存储库和其他 CodeCatalyst 软件包存储库作为上游连接到您的软件包存储库。这样，程序包管理器客户端就可以使用单个程序包存储库端点访问多个程序包存储库中包含的程序包。以下是使用上游存储库的主要好处：
+ 您只需要为程序包管理器配置一个存储库端点，即可从多个来源进行提取。
+ 从上游存储库中使用的程序包存储在下游存储库中，这可确保即使上游存储库发生意外中断或上游存储库中的程序包被删除，您的程序包也可用。

在创建程序包存储库时，可以添加上游存储库。您还可以在 CodeCatalyst 控制台中从现有软件包存储库中添加或删除上游存储库。

当您将网关存储库添加为上游存储库时，程序包存储库将连接到网关存储库的相应公共程序包存储库。有关支持的公共程序包存储库的列表，请参阅[支持的外部程序包存储库及其网关存储库](packages-connect-external.md#packages-upstream-repositories-supported-external)。

您可以将多个存储库链接起来以作为上游存储库。例如，假设您的团队创建了一个名为的存储库，`project-repo`并且已经在使用另一个名为的存储库`team-repo`，该存储库已**npm-public-registry-gateway**添加为上游存储库，该存储库已连接到公共 npm 存储库。`npmjs.com`您可以将 `team-repo` 作为上游存储库添加到 `project-repo`。在此情况下，您只需将程序包管理器配置为使用 `project-repo` 从 `project-repo`、`team-repo`、`npm-public-registry-gateway` 和 `npmjs.com` 中拉取程序包即可。

**Topics**
+ [添加上游存储库](packages-upstream-repositories-add.md)
+ [编辑上游存储库的搜索顺序](packages-upstream-repositories-search-order.md)
+ [请求包含上游存储库的程序包版本](packages-upstream-repositories-request.md)
+ [移除上游存储库](packages-upstream-repositories-remove.md)

# 添加上游存储库
<a name="packages-upstream-repositories-add"></a>

将公共包存储库或其他 CodeCatalyst 软件包存储库作为上游存储库添加到下游存储库中，可以将上游存储库中的所有包都提供给连接到下游存储库的包管理器。

**添加上游存储库**

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择要将上游存储库添加到的程序包存储库。

1. 在程序包存储库的名称下，选择**上游**，然后选择**选择上游存储库**。

1. 在**选择上游类型**中，选择下列选项之一：
   + **网关存储库**

     您可以从可用网关存储库的列表中进行选择。
**注意**  
要连接到公共外部包颁发机构，例如 Maven Central、npmjs.com 或 Nuget Gallery，请 CodeCatalyst 使用网关存储库作为中间存储库，用于搜索和存储从外部存储库提取的包。这样可以减少时间和数据传输，因为项目中的所有程序包存储库都将使用网关中间存储库中的程序包。有关更多信息，请参阅 [连接到公共外部存储库](packages-connect-external.md)。
   + **CodeCatalyst 存储库**

     您可以从项目中可用的 CodeCatalyst 软件包存储库列表中进行选择。

1. 选择所有要添加作为上游存储库的存储库后，选择**选择**，然后选择**保存**。

   有关更改上游存储库的搜索顺序的更多信息，请参阅[编辑上游存储库的搜索顺序](packages-upstream-repositories-search-order.md)。

添加上游存储库后，您可以使用连接到本地存储库的程序包管理器，从该上游存储库中获取程序包。您无需更新程序包管理器配置。有关从上游存储库请求程序包版本的更多信息，请参阅[请求包含上游存储库的程序包版本](packages-upstream-repositories-request.md)。

# 编辑上游存储库的搜索顺序
<a name="packages-upstream-repositories-search-order"></a>

CodeCatalyst 按其配置的搜索顺序搜索上游存储库。找到包裹后， CodeCatalyst 停止搜索。您可以更改在上游存储库中搜索程序包时搜索这些存储库的顺序。

**编辑上游存储库的搜索顺序**

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择要编辑器上游存储库搜索顺序的程序包存储库。

1. 在程序包存储库的名称下，选择**上游**。

1. 在**上游存储库**部分中，您可以查看上游存储库及其搜索顺序。要更改搜索顺序，请将存储库拖放到列表中。

1. 编辑完上游存储库的搜索顺序后，选择**保存**。

# 请求包含上游存储库的程序包版本
<a name="packages-upstream-repositories-request"></a>

以下示例显示了包管理器从具有上游存储库的软件包存储库请求 CodeCatalyst 包时可能出现的情况。

在此示例中，程序包管理器（例如 `npm`）从名为 `downstream` 的具有多个上游存储库的程序包存储库中请求程序包版本。在请求程序包时，可能会出现以下情况：
+  如果 `downstream` 包含请求的程序包版本，则将该版本返回给客户端。
+  如果`downstream`不包含请求的软件包版本，则按其配置`downstream`的 CodeCatalyst 搜索顺序在上游存储库中搜索该版本。如果找到了程序包版本，则会将对该版本的引用复制到 `downstream`，并将程序包版本返回给客户端。
+  如果 `downstream` 和其上游存储库都不包含程序包版本，则会向客户端返回 HTTP 404 `Not Found` 响应。

 一个存储库允许的直接上游存储库的最大数量为 10。请求软件包版本时 CodeCatalyst 搜索的最大存储库数为 25。

## 上游存储库的程序包保留
<a name="package-retention-upstream-repos"></a>

如果在上游存储库中找到了请求的程序包版本，则会保留对该版本的引用，并且该引用在请求它的存储库中始终可用。这将确保您能够在上游存储库意外中断时访问您的程序包。保留的程序包版本不受以下任何因素的影响：
+  删除上游存储库。
+  断开上游存储库与下游存储库的连接。
+  从上游存储库中删除程序包版本。
+  在上游存储库中编辑程序包版本（例如，向其中添加新资产）。

## 通过上游关系提取程序包
<a name="fetching-packages-through-an-upstream-relationship"></a>

CodeCatalyst 可以通过多个名为上游存储库的链接存储库获取软件包。如果一个 CodeCatalyst 包存储库与另一个包存储库有上游连接，而另一个 CodeCatalyst 包存储库与网关存储库有上游连接，则会从外部存储库中复制对不在上游存储库中的软件包的请求。例如，考虑以下配置：名为的存储库与网关存储库`repo-A`有上游连接`npm-public-registry-gateway`。 `npm-public-registry-gateway`与公共软件包存储库有上游连接[https://npmjs.com](https://npmjs.com)。

![\[简单的上游存储库示意图，其中显示了链接在一起的三个存储库。\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/upstream-with-external.png)


如果配置`npm`为使用`repo-A`存储库，则运行`npm install`会启动将软件包从复制[https://npmjs.com](https://npmjs.com)到`npm-public-registry-gateway`。已安装的版本也会提取到 `repo-A`。下面的示例会安装 `lodash`。

```
$ npm config get registry
https://packages.region.codecatalyst.aws/npm/space-name/proj-name/repo-name/
$ npm install lodash
+ lodash@4.17.20
added 1 package from 2 contributors in 6.933s
```

运行 `npm install` 后，`repo-A` 仅包含最新版本（`lodash 4.17.20`），因为这是 `npm` 从 `repo-A` 提取的版本。

 由于与`npm-public-registry-gateway`有外部上游连接 [https://npmjs.com](https://npmjs.com)，因此所有从中导入的软件包版本[https://npmjs.com](https://npmjs.com)都存储在中`npm-public-registry-gateway`。任何具有指向 `npm-public-registry-gateway` 的上游连接的下游存储库，均可能已提取这些程序包版本。

的内容为您`npm-public-registry-gateway`提供了一种查看一段时间以来导入的所有软件包和软件包版本的方法。[https://npmjs.com](https://npmjs.com)

## 中间存储库中的程序包保留
<a name="package-retention-intermediate-repositories"></a>

 CodeCatalyst 允许您链接上游存储库。例如，`repo-A` 可以使用 `repo-B` 作为上游存储库，而 `repo-B` 可以使用 `repo-C` 作为上游存储库。这个配置意味着在 `repo-A` 中可以获取 `repo-B` 和 `repo-C` 中的程序包版本。

![\[简单的上游存储库示意图，其中显示了链接在一起的三个存储库。\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/upstream-chaining.png)


 当程序包管理器连接到存储库 `repo-A` 并从存储库 `repo-C` 中提取程序包版本时，程序包版本不会保留在存储库 `repo-B` 中。程序包版本仅保留在最下游的存储库中，在此示例中为 `repo-A`。程序包版本不会保留在任何中间存储库中。对于较长的链也是如此；例如，如果有四个存储库 `repo-A`、`repo-B`、`repo-C` 和 `repo-D`，一个连接到 `repo-A` 的程序包管理器从 `repo-D` 提取程序包版本，则程序包版本将保留在 `repo-A` 中，但不会保留在 `repo-B` 或 `repo-C` 中。

从公共程序包存储库拉取程序包版本时，程序包保留行为与之类似，不同之处在于程序包版本始终保留在具有与公共存储库的直接上游连接的网关存储库中。例如，`repo-A` 使用 `repo-B` 作为上游存储库。`repo-B` 使用 `npm-public-registry-gateway` 作为上游存储库，它具有与公共存储库 **npmjs.com** 的上游连接；请参见下图。

![\[上游存储库图表，其中显示了三个存储库链接在一起，并与 npmjs.com 建立了外部上游连接。\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/upstream-chaining-external.png)


 如果连接到 `repo-A` 的程序包管理器请求特定的程序包版本（例如，*lodash 4.17.20*），而三个存储库中的任何一个都不存在该程序包版本，则将从 **npmjs.com** 提取该程序包版本。当提取 *lodash 4.17.20* 时，该版本将保留在 `repo-A`（因为这是最下游的存储库）和 `npm-public-registry-gateway`（因为它具有与公共外部存储库 **npmjs.com** 的上游连接）中。*lodash 4.17.20* 不会保留在 `repo-B` 中（因为这是中间存储库）。

# 移除上游存储库
<a name="packages-upstream-repositories-remove"></a>

如果您不再需要访问上游存储库中的程序包，可以从程序包存储库中移除上游存储库。

**警告**  
移除上游存储库时，可能会中断上游关系链，从而破坏您的项目或构建。

**移除上游存储库**

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择要从中移除上游存储库的程序包存储库。

1. 在程序包存储库的名称下，选择**上游**。

1. 在**编辑上游存储库**部分中，找到要移除的上游存储库，然后选择 ![\[Remove\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/remove.png)。

1. 完成对上游存储库的移除后，选择**保存**。

# 连接到公共外部存储库
<a name="packages-connect-external"></a>

您可以通过将相应的网关存储库添加为上游存储库，将 CodeCatalyst 软件包存储库连接到支持的公共外部存储库。网关存储库充当中间存储库，用于搜索和存储从外部存储库提取的程序包。这样可以减少时间和数据传输，因为项目中的所有程序包存储库都可以使用网关存储库中存储的程序包。

**使用网关存储库连接到公共存储库**

1. 在导航窗格中，选择**程序包**。

1. 在**程序包**中，选择**网关存储库**页面。您可以查看受支持的网关存储库及其描述的列表。

1. 必须先创建一个网关存储库，之后才能使用该网关存储库。如果已创建网关存储库，则将显示其创建日期和时间。如果未创建，请选择**创建**以创建它。

1. 要使用网关存储库中的软件包，必须设置从存储库到网关 CodeCatalyst 存储库的上游连接。选择**程序包存储库**，然后选择要连接到的程序包存储库。

1. 要连接到公共存储库，请选择**上游**，然后选择**选择上游存储库**。

1. 选择**网关存储库**，选择与要连接到的公共存储库对应的网关存储库作为上游存储库。

1. 选择所有要添加为上游存储库的网关存储库后，选择**选择**。

1. 完成对上游存储库的排序后，选择**保存**。

有关上游存储库的更多信息，请参阅[配置并使用上游存储库](packages-upstream-repositories.md)。

在将网关存储库添加为上游存储库后，您可以使用连接到本地存储库的程序包管理器从与其对应的公共外部程序包存储库中获取程序包。您无需更新程序包管理器配置。通过此方式使用的程序包同时存储在网关存储库和本地程序包存储库中。有关从上游存储库请求程序包版本的更多信息，请参阅[请求包含上游存储库的程序包版本](packages-upstream-repositories-request.md)。

## 支持的外部程序包存储库及其网关存储库
<a name="packages-upstream-repositories-supported-external"></a>

CodeCatalyst 支持使用网关存储库向以下官方包授权机构添加上游连接。


| 存储库程序包类型 | 说明 | 网关存储库名称 | 
| --- | --- | --- | 
| npm | npm 公有注册表 | npm-public-registry-gateway | 
| Python | Python 包索引 | pypi-gateway | 
| Maven | Maven Central | maven-central-gateway | 
| Maven | Google Android 存储库 | google-android-gateway | 
| Maven | CommonsWare | commonsware-gateway | 
| Maven | Gradle 插件存储库 | gradle-plugins-gateway | 
| NuGet | NuGet 画廊 | nuget-gallery-gateway | 

# 发布和修改程序包
<a name="working-with-packages"></a>

中的软件*包* CodeCatalyst 是解决依赖关系和安装软件所需的软件和元数据的捆绑包。有关中支持的软件包格式列表 CodeCatalyst，请参阅[在中发布和共享软件包 CodeCatalyst](packages.md)。本节提供有关发布、查看、删除程序包和更新程序包版本状态的信息。

**Topics**
+ [将包发布到 CodeCatalyst 包存储库](package-publishing.md)
+ [查看程序包版本详细信息](working-with-packages-view.md)
+ [删除程序包版本](working-with-packages-delete.md)
+ [更新程序包版本的状态](working-with-packages-update-version-status.md)
+ [编辑程序包来源控制](package-origin-controls.md)

# 将包发布到 CodeCatalyst 包存储库
<a name="package-publishing"></a>

 您可以使用包管理器工具将任何支持的软件 CodeCatalyst 包类型的版本发布到包存储库。发布程序包版本的步骤如下：

**将软件包版本发布到 CodeCatalyst 包存储库**

1. 如果还没有程序包存储库，请[创建一个程序包存储库](packages-repositories-create.md)。

1. 将您的程序包管理器连接到您的程序包存储库。有关如何将 npm 包管理器连接到软件 CodeCatalyst 包存储库的说明，请参阅[配置并使用 npm](packages-npm-use.md)。

1. 使用连接的程序包管理器发布您的程序包版本。

**Contents**
+ [发布和上游存储库](#package-publishing-upstreams)
+ [私有程序包和公有存储库](#package-publishing-upstreams-direct)
+ [覆盖程序包资产](#package-publishing-overwrite-assets)

## 发布和上游存储库
<a name="package-publishing-upstreams"></a>

在中 CodeCatalyst，您无法发布存在于可访问的上游存储库或公共存储库中的软件包版本。例如，假设您要将 npm 程序包 `lodash@1.0` 发布到程序包存储库 `myrepo`，并且 `myrepo` 通过配置为上游存储库的网关存储库连接到 npmjs.com。如果存在`lodash@1.0`于上游存储库或 npmjs.com 中，则`myrepo`通过发出 CodeCatalyst 409 冲突错误来拒绝任何向其发布的尝试。这有助于防止您意外发布与上游存储库中的程序包的名称和版本相同的程序包，这可能会导致意外行为。

您仍可以发布具有上游存储库中存在的程序包名称的其他版本。例如，如果 `lodash@1.0` 存在于上游存储库中，但 `lodash@1.1` 不存在该存储库中，则可以将 `lodash@1.1` 发布到下游存储库。

## 私有程序包和公有存储库
<a name="package-publishing-upstreams-direct"></a>

 CodeCatalyst 不会将存储在存储 CodeCatalyst 库中的软件包发布到公共存储库，例如 npmjs.com 或 Maven Central。 CodeCatalyst 将软件包从公共存储库导入 CodeCatalyst 存储库，但它不会将软件包朝相反的方向移动。您发布到 CodeCatalyst 存储库的包将保持私有状态，并且仅适用于存储库所属的 CodeCatalyst 项目。

## 覆盖程序包资产
<a name="package-publishing-overwrite-assets"></a>

 您无法重新发布已存在且包含不同内容的程序包资产。例如，假定您已经发布了一个具有 JAR 资产 `mypackage-1.0.jar` 的 Maven 程序包。仅当新旧资产的校验和完全相同时，您才能再次发布该资产。要重新发布包含新内容的相同资产，请先删除该程序包版本。尝试重新发布具有不同内容但名称相同的资产会导致出现 HTTP 409 冲突错误。

对于支持多种资产（Python 和 Maven）的程序包格式，您可以向现有程序包版本添加使用不同名称的新资产，前提是您拥有所需的权限。由于 npm 和每个软件包版本 NuGet 仅支持一个资产，因此要修改已发布的软件包版本，必须先将其删除。

 如果您尝试重新发布已存在的资产（例如 `mypackage-1.0.jar`），并且已发布资产和新资产的内容相同，则因为该操作具有幂等性，所以操作会成功。

# 查看程序包版本详细信息
<a name="working-with-packages-view"></a>

您可以使用 CodeCatalyst 控制台查看有关特定软件包版本的详细信息。

**查看程序包版本详细信息**

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择包含要查看其详细信息的程序包版本的存储库。

1. 在**程序包**表中搜索程序包版本。您可以使用搜索栏按程序包名称和格式筛选程序包。从列表中选择程序包。

1. 在**程序包详细信息**页面上，选择**版本**，然后选择您要查看的版本。

# 删除程序包版本
<a name="working-with-packages-delete"></a>

您可以从 CodeCatalyst 控制台的 Package **版本详情页面删除软件包版本**。

**删除程序包版本**

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择包含要删除的程序包版本的存储库。

1. 从表中搜索并选择程序包。

1. 在**程序包详细信息**页面上，选择**版本**，然后选择您要删除的版本。

1. 在**程序包版本详细信息**页面上，选择**版本操作**，然后选择**删除**。

1. 在文本字段中输入*删除*，然后选择**删除**。

# 更新程序包版本的状态
<a name="working-with-packages-update-version-status"></a>

中的每个软件包版本都 CodeCatalyst 有一个描述软件包版本的当前状态和可用性的状态。您可以在 CodeCatalyst控制台中更改软件包版本状态。有关程序包版本可能的状态值及其含义的更多信息，请参阅[程序包版本状态](#package-version-status)。

**更新程序包版本的状态**

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择包含要更新状态的程序包版本的存储库。

1. 从表中搜索并选择程序包。

1. 在**程序包详细信息**页面上，选择**版本**，然后选择要查看的版本。

1. 在**程序包版本详细信息**页面上，选择**操作**，然后选择**未列出**、**存档**或**处置**。有关每种程序包版本状态的更多信息，请参阅[程序包版本状态](#package-version-status)。

1. 在文本字段中输入确认文本，然后根据要更新到的状态，选择**未列出**、**存档**或**处置**。

## 程序包版本状态
<a name="package-version-status"></a>

程序包版本状态的可能值如下所示。您可以在控制台中更改程序包版本状态。有关更多信息，请参阅 [更新程序包版本的状态](#working-with-packages-update-version-status)。
+  **已发布** – 已成功发布程序包版本，可以使用程序包管理器来请求版本。程序包版本将包括在返回给程序包管理器的程序包版本列表中，例如，在 `npm view <package-name> versions` 的输出中。程序包版本的所有资产均可从存储库中获得。
+  **未完成**：上次发布尝试未完成。当前，只有 Maven 程序包版本可以处于**未完成**状态。当客户端上传程序包版本的一个或多个资源，但没有为包括该版本的程序包发布 `maven-metadata.xml` 文件时，就会发生这种情况。
+  **未列出**：程序包版本的资产可从存储库下载，但该程序包版本未包含在向程序包管理器返回的版本列表中。例如，对于 npm 程序包，`npm view <package-name> versions` 的输出不包括该程序包版本。因为在可用版本列表中未显示该版本，这意味着 npm 的依赖项解析逻辑不会选择该程序包版本。但是，如果 `npm package-lock.json` 文件中已经引用了**未列出**的程序包版本，则仍然可以下载和安装该版本，例如在运行 `npm ci` 时。
+  **已存档**：该程序包版本的资产无法再下载。在返回给程序包管理器的版本列表中不会包括该程序包版本。由于资产不可用，因此会阻止客户端使用程序包版本。如果您的应用程序构建依赖于更新为**已存档**的版本，那么构建就会失败，除非该程序包版本已在本地缓存。您不能使用程序包管理器或构建工具来重新发布**已存档**的程序包版本，因为它仍然存在于存储库中。但是，您可以在控制台中将程序包版本状态更改回**未列出**或**已发布**。
+  **已处置**：程序包版本未显示在列表中，也无法从存储库下载资产。“已**处置**” 和 “**已存档**” 之间的主要区别在于，如果状态为 “已**处置**”，则软件包版本的资产将被永久删除 CodeCatalyst。因此，您无法将程序包版本从**已处置**更改为**已存档**、**未列出**或**已发布**。由于已删除资产，因此无法使用该程序包版本。将程序包版本标记为**已处置**后，您无需再支付程序包资产的存储费用。

 除了前面列表中的状态外，程序包版本还可以删除。删除程序包版本后，存储库中将没有该版本，您可以使用程序包管理器或构建工具随意地重新发布该程序包版本。

## 程序包名称、程序包版本和资产名称规范化
<a name="package-name-normalization"></a>

CodeCatalyst 在存储软件包名称、软件包版本和资源名称之前对其进行标准化，这意味着中的名称或版本 CodeCatalyst 可能与发布软件包时提供的名称或版本不同。有关如何标准化每种软件包类型的名称和版本 CodeCatalyst 的更多信息，请参阅以下文档。
+ [Python 程序包名称规范化](python-name-normalization.md)
+ [NuGet 软件包名称、版本和资产名称标准化](nuget-name-normalization.md)

CodeCatalyst 不对其他包格式执行标准化。

# 编辑程序包来源控制
<a name="package-origin-controls"></a>

在 Amazon 中 CodeCatalyst，可以通过直接发布软件包版本、从上游存储库中提取包版本或通过网关从外部公共存储库摄取包版本来将其添加到包存储库中。如果您允许通过直接发布和从公有存储库摄取来添加程序包的版本，则您会容易受到依赖项替换攻击。有关更多信息，请参阅[依赖项替换攻击](#dependency-substitution-attacks)。为了保护自己免受依赖项替换攻击，请对存储库中的程序包配置程序包来源控制，从而限制将该程序包的版本添加到存储库的方式。

您应考虑配置程序包来源控制以使不同程序包的新版本同时来自内部来源（例如直接发布）和外部来源（例如公有存储库）。默认情况下，根据程序包的第一个版本添加到存储库的方式来配置程序包来源控制。

## 程序包来源控制设置
<a name="package-origin-control-settings"></a>

使用程序包来源控制，您可以配置将程序包版本添加到存储库的方式。以下列表包括可用的程序包来源控制设置和值。

**发布**

此设置配置了是否可以使用程序包管理器或类似工具将程序包版本直接发布到存储库。
+ **允许**：可以直接发布程序包版本。
+ **阻止**：不可以直接发布程序包版本。

**上游**

此设置配置了在程序包管理器发出请求时，是从外部的公有存储库中摄取程序包版本，还是在上游存储库中保留程序包版本。
+ **允许**：任何软件包版本都可以从配置为上游 CodeCatalyst 存储库的其他存储库中保留，也可以通过外部连接从公共来源获取。
+ **BLOCK**：Package 版本不能从配置为上游存储 CodeCatalyst 库的其他存储库中保留，也不能从具有外部连接的公共来源获取。

### 默认程序包来源控制设置
<a name="default-package-origin-control-settings"></a>

程序包的默认程序包来源控制基于该程序包的第一个版本添加到程序包存储库中的方式。
+ 如果第一个程序包版本由程序包管理器直接发布，则设置将为**发布：允许**和**上游：阻止**。
+ 如果第一个程序包版本是从公有来源摄取，则设置将为**发布：阻止**和**上游：允许**。

## 常见的程序包访问控制场景
<a name="package-origin-control-scenarios"></a>

本节介绍将软件包版本添加到软件 CodeCatalyst 包存储库时的一些常见场景。根据第一个程序包版本的添加方式为新程序包设置程序包来源控制设置。

在以下场景中，*内部程序包*会直接从程序包管理器发布到存储库，例如您维护的程序包。*外部程序包*是存在于公有存储库中的程序包，可以通过网关存储库上游将其摄取到您的存储库中。

**为现有内部程序包发布了外部程序包版本**

在此场景中，考虑一个内部程序包 *packageA*。您的团队将 *PackageA 的第一个软件包*版本发布到 CodeCatalyst 软件包存储库。由于这是该程序包的第一个程序包版本，因此程序包来源控制设置会自动设置为**发布：允许**和**上游：阻止**。在您的存储库中发布软件包后，同名的包将发布到与您的软件 CodeCatalyst 包存储库连接的公共存储库中。这可能是针对内部程序包的企图依赖项替换攻击，也可能只是巧合。无论如何，配置程序包来源控制来阻止摄取新的外部版本，从而保护自己免受潜在的攻击。

在下图中，*RepoA* 是您的 CodeCatalyst 软件包存储库，与存储库有上游连接。`npm-public-registry-gateway`您的存储库包含 *packageA* 的版本 1.1 和 2.1，但版本 3.0 已发布到公有存储库。通常，*repoA* 会在程序包管理器请求程序包后摄取版本 3.0。由于软件包提取设置为 “**阻止**”，因此版本 3.0 不会提取到您的 CodeCatalyst 软件包存储库中，也无法供与其连接的包管理员使用。

![\[一个简单的图形，显示了已阻止来自公有存储库的新外部程序包版本。\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/package-origin-controls-one.png)


**已为现有外部程序包发布内部程序包版本**

在此场景中，在外部的公有存储库中有一个名为 *packageB* 的程序包，已将该公有存储库连接到您的存储库。当连接到您的存储库的程序包管理器请求 *packageB* 时，从公有存储库中将程序包版本摄取到您的存储库中。由于这是 *packageB* 添加到存储库中的第一个程序包版本，因此程序包来源设置配置为**发布：阻止**和**上游：允许**。稍后，您尝试将具有相同程序包名称的版本发布到存储库。您可能不知道该公共软件包并试图发布一个不相关的同名包，或者您可能正在尝试发布已修补的版本，或者您可能正在尝试直接发布外部已经存在的确切软件包版本。 CodeCatalyst 拒绝您尝试发布的版本，但如有必要，您可以明确覆盖拒绝并发布该版本。

在下图中，*RepoA* 是您的 CodeCatalyst 软件包存储库，与存储库有上游连接。`npm-public-registry-gateway`您的程序包存储库包含从公有存储库中摄取的版本 3.0。您想将版本 1.2 发布到您的程序包存储库。通常，您可以将版本 1.2 发布到 *repoA*，但是由于发布设置为**阻止**，因此无法发布版本 1.2。

![\[显示软件包发布已被阻止的简单图形。\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/package-origin-controls-two.png)


**发布现有外部程序包的已修补程序包版本**

在此场景中，在外部的公有存储库中有一个名为 *packageB* 的程序包，已将该公有存储库连接到您的程序包存储库。当连接到您的存储库的程序包管理器请求 *packageB* 时，从公有存储库中将程序包版本摄取到您的存储库中。由于这是 *packageB* 添加到存储库中的第一个程序包版本，因此程序包来源设置配置为**发布：阻止**和**上游：允许**。您的团队决定将此程序包的已修补程序包版本发布到存储库。为了能够直接发布程序包版本，您的团队将程序包来源控制设置更改为**发布：允许**和**上游：阻止**。此程序包的版本现在可以直接发布到您的存储库并从公有存储库中摄取。在您的团队发布已修补的程序包版本后，您的团队会将程序包来源设置恢复为**发布：阻止**和**上游：允许**。

## 编辑程序包来源控制
<a name="edit-package-origin-controls"></a>

根据程序包的第一个程序包版本添加到程序包存储库的方式来自动配置程序包来源控制。有关更多信息，请参阅 [默认程序包来源控制设置](#default-package-origin-control-settings)。要在包存储库中为包添加或编辑 CodeCatalyst 包源控件，请执行以下过程中的步骤。

**添加或编辑程序包来源控制**

1. 在导航窗格中，选择**程序包**。

1. 选择包含要编辑的程序包的程序包存储库。

1. 在**程序包**表中，搜索并选择要编辑的程序包。

1. 在程序包摘要页面中，选择**来源控制**。

1. 在**来源控制**中，选择要为此程序包设置的程序包来源控制。必须同时设置两个程序包来源控制设置（**发布**和**上游**）。
   + 要允许直接发布程序包版本，请在**发布**中选择**允许**。要阻止发布程序包版本，请选择**阻止**。
   + 要允许从外部存储库摄取程序包和从上游存储库提取程序包，请在**上游来源**中选择**允许**。要阻止所有从外部存储库和上游存储库进行的程序包版本摄取和提取，请选择**阻止**。

1. 选择**保存**。

## 发布和上游存储库
<a name="package-publishing-upstreams"></a>

在中 CodeCatalyst，您无法发布存在于可访问的上游存储库或公共存储库中的软件包版本。例如，假设您要将 npm 程序包 `lodash@1.0` 发布到存储库 `myrepo`，并且 `myrepo` 有一个与 npmjs.com 进行外部连接的上游存储库。考虑以下场景。

1. `lodash` 上的程序包来源控制设置为**发布：允许**和**上游：允许**。如果存在`lodash@1.0`于上游存储库或 npmjs.com 中，则`myrepo`通过发出 CodeCatalyst 409 冲突错误来拒绝任何向其发布的尝试。您仍然可以发布另一个版本，例如 `lodash@1.1`。

1. `lodash` 上的程序包来源控制设置为**发布：允许**和**上游：阻止**。您可以将 `lodash` 的任何版本发布到由于无法访问程序包版本而尚不存在该版本的存储库中。

1. `lodash` 上的程序包来源控制设置为**发布：阻止**和**上游：允许**。您不能直接将任何程序包版本发布到您的存储库。

## 依赖项替换攻击
<a name="dependency-substitution-attacks"></a>

程序包管理器简化了打包和共享可重用代码的过程。这些程序包可能是组织为了在其应用程序中使用而开发的私有程序包，也可能是公有程序包（通常是在组织外部开发并由公有程序包存储库分发的开源程序包）。在请求程序包时，开发人员依靠他们的程序包管理器来提取其依赖项的新版本。依赖项替换攻击也称为依赖项混淆攻击，该攻击利用了这样一个事实，即程序包管理器通常无法区分程序包的合法版本和恶意版本。

依赖项替换攻击是被称为软件供应链攻击的黑客攻击的其中一种形式。软件供应链攻击是一种利用软件供应链中任何地方的漏洞进行的攻击。

依赖项替换攻击可以针对任何人，包括使用内部开发的程序包和从公有存储库提取的程序包的用户。攻击者识别内部程序包名称，然后策略性地将同名的恶意代码放置在公有程序包存储库中。通常，恶意代码在版本号较高的程序包中发布。因为程序包管理器认为恶意程序包是程序包的最新版本，所以从这些公有源中提取恶意代码。这种行为会导致期望程序包和恶意程序包之间发生“混淆”或“替换”，进而导致代码被篡改。

为了防止依赖替换攻击，Amazon CodeCatalyst 提供了包裹来源控制。程序包来源控制是用于控制如何将程序包添加到存储库的设置。将新软件包的第一个软件包版本添加到 CodeCatalyst 存储库时，会自动配置控件。这些控件可以确保软件包版本不能既直接发布到您的存储库，也不能从公共来源获取，从而保护您免受依赖关系替换攻击。有关程序包来源控制以及如何更改该设置的更多信息，请参阅[编辑程序包来源控制](#package-origin-controls)。

# 使用 npm
<a name="packages-npm"></a>

这些主题描述了如何使用 `npm` Node.js 软件包管理器 CodeCatalyst。

**注意**  
CodeCatalyst 支持`node v4.9.1`以及以后`npm v5.0.0`和以后。

**Topics**
+ [配置并使用 npm](packages-npm-use.md)
+ [npm 标签处理](packages-npm-tags.md)

# 配置并使用 npm
<a name="packages-npm-use"></a>

要`npm`与一起使用 CodeCatalyst，您必须`npm`连接到软件包存储库并提供用于身份验证的个人访问令牌 (PAT)。您可以在 CodeCatalyst 控制台中查看有关`npm`连接到软件包存储库的说明。

**Contents**
+ [使用以下命令配置 npm CodeCatalyst](#npm-configure)
+ [从软件包存储库安装 npm CodeCatalyst 软件包](#npm-install)
+ [通过 npmjs 安装 npm 软件包 CodeCatalyst](#npm-install-npmjs)
+ [将 npm 包发布到你的软件 CodeCatalyst 包存储库](#npm-publish)
+ [npm 命令支持](#npm-commands)
  + [与程序包存储库进行交互的受支持命令](#supported-commands-that-interact-with-a-repository)
  + [支持的客户端命令](#supported-client-side-commands)
  + [不受支持的命令](#unsupported-commands)

## 使用以下命令配置 npm CodeCatalyst
<a name="npm-configure"></a>

以下说明说明了如何进行身份验证并`npm`连接到您的 CodeCatalyst 软件包存储库。有关更多信息，请参阅 [npm 官方文档](https://docs.npmjs.com/)。

**`npm`连接到您的 CodeCatalyst 软件包存储库**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 导航到您的项目。

1. 在导航窗格中，选择**程序包**。

1. 从列表中选择您的程序包存储库。

1. 选择**连接到存储库**。

1. 在**配置详细信息**中，在**程序包管理器客户端**中，选择 **npm 客户端**。

1. 选择您的操作系统以查看相应的配置步骤。

1. 需要个人访问令牌 (PAT) 才能对 npm 进行 CodeCatalyst身份验证。如果您已有令牌，则可使用它。如果没有，您可以使用以下步骤创建一个令牌。

   1. **（可选）：**更新 **PAT 名称**和**到期日期**。

   1. 选择**创建令牌**。

   1. 将 PAT 复制并存储在安全位置。
**警告**  
关闭此对话框后，您将无法再次查看或复制您的 PAT。凭证应是短期有效的，以最大限度地减少攻击者在盗用凭证后有效地使用凭证的时间。

1. 从项目的根目录运行以下命令，对程序包存储库配置 npm。这些命令将执行以下操作：
   + 如果您的项目没有项目级 `.npmrc` 文件，则会创建该文件。
   + 将程序包存储库端点信息添加到您的项目级 `.npmrc` 文件中。
   + 将您的凭证（PAT）添加到您的用户级 `.npmrc` 文件中。

   替换以下值。
**注意**  
如果通过控制台指令进行复制，则以下命令中的值将进行更新且无需更改。
   + *username*用您的 CodeCatalyst 用户名替换。
   + *PAT*用您的 CodeCatalyst PAT 替换。
   + *space\$1name*替换为您的 CodeCatalyst 空间名称。
   + *proj\$1name*用您的 CodeCatalyst 项目名称替换。
   + *repo\$1name*替换为你的 CodeCatalyst 软件包存储库名称。

   ```
   npm set registry=https://packages.region.codecatalyst.aws/npm/space-name/proj-name/repo-name/ --location project
   npm set //packages.region.codecatalyst.aws/npm/space-name/proj-name/repo-name/:_authToken=username:PAT
   ```

   **对于 npm 6 或更低版本：**要让 npm 始终将身份验证令牌传递给 CodeCatalyst，即使是`GET`请求也是如此，请按如下方式设置 always-auth 配置变量。`npm config set`

   ```
   npm set //packages.region.codecatalyst.aws/npm/space-name/proj-name/repo-name/:always-auth=true --location project
   ```

## 从软件包存储库安装 npm CodeCatalyst 软件包
<a name="npm-install"></a>

在按照[使用以下命令配置 npm CodeCatalyst](#npm-configure) 中的步骤操作来将 npm 连接到存储库后，您可以在存储库上运行 `npm` 命令。

您可以使用`npm install`命令安装位于软件 CodeCatalyst 包存储库或其上游存储库之一中的 npm 软件包。

```
npm install lodash
```

## 通过 npmjs 安装 npm 软件包 CodeCatalyst
<a name="npm-install-npmjs"></a>

你可以通过 CodeCatalyst 存储库从 npmjs.com 安装来自 [npmjs.com](https://www.npmjs.com/) 的 npm 软件包，方法是将存储库配置为与连接到 npmjs.com 的网关存储库的上游连接。**npm-public-registry-gateway**从 npmjs 安装的程序包被提取并存储在网关存储库和最远的下游程序包存储库中。

**从 npmjs 安装程序包**

1. 如果您尚未执行此操作，请`npm`按照中的步骤使用 CodeCatalyst软件包存储库进行配置[使用以下命令配置 npm CodeCatalyst](#npm-configure)。

1. 检查您的存储库是否已将网关存储库添加为上游连接。**npm-public-registry-gateway**按照中的说明[添加上游存储库](packages-upstream-repositories-add.md)并选择**npm-public-registry-gateway**存储库，您可以检查添加了哪些上游源或**npm-public-registry-gateway**将其添加为上游源。

1. 使用 `npm install` 命令安装程序包。

   ```
   npm install package_name
   ```

有关从上游存储库请求程序包的更多信息，请参阅[请求包含上游存储库的程序包版本](packages-upstream-repositories-request.md)。

## 将 npm 包发布到你的软件 CodeCatalyst 包存储库
<a name="npm-publish"></a>

完成[使用以下命令配置 npm CodeCatalyst](#npm-configure) 后，您可以运行 `npm` 命令。

你可以使用`npm publish`命令将 npm 包发布到 CodeCatalyst 软件包存储库。

```
npm publish
```

有关如何创建 npm 程序包的信息，请参阅 *npm Docs* 上的 [Creating Node.js Modules](https://docs.npmjs.com/getting-started/creating-node-modules)。

## npm 命令支持
<a name="npm-commands"></a>

以下各节除了列出不支持的特定`npm`命令外，还总结了 CodeCatalyst软件包存储库支持的命令。

**Topics**
+ [与程序包存储库进行交互的受支持命令](#supported-commands-that-interact-with-a-repository)
+ [支持的客户端命令](#supported-client-side-commands)
+ [不受支持的命令](#unsupported-commands)

### 与程序包存储库进行交互的受支持命令
<a name="supported-commands-that-interact-with-a-repository"></a>

此部分列出了 `npm` 命令，其中 `npm` 客户端向其配置到的注册表（例如 `npm config set registry`）发出一个或多个请求。这些命令已经过验证，在针对 CodeCatalyst 软件包存储库调用时可以正常运行。


****  

| 命令 | 说明 | 
| --- | --- | 
|   [bugs](https://docs.npmjs.com/cli/bugs)   |  猜测程序包的错误跟踪器 URL 的位置，然后尝试打开它。  | 
|   [ci](https://docs.npmjs.com/cli/ci)   |  从零开始安装一个项目。  | 
|   [deprecate](https://docs.npmjs.com/cli/deprecate)   |  弃用程序包的某个版本。  | 
|   [dist-tag](https://docs.npmjs.com/cli/dist-tag)   |  修改程序包分发标签。  | 
|   [docs](https://docs.npmjs.com/cli/docs)   |  猜测程序包的文档 URL 的位置，然后尝试使用 `--browser` 配置参数打开它。  | 
|   [doctor](https://docs.npmjs.com/cli/doctor)   |  运行一组检查以验证你的 npm 安装是否可以管理你的 JavaScript 软件包。  | 
|   [install](https://docs.npmjs.com/cli/install)   |  安装程序包。  | 
|   [install-ci-test](https://docs.npmjs.com/cli/install-ci-test)   |  从零开始安装一个项目并运行测试。别名：`npm cit`。此命令运行 `npm ci`，然后立即运行 `npm test`。  | 
|   [install-test](https://docs.npmjs.com/cli/install-test)   |  安装程序包并运行测试。运行 `npm install`，然后立即运行 `npm test`。  | 
|   [outdated](https://docs.npmjs.com/cli/outdated)   |  检查已配置的注册表，确定是否有任何已安装的程序包已过时。  | 
|   [ping](https://docs.npmjs.com/cli/ping)   |  ping 已配置或给定的 npm 注册表并验证身份验证。  | 
|   [publish](https://docs.npmjs.com/cli/publish)   |  将程序包版本发布到注册表。  | 
|   [update](https://docs.npmjs.com/cli/update)   |  猜测程序包存储库 URL 的位置，然后尝试使用 `--browser` 配置参数来打开它。  | 
|   [view](https://docs.npmjs.com/cli/view)   |  显示程序包元数据。也可用于输出元数据属性。  | 

### 支持的客户端命令
<a name="supported-client-side-commands"></a>

这些命令不需要与软件包存储库进行任何直接交互，因此 CodeCatalyst不需要任何东西来支持它们。


****  

| 命令 | 说明 | 
| --- | --- | 
|   [bin（旧版）](https://docs.npmjs.com/cli/v8/commands/npm-bin)   |  显示 npm `bin` 目录。  | 
|   [build](https://docs.npmjs.com/cli/v6/commands/npm-build)   |  构建程序包。  | 
|   [cache](https://docs.npmjs.com/cli/cache)   |  操作程序包缓存。  | 
|   [completion](https://docs.npmjs.com/cli/completion)   |  在所有 npm 命令中启用制表符自动完成功能。  | 
|   [config](https://docs.npmjs.com/cli/config)   |  更新用户和全局 `npmrc` 文件的内容。  | 
|   [dedupe](https://docs.npmjs.com/cli/dedupe)   |  搜索本地程序包树，并尝试通过将依赖项进一步向上移动来简化结构，这样多个依赖程序包就可以更有效地共享依赖项。  | 
|   [edit](https://docs.npmjs.com/cli/edit)   |  编辑已安装的程序包。在当前工作目录中选择一个依赖项，然后在默认编辑器中打开程序包目录。  | 
|   [explore](https://docs.npmjs.com/cli/explore)   |  浏览已安装的程序包。在指定的已安装程序包目录中创建一个子 Shell。如果指定了一条命令，则此命令将在该子 Shell 中运行，然后立即停止运行。  | 
|   [help](https://docs.npmjs.com/cli/help)   |  获取有关 npm 的帮助。  | 
|   [help-search](https://docs.npmjs.com/cli/help-search)   |  搜索 npm 帮助文档。  | 
|   [init](https://docs.npmjs.com/cli/init)   |  创建 `package.json` 文件。  | 
|   [link](https://docs.npmjs.com/cli/link)   |  创建指向程序包目录的符号链接。  | 
|   [ls](https://docs.npmjs.com/cli/ls)   |  列出已安装的程序包。  | 
|   [pack](https://docs.npmjs.com/cli/pack)   |  将程序包打包成 tarball。  | 
|   [prefix](https://docs.npmjs.com/cli/prefix)   |  显示前缀。除非同时也指定了 `-g`，否则这是包含 `package.json` 文件的最近一级父目录。  | 
|   [prune](https://docs.npmjs.com/cli/prune)   |  删除未在父程序包依赖项列表中列出的程序包。  | 
|   [rebuild](https://docs.npmjs.com/cli/rebuild)   |  对匹配的文件夹运行 `npm build` 命令。  | 
|   [restart](https://docs.npmjs.com/cli/restart)   |  运行程序包的停止、重启和启动脚本以及相关的前置和后置脚本。  | 
|   [root](https://docs.npmjs.com/cli/root)   |  将有效的 `node_modules` 目录输出到标准输出。  | 
|   [run-script](https://docs.npmjs.com/cli/run-script)   |  运行任意程序包脚本。  | 
|   [shrinkwrap](https://docs.npmjs.com/cli/shrinkwrap)   |  锁定依赖项版本以供发布。  | 
|   [uninstall](https://docs.npmjs.com/cli/uninstall)   |  卸载程序包。  | 

### 不受支持的命令
<a name="unsupported-commands"></a>

 CodeCatalyst 软件包存储库不支持这些`npm`命令。


****  

| 命令 | 说明 | 备注 | 
| --- | --- | --- | 
|   [access](https://docs.npmjs.com/cli/access)   |  设置已发布程序包的访问级别。  |  CodeCatalyst 使用的权限模型不同于公共 npmjs 存储库。  | 
|   [adduser](https://docs.npmjs.com/cli/adduser)   |  添加注册表用户账户  |  CodeCatalyst 使用的用户模型不同于公共 npmjs 存储库。  | 
|   [audit](https://docs.npmjs.com/cli/audit)   |  运行安全审核。  |  CodeCatalyst 目前不提供安全漏洞数据。  | 
|   [hook](https://docs.npmjs.com/cli/v9/commands/npm-hook)   |  管理 npm 钩子，包括添加、移除、列出和更新。  |  CodeCatalyst 目前不支持任何变更通知机制。  | 
|   [login](https://docs.npmjs.com/cli-commands/adduser.html)   |  对用户进行身份验证。这是 `npm adduser` 的一个别名。  |  CodeCatalyst 使用的身份验证模型不同于公共 npmjs 存储库。有关信息，请参阅[使用以下命令配置 npm CodeCatalyst](#npm-configure)。  | 
|   [logout](https://docs.npmjs.com/cli/logout)   |  注销注册表。  |  CodeCatalyst 使用的身份验证模型不同于公共 npmjs 存储库。无法从 CodeCatalyst 存储库中注销，但是身份验证令牌将在其可配置的到期时间后过期。默认令牌持续时间为 12 小时。  | 
|   [owner](https://docs.npmjs.com/cli/owner)   |  管理程序包所有者。  |  CodeCatalyst 使用的权限模型不同于公共 npmjs 存储库。  | 
|   [profile](https://docs.npmjs.com/cli/profile)   |  更改注册表配置文件的设置。  |  CodeCatalyst 使用的用户模型不同于公共 npmjs 存储库。  | 
|   [search](https://docs.npmjs.com/cli/search)   |  在注册表中搜索与搜索词匹配的程序包。  |  CodeCatalyst 不支持该`search`命令。  | 
|   [star](https://docs.npmjs.com/cli/star)   |  标记您喜欢的程序包。  |  CodeCatalyst 目前不支持任何收藏夹机制。  | 
|   [stars](https://docs.npmjs.com/cli/stars)   |  查看已标记为收藏的程序包。  |  CodeCatalyst 目前不支持任何收藏夹机制。  | 
|   [team](https://docs.npmjs.com/cli/team)   |  管理团队和团队成员资格。  |  CodeCatalyst 使用的用户和组成员资格模型不同于公共 npmjs 存储库。  | 
|   [token](https://docs.npmjs.com/cli/token)   |  管理您的身份验证令牌。  |  CodeCatalyst 使用不同的模型来获取身份验证令牌。有关信息，请参阅[使用以下命令配置 npm CodeCatalyst](#npm-configure)。  | 
|   [unpublish](https://docs.npmjs.com/cli/unpublish)   |  从注册表中移除程序包。  |  CodeCatalyst 不支持使用 npm 客户端从存储库中删除软件包版本。您可以在控制台中删除程序包。  | 
|   [whoami](https://docs.npmjs.com/cli/whoami)   |  显示 npm 用户名。  |  CodeCatalyst 使用的用户模型不同于公共 npmjs 存储库。  | 

# npm 标签处理
<a name="packages-npm-tags"></a>

npm 注册表支持*标签*，这些标签是程序包版本的字符串别名。您可以使用标签来提供别名而不是使用版本号。例如，您有一个包含多个开发流的项目，并且为每个流使用不同的标签（例如 `stable`、`beta`、`dev`、`canary`）。有关更多信息，请参阅 *npm Docs* 上的 [dist-tag](https://docs.npmjs.com/cli/dist-tag)。

默认情况下，npm 使用 `latest` 标签来标识程序包的当前版本。`npm install pkg`（不带 `@version` 或 `@tag` 说明符）会安装最新的标签。通常，项目仅对稳定发行版使用最新标签。对于不稳定版本或预发行版本使用其他标签。

## 使用 npm 客户端编辑标签
<a name="editing-tags-with-the-npm-client"></a>

 这三个`npm dist-tag`命令（`add``rm`、和`ls`）在 CodeCatalyst 软件包存储库中的功能与它们在[默认 npm 注册表](https://registry.npmjs.com/)中的功能相同。

## npm 标签和上游存储库
<a name="packages-tags-and-upstreams"></a>

当`npm`请求某个软件包的标签以及该软件包的版本也存在于上游存储库中时，会先 CodeCatalyst 合并这些标签，然后再将其返回给客户端。例如，名为 `R` 的存储库有一个名为 `U` 的上游存储库。下表显示了两个存储库中都存在的名为 `web-helper` 的程序包的标签。


****  

| Repository | 程序包名称 | 程序包标签 | 
| --- | --- | --- | 
|  R  |  `web-helper`  |   *最新*（版本 1.0.0 的别名）  | 
|  U  |  `web-helper`  |   *alpha*（版本 1.0.1 的别名）  | 

在这种情况下，当 npm 客户端从存储库 `R` 获取 `web-helper` 程序包的标签时，它会同时收到*最新*标签和 *alpha* 标签。标签指向的版本不会改变。

如果上游和本地存储库中的同一个软件包上都存在相同的标签，则 CodeCatalyst 使用上*次更新的*标签。例如，假设 *webhelper* 上的标签已修改为如下所示。


****  

| Repository | 程序包名称 | 程序包标签 | 上次更新时间 | 
| --- | --- | --- | --- | 
|  R  |  `web-helper`  |   *最新*（版本 1.0.0 的别名）  |  2023 年 1 月 1 日  | 
|  U  |  `web-helper`  |   *最新*（版本 1.0.1 的别名）  |  2023 年 6 月 1 日  | 

在这种情况下，当 npm 客户端从存储库 `R` 提取程序包 *web-helper* 的标签时，*最新*标签将作为版本 *1.0.1* 的别名，因为它上次已进行更新。这样就可以运行 `npm update`，在上游存储库中更轻松地使用尚不存在于本地存储库中的新程序包版本。

# 使用 Maven
<a name="packages-maven"></a>

许多不同的语言（包括 Java、Kotlin、Scala 和 Clojure）都使用 Maven 存储库格式。许多不同的构建工具（包括 Maven、Gradle、Scala SBT、Apache Ivy 和 Leiningen）都支持 CodeCatalyst。

我们已经测试并确认了与以下版本 CodeCatalyst 的兼容性：
+ 最新的 **Maven** 版本：3.6.3。
+ 最新的 **Gradle** 版本：6.4.1。我们还测试了 5.5.1 版本。

**Topics**
+ [配置并使用 Gradle Groovy](packages-maven-gradle.md)
+ [配置并使用 mvn](packages-maven-mvn.md)
+ [使用 curl 发布程序包](packages-maven-curl.md)
+ [使用 Maven 校验和与快照](packages-maven-checksums-snapshots.md)

# 配置并使用 Gradle Groovy
<a name="packages-maven-gradle"></a>

要将 Gradle Groovy 与配合使用 CodeCatalyst，您必须将 Gradle Groovy 连接到您的软件包存储库，并提供用于身份验证的个人访问令牌 (PAT)。你可以在控制台中查看将 Gradle Groovy 连接到软件包存储库的说明。 CodeCatalyst 

**Contents**
+ [从中获取依赖关系 CodeCatalyst](#gradle-fetch-dependencies)
+ [从中获取插件 CodeCatalyst](#gradle-fetch-plugins)
+ [通过以下方式从外部软件包存储库获取软件包 CodeCatalyst](#gradle-install-public)
+ [将包发布到 CodeCatalyst](#gradle-publish-packages)
+ [在 IntelliJ IDEA 中运行 Gradle 构建](#gradle-intellij)
  + [方法 1：将 PAT 放入 `gradle.properties`](#gradle-intellij-gradle-properties)
  + [方法 2：将 PAT 放入单独的文件中](#gradle-intellij-file)

## 从中获取依赖关系 CodeCatalyst
<a name="gradle-fetch-dependencies"></a>

以下说明说明了如何配置 Gradle Groovy 以获取软件包存储 CodeCatalyst 库的依赖项。

**使用 Gradle Groovy 从软件包存储库中获取依赖项 CodeCatalyst**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 导航到您的项目。

1. 在导航窗格中，选择**程序包**。

1. 从程序包存储库列表中，选择您的程序包存储库。

1. 选择**连接到存储库**。

1. 在**连接到存储库**对话框中，从程序包管理器客户端列表中选择 **Gradle Groovy**。

1. 你需要一个个人访问令牌 (PAT) 来对 Gradle Groovy 进行身份验证。 CodeCatalyst如果您已有一个 PAT，则可以使用它。如果没有 PAT，您可以在此处创建一个。

   1. 选择**创建令牌**。

   1. 选择**复制**以复制您的 PAT。
**警告**  
关闭此对话框后，您将无法再次查看或复制您的 PAT。

1. 使用您的访问凭证更新您的 gradle 属性文件。*username*替换为您的 CodeCatalyst 用户名，然后*PAT*用您的 CodeCatalyst 个人访问令牌替换。只要在以下步骤中使用相同的值，就可以为*spaceUsername*和*spacePassword*使用任何值。

   ```
   spaceUsername=username
   spacePassword=PAT
   ```

1. 要从 Gradle 版本 CodeCatalyst 中获取依赖关系，请复制`maven`代码片段并将其添加到项目文件的相应`repositories`部分。`build.gradle`替换以下值。*spaceName*只要在以下步骤中使用相同的值，就可以使用任何值。
**注意**  
如果通过控制台指令进行复制，则以下值将进行更新且不应更改。
   + *space\$1name*替换为您的 CodeCatalyst空间名称。
   + *proj\$1name*用您的 CodeCatalyst项目名称替换。
   + *repo\$1name*替换为你的 CodeCatalyst软件包存储库名称。

   ```
   maven {
     name = 'spaceName'
     url = uri('https://packages.region.codecatalyst.aws/maven/space_name/proj_name/repo_name/')
     credentials(PasswordCredentials)
   }
   ```

1. （可选）要将 CodeCatalyst 包存储库用作项目依赖关系的唯一来源，请从`build.gradle`文件中删除存储库中的任何其他部分。如果您有多个存储库，Gradle 会按照列出的顺序在每个存储库中搜索依赖项。

## 从中获取插件 CodeCatalyst
<a name="gradle-fetch-plugins"></a>

默认情况下，Gradle 会解析来自公有 [Gradle 插件门户](https://plugins.gradle.org/)的插件。以下步骤将您的 Gradle 项目配置为解析 CodeCatalyst 软件包存储库中的插件。

**使用 Gradle 从 CodeCatalyst 软件包存储库中获取插件**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 导航到您的项目。

1. 在导航窗格中，选择**程序包**。

1. 从程序包存储库列表中，选择您的程序包存储库。

1. 选择**连接到存储库**。

1. 在**连接到存储库**对话框中，从程序包管理器客户端列表中选择 **Gradle**。

1. 您需要使用个人访问令牌 (PAT) 来对 Gradle 进行 CodeCatalyst身份验证。如果您已有一个 PAT，则可以使用它。如果没有 PAT，您可以在此处创建一个。

   1. 选择**创建令牌**。

   1. 选择**复制**以复制您的 PAT。
**警告**  
关闭此对话框后，您将无法再次查看或复制您的 PAT。

1. 使用您的访问凭证更新您的 gradle 属性文件。*username*替换为您的 CodeCatalyst 用户名，然后*PAT*用您的 CodeCatalyst 个人访问令牌替换。只要在以下步骤中使用相同的值，就可以为*spaceUsername*和*spacePassword*使用任何值。

   ```
   spaceUsername=username
   spacePassword=PAT
   ```

1. 在 `settings.gradle` 文件中添加一个 `pluginManagement` 块。`pluginManagement` 块必须出现在 `settings.gradle` 中的任何其他语句之前。替换以下值。
**注意**  
如果通过控制台指令进行复制，则以下值将进行更新且不应更改。
   + *spaceName*替换为上一步中使用的名称值。
   + *space\$1name*替换为您的 CodeCatalyst空间名称。
   + *proj\$1name*用您的 CodeCatalyst项目名称替换。
   + *repo\$1name*替换为你的 CodeCatalyst软件包存储库名称。

   ```
   pluginManagement {
       repositories {
           maven {
               name = 'spaceName'
               url = uri('https://packages.region.codecatalyst.aws/maven/space_name/proj_name/repo_name/')
               credentials(PasswordCredentials)
           }
       }
   }
   ```

   这将确保 Gradle 会解析来自指定存储库的插件。存储库必须已配置与 Gradle 插件门户（`gradle-plugins-store`）的上游连接，以便构建可以使用通常所需的 Gradle 插件。有关更多信息，请参阅 [Gradle 文档](https://docs.gradle.org/current/userguide/plugins.html#sec:custom_plugin_repositories)。

## 通过以下方式从外部软件包存储库获取软件包 CodeCatalyst
<a name="gradle-install-public"></a>

您可以通过存储库从公共存储库安装 Maven 软件包，方法是将其配置为与代表网关存储库的网关的上游连接。 CodeCatalyst从网关存储库安装的软件包会被提取并存储在您的存储 CodeCatalyst库中。

CodeCatalyst 支持以下公共 Maven 软件包存储库。
+ maven-central-gateway
+ google-android-gateway
+ gradle-plugins-gateway
+ commonsware-gateway

**从公共 Maven 程序包存储库安装程序包**

1. 如果您还没有，请按照[从中获取依赖关系 CodeCatalyst](#gradle-fetch-dependencies)或[从中获取插件 CodeCatalyst](#gradle-fetch-plugins)中的步骤使用您的 CodeCatalyst 软件包存储库配置 Gradle。

1. 确保您的存储库已将要从中安装的网关存储库添加为上游连接。为此，您可以按照[添加上游存储库](packages-upstream-repositories-add.md)中的说明操作，并选择要作为上游添加的公共程序包存储库。

有关从上游存储库请求程序包的更多信息，请参阅[请求包含上游存储库的程序包版本](packages-upstream-repositories-request.md)。

## 将包发布到 CodeCatalyst
<a name="gradle-publish-packages"></a>

本节介绍如何将使用 Gradle Groovy 构建的 Java 库发布到存储库。 CodeCatalyst

**使用 Gradle Groovy 将软件包发布到软件包存储库 CodeCatalyst**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 在项目的概述页面上，选择**程序包**。

1. 从程序包存储库列表中，选择您的程序包存储库。

1. 选择**连接到存储库**。

1. 在**连接到存储库**对话框中，从程序包管理器客户端列表中选择 **Gradle Groovy**。

1. 您需要使用个人访问令牌 (PAT) 来对 Gradle 进行 CodeCatalyst身份验证。如果您已有一个 PAT，则可以使用它。如果没有 PAT，您可以在此处创建一个。

   1. 选择**创建令牌**。

   1. 选择**复制**以复制您的 PAT。
**警告**  
关闭此对话框后，您将无法再次查看或复制您的 PAT。

1. 使用您的访问凭证更新您的 gradle 属性文件。*username*替换为您的 CodeCatalyst 用户名，然后*PAT*用您的 CodeCatalyst 个人访问令牌替换。只要在以下步骤中使用相同的值，就可以为*spaceUsername*和*spacePassword*使用任何值。

   ```
   spaceUsername=username
   spacePassword=PAT
   ```

1. 将 `maven-publish` 插件添加到项目的 `build.gradle` 文件的 `plugins` 部分。

   ```
   plugins {
       id 'java-library'
       id 'maven-publish'
   }
   ```

1. 接下来，在项目 `build.gradle` 文件中添加一个 `publishing` 部分。替换以下值。
**注意**  
如果通过控制台指令进行复制，则以下值将进行更新且不应更改。
   + *space\$1name*替换为您的 CodeCatalyst空间名称。
   + *proj\$1name*用您的 CodeCatalyst项目名称替换。
   + *repo\$1name*替换为你的 CodeCatalyst软件包存储库名称。

   ```
   publishing {
       publications {
           mavenJava(MavenPublication) {
               groupId = 'group-id'
               artifactId = 'artifact-id'
               version = 'version'
               from components.java
           }
       }
       repositories {
           maven {
               name = 'spaceName'
               url = uri('https://packages.region.codecatalyst.aws/maven/space_name/proj_name/repo_name/')
               credentials(PasswordCredentials)
           }
       }
   }
   ```

   `maven-publish` 插件根据 `publishing` 部分中指定的 `groupId`、`artifactId` 和 `version` 生成 POM 文件。

1. 对 `build.gradle` 作出的这些更改完成后，运行以下命令来构建项目并将其上传到存储库。

   ```
   ./gradlew publish
   ```

1. 在 CodeCatalyst 控制台中导航到您的软件包存储库，以检查软件包是否已成功发布。您应在程序包存储库的**程序包**列表中看到该程序包。

有关更多信息，请参阅 Gradle 网站上的以下主题：
+  [构建 Java 库](https://guides.gradle.org/building-java-libraries/) 
+  [将项目作为模块发布](https://docs.gradle.org/current/userguide/publishing_setup.html) 

## 在 IntelliJ IDEA 中运行 Gradle 构建
<a name="gradle-intellij"></a>

你可以在 IntelliJ IDEA 中运行 Gradle 构建，从中提取依赖关系。 CodeCatalyst要对 Gradle 进行身份验证 CodeCatalyst，必须使用个人访问令牌 (PAT)。您可以将 CodeCatalyst PAT 存储在自己选择的单独文件中`gradle.properties`或单独存储。

### 方法 1：将 PAT 放入 `gradle.properties`
<a name="gradle-intellij-gradle-properties"></a>

如果您未使用 `gradle.properties` 文件并且能够用 PAT 覆盖其内容，请使用此方法。如果您使用 `gradle.properties`，则可以修改此方法以添加 PAT，而不是覆盖文件内容。

**注意**  
该示例显示了位于 `GRADLE_USER_HOME` 中的 `gradle.properties` 文件。

首先，创建一个 PAT（如果您没有 PAT）。

**创建个人访问令牌（PAT）**

1. 在顶部菜单栏中，选择您的个人资料徽章，然后选择**我的设置**。
**提示**  
您还可以通过转到项目或空间的成员页面，然后从成员列表中选择您的姓名，找到您的用户个人资料。

1. 在 **PAT 名称**中，为您的 PAT 输入描述性名称。

1. 在**到期日期**中，保留默认日期，或者选择日历图标以自定义日期。到期日期默认为从当前日期起一年后。

1. 选择**创建**。

   当为源存储库选择**克隆存储库**时，也可以创建此令牌。

1. 将 PAT 密钥保存在安全位置。
**重要**  
PAT 密钥仅显示一次。关闭窗口后将无法再检索该密钥。

接下来，使用以下代码段来更新 `build.gradle` 文件：

```
repositories {
    maven {
        name = 'spaceName'
        url = uri('https://packages.region.codecatalyst.aws/maven/space_name/proj_name/repo_name/')
        credentials(PasswordCredentials)
    }
}
```

### 方法 2：将 PAT 放入单独的文件中
<a name="gradle-intellij-file"></a>

如果您不想修改 `gradle.properties` 文件，请使用此方法。

首先，创建一个 PAT（如果您没有 PAT）。

**创建个人访问令牌（PAT）**

1. 在顶部菜单栏中，选择您的个人资料徽章，然后选择**我的设置**。
**提示**  
您还可以通过转到项目或空间的成员页面，然后从成员列表中选择您的姓名，找到您的用户个人资料。

1. 在 **PAT 名称**中，为您的 PAT 输入描述性名称。

1. 在**到期日期**中，保留默认日期，或者选择日历图标以自定义日期。到期日期默认为从当前日期起一年后。

1. 选择**创建**。

   当为源存储库选择**克隆存储库**时，也可以创建此令牌。

1. 将 PAT 密钥保存在安全位置。
**重要**  
PAT 密钥仅显示一次。关闭窗口后将无法再检索该密钥。

**将 PAT 放在单独的文件中**

1. 使用以下代码段来更新 `build.gradle` 文件。将*space\$1name**proj\$1name*、和*repo\$1name*，替换为您的 CodeCatalyst 用户名、空间名称、项目名称和软件包存储库名称。

   ```
   def props = new Properties()
   file("fileName").withInputStream { props.load(it) }
                     
   repositories {
           maven {
               name = 'spaceName'
               url = uri('https://packages.region.codecatalyst.aws/maven/space_name/proj_name/repo_name/')
               credentials(PasswordCredentials)
           }
       }
   }
   ```

1. 将 PAT 写入在 `build.gradle` 文件中指定的文件：

   ```
   echo "codecatalystArtifactsToken=PAT" > fileName
   ```

# 配置并使用 mvn
<a name="packages-maven-mvn"></a>

您可以使用 `mvn` 命令来运行 Maven 构建。您必须将 `mvn` 配置为使用程序包存储库，并提供用于身份验证的个人访问令牌（PAT）。

**Contents**
+ [从中获取依赖关系 CodeCatalyst](#mvn-fetch-dependencies)
+ [通过以下方式从外部软件包存储库获取软件包 CodeCatalyst](#mvn-install-public)
+ [将包发布到 CodeCatalyst](#mvn-publish-packages)
+ [发布第三方程序包](#publishing-third-party-packages)

## 从中获取依赖关系 CodeCatalyst
<a name="mvn-fetch-dependencies"></a>

`mvn`要配置为从 CodeCatalyst 存储库获取依赖项，必须编辑 Maven 配置文件`settings.xml`，也可以编辑项目的项目模型对象 (POM) 文件。POM 文件包含有关项目的信息以及 Maven 构建项目所需的配置信息，例如依赖项、构建目录、源目录、测试源目录、插件和目标。

**用于`mvn`从 CodeCatalyst 软件包存储库中获取依赖项**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 在项目的概述页面上，选择**程序包**。

1. 从程序包存储库列表中，选择您的程序包存储库。

1. 选择**连接到存储库**。

1. 在**连接到存储库**对话框中，从程序包管理器客户端列表中选择 **mvn**。

1. 您需要使用个人访问令牌 (PAT) `mvn` 进行身份验证 CodeCatalyst。如果您已有一个 PAT，则可以使用它。如果没有 PAT，您可以在此处创建一个。

   1. 选择**创建令牌**。

   1. 选择**复制**以复制您的 PAT。
**警告**  
关闭此对话框后，您将无法再次查看或复制您的 PAT。

1. 将包含存储库的配置文件添加到 `settings.xml` 文件。替换以下值。
**注意**  
如果通过控制台指令进行复制，则以下值将进行更新且不应更改。
   + *space\$1name*替换为您的 CodeCatalyst空间名称。
   + *proj\$1name*用您的 CodeCatalyst项目名称替换。
   + *repo\$1name*替换为你的 CodeCatalyst软件包存储库名称。

   ```
   <profiles>
     <profile>
       <id>repo_name</id>
       <activation>
           <activeByDefault>true</activeByDefault>
       </activation>
       <repositories>
           <repository>
             <id>repo_name</id>
             <url>https://packages.region.codecatalyst.aws/maven/space_name/proj_name/repo_name/</url>
           </repository>
       </repositories>
     </profile>
   </profiles>
   ```

1. 将服务器添加到 `settings.xml` 文件中的服务器列表。替换以下值。
**注意**  
如果通过控制台指令进行复制，则以下值将进行更新且不应更改。
   + *repo\$1name*替换为你的 CodeCatalyst软件包存储库名称。
   + *username*用您的 CodeCatalyst 用户名替换。
   + *PAT*用您的 CodeCatalyst PAT 替换。

   ```
   <servers>
     <server>
       <id>repo_name</id>
       <username>username</username>
       <password>PAT</password>
     </server>
   </servers>
   ```

1. （可选）在 `settings.xml` 文件中设置镜像，以捕获所有连接并将它们路由到您的存储库，而不是网关存储库。
**注意**  
如果通过控制台指令进行复制，则以下值将进行更新且不应更改。
   + *space\$1name*替换为您的 CodeCatalyst空间名称。
   + *proj\$1name*用您的 CodeCatalyst项目名称替换。
   + *repo\$1name*替换为你的 CodeCatalyst软件包存储库名称。

   ```
   <mirrors>
     <mirror>
       <id>repo_name</id>
       <name>repo_name</name>
       <url>https://packages.region.codecatalyst.aws/maven/space_name/proj_name/repo_name/</url>
       <mirrorOf>*</mirrorOf>
     </mirror>
   </mirrors>
   ```

**重要**  
可以在 `<id>` 元素中使用任何值，但必须与 `<server>` 和 `<repository>` 元素中的值相同。这样，就可以将指定的凭据包含在对的请求中 CodeCatalyst。

更改这些配置后，就可以构建项目了。

```
mvn compile
```

## 通过以下方式从外部软件包存储库获取软件包 CodeCatalyst
<a name="mvn-install-public"></a>

您可以通过存储库从公共存储库安装 Maven 软件包，方法是将其配置为与代表网关存储库的网关的上游连接。 CodeCatalyst从网关存储库安装的软件包会被提取并存储在您的存储 CodeCatalyst库中。

目前， CodeCatalyst 支持以下公共 Maven 软件包存储库。
+ maven-central-gateway
+ google-android-gateway
+ gradle-plugins-gateway
+ commonsware-gateway

**从公共 Maven 程序包存储库安装程序包**

1. 如果您还没有，请`mvn`按照中的步骤使用您的 CodeCatalyst软件包存储库进行配置[从中获取依赖关系 CodeCatalyst](#mvn-fetch-dependencies)。

1. 确保您的存储库已将要从中安装的网关存储库添加为上游连接。要查看添加了哪些上游源或要将网关存储库添加为上游源，请按照[添加上游存储库](packages-upstream-repositories-add.md)中的说明操作。

有关从上游存储库请求程序包的更多信息，请参阅[请求包含上游存储库的程序包版本](packages-upstream-repositories-request.md)。

## 将包发布到 CodeCatalyst
<a name="mvn-publish-packages"></a>

要将 Maven 包发布`mvn`到 CodeCatalyst 存储库，还必须编辑`~/.m2/settings.xml`和项目 POM。

**用于将包发布`mvn`到您的软件 CodeCatalyst 包存储库**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 在项目的概述页面上，选择**程序包**。

1. 从程序包存储库列表中，选择您的程序包存储库。

1. 选择**连接到存储库**。

1. 在**连接到存储库**对话框中，从程序包管理器客户端列表中选择 **mvn**。

1. 您需要使用个人访问令牌 (PAT) `mvn` 进行身份验证 CodeCatalyst。如果您已有一个 PAT，则可以使用它。如果没有 PAT，您可以在此处创建一个。

   1. 选择**创建令牌**。

   1. 选择**复制**以复制您的 PAT。
**警告**  
关闭此对话框后，您将无法再次查看或复制您的 PAT。

1. 在本地机器上使用 PAT 配置环境变量。您将在 `setting.xml` 文件中使用此环境变量。

   ```
   export CODECATALYST_ARTIFACTS_TOKEN=your_PAT
   ```

1. 在 `settings.xml` 中添加一个引用 `CodeCatalyst_ARTIFACTS_TOKEN` 环境变量的 `<servers>` 部分，以便 Maven 可在 HTTP 请求中传递令牌。

   ```
   <settings>
   ...
       <servers>
           <server>
               <id>repo-name</id>
               <username>username</username>
               <password>${env.CodeCatalyst_ARTIFACTS_TOKEN}</password>
           </server>
       </servers>
   ...
   </settings>
   ```

1. 将 `<distributionManagement>` 部分添加到项目的 `pom.xml`。

   ```
   <project>
   ...
        <distributionManagement>
            <repository>
                <id>repo_name</id>
                <name>repo_name</name>
                <url>https://packages.region.codecatalyst.aws/maven/space_name/proj_name/repo_name/</url>
            </repository>
        </distributionManagement>
   ...
   </project>
   ```

更改这些配置后，就可以开始构建项目并将项目发布到指定的存储库。

```
mvn deploy
```

您可以在 CodeCatalyst 控制台中导航到您的软件包存储库，以检查软件包是否已成功发布。

## 发布第三方程序包
<a name="publishing-third-party-packages"></a>

您可以使用将第三方 Maven 包发布到 CodeCatalyst 存储库。`mvn deploy:deploy-file`这对于想要发布程序包且只有 JAR 文件且无权访问程序包源代码或 POM 文件的用户很有用。

`mvn deploy:deploy-file` 命令会根据命令行中传递的信息生成 POM 文件。

首先，创建一个 PAT（如果您没有 PAT）。

**创建个人访问令牌（PAT）**

1. 在顶部菜单栏中，选择您的个人资料徽章，然后选择**我的设置**。
**提示**  
您还可以通过转到项目或空间的成员页面，然后从成员列表中选择您的姓名，找到您的用户个人资料。

1. 在 **PAT 名称**中，为您的 PAT 输入描述性名称。

1. 在**到期日期**中，保留默认日期，或者选择日历图标以自定义日期。到期日期默认为从当前日期起一年后。

1. 选择**创建**。

   当为源存储库选择**克隆存储库**时，也可以创建此令牌。

1. 将 PAT 密钥保存在安全位置。
**重要**  
PAT 密钥仅显示一次。关闭窗口后将无法再检索该密钥。

**发布第三方 Maven 程序包**

1. 创建 `~/.m2/settings.xml` 文件并输入以下内容：

   ```
   <settings>
       <servers>
           <server>
               <id>repo_name</id>
               <username>username</username>
               <password>PAT}</password>
           </server>
       </servers>
   </settings>
   ```

1. 运行 `mvn deploy:deploy-file` 命令：

   ```
   mvn deploy:deploy-file -DgroupId=commons-cli          \
   -DartifactId=commons-cli       \
   -Dversion=1.4                  \
   -Dfile=./commons-cli-1.4.jar   \
   -Dpackaging=jar                \
   -DrepositoryId=repo-name      \
   -Durl=https://packages.region.codecatalyst.aws/maven/space-name/proj-name/repo-name/
   ```
**注意**  
前面的示例发布 `commons-cli 1.4`。修改 groupID、artifactID、version 和 file 参数来发布另一个 JAR。

这些说明基于 *Apache Maven* 文档中关于[ JARs 将第三方部署到远程存储库的指南](https://maven.apache.org/guides/mini/guide-3rd-party-jars-remote.html)中的示例。

 有关更多信息，请参阅 Apache Maven Project 网站上的以下主题：
+  [设置多个存储库](https://maven.apache.org/guides/mini/guide-multiple-repositories.html) 
+  [设置参考](https://maven.apache.org/settings.html) 
+  [分配管理](https://maven.apache.org/pom.html#Distribution_Management) 
+  [配置文件](https://maven.apache.org/pom.html#Profiles) 

# 使用 curl 发布程序包
<a name="packages-maven-curl"></a>

本节介绍如何使用 HTTP 客户端将 Maven 软件包发布`curl`到软件 CodeCatalyst 包存储库。如果您的环境中没有 Maven 客户端或想要安装 Maven 客户端，则使用 `curl` 发布程序包会很有用。

**使用 `curl` 发布 Maven 程序包**

1. 您必须将个人访问令牌 (PAT) 存储到环境变量中才能`curl`进行身份验证 CodeCatalyst。如果您已有一个 PAT，则可以使用它。如果没有 PAT，则可以创建一个 PAT 并配置环境变量。

   1. 请按照[使用个人访问令牌向用户授予对存储库的访问权限](ipa-tokens-keys.md)中的步骤操作来创建 PAT。复制 PAT 以将其存储在环境变量中。

   1. 在本地机器的命令行上，使用 PAT 配置环境变量。

      ```
      export CodeCatalyst_ARTIFACTS_TOKEN=your_PAT
      ```

1. 使用以下`curl`命令将 JAR 发布到 CodeCatalyst存储库。将*username*、*space\$1name**proj\$1name*、和*repo\$1name*，替换为您的 CodeCatalyst 用户名、空间名称、项目名称和软件包存储库名称。

   ```
   curl --request PUT https://packages.region.codecatalyst.aws/maven/space-name/proj-name/repo-name/com/mycompany/app/my-app/1.0/my-app-1.0.jar \
        --user "username:CodeCatalyst_ARTIFACTS_TOKEN" --header "Content-Type: application/octet-stream" \
        --data-binary @target/path/to/my-app-1.0.jar
   ```

1. 使用以下`curl`命令将 POM 发布到 CodeCatalyst存储库。将*username*、*space\$1name**proj\$1name*、和*repo\$1name*，替换为您的 CodeCatalyst 用户名、空间名称、项目名称和软件包存储库名称。

   ```
   curl --request PUT https://packages.region.codecatalyst.aws/maven/space-name/proj-name/repo-name/com/mycompany/app/my-app/1.0/my-app-1.0.pom \
        --user "username:CodeCatalyst_ARTIFACTS_TOKEN" --header "Content-Type: application/octet-stream" \
        --data-binary @target/my-app-1.0.pom
   ```

1. 此时，Maven 软件包将在您的 CodeCatalyst 存储库中，状态为。`Unfinished`为了能够使用程序包，程序包必须处于 `Published` 状态。您可以`Published`通过将`maven-metadata.xml`文件上传`Unfinished`到您的包中或在 CodeCatalyst 控制台中更改状态来将包从移动到。

   1.  选项 1：使用以下 `curl` 命令将 `maven-metadata.xml` 文件添加到您的程序包中。将*username*、*space\$1name**proj\$1name*、和*repo\$1name*，替换为您的 CodeCatalyst 用户名、空间名称、项目名称和软件包存储库名称。

      ```
      curl --request PUT https://packages.region.codecatalyst.aws/maven/space-name/proj-name/repo-name/com/mycompany/app/my-app/maven-metadata.xml \
           --user "username:CodeCatalyst_ARTIFACTS_TOKEN" --header "Content-Type: application/octet-stream" \
           --data-binary @target/maven-metadata.xml
      ```

      以下是 `maven-metadata.xml` 文件的内容示例：

      ```
      <metadata modelVersion="1.1.0">
          <groupId>com.mycompany.app</groupId>
          <artifactId>my-app</artifactId>
          <versioning>
              <latest>1.0</latest>
              <release>1.0</release>
              <versions>
                  <version>1.0</version>
              </versions>
              <lastUpdated>20200731090423</lastUpdated>
          </versioning>
      </metadata>
      ```

   1.  选项 2：在 CodeCatalyst 控制台`Published`中将包裹状态更新为。有关如何更新程序包版本的状态的信息，请参阅[更新程序包版本的状态](working-with-packages-update-version-status.md)。

如果您只有包的 JAR 文件，则可以使用将消耗包版本发布到 CodeCatalyst 存储库。`mvn`如果您无法访问程序包的源代码或 POM，此方法会很有用。有关详细信息，请参阅[发布第三方程序包](packages-maven-mvn.md#publishing-third-party-packages)。

# 使用 Maven 校验和与快照
<a name="packages-maven-checksums-snapshots"></a>

以下各节介绍如何在中使用 Maven 校验和和 Maven 快照。 CodeCatalyst

## 使用 Maven 校验和
<a name="maven-checksums"></a>

 将 Maven 包发布到 CodeCatalyst 包存储库时，将使用与包中每个*资产*或文件关联的校验和来验证上传。资产的例子包括 *jar*、*pom* 和 *war* 文件。对于每个资产，Maven 程序包都包含多个校验和文件，这些文件使用带有附加扩展名（例如 `md5` 或 `sha1`）的资产名称。例如，名为 `my-maven-package.jar` 的文件的校验和文件可能是 `my-maven-package.jar.md5` 和 `my-maven-package.jar.sha1`。

 每个 Maven 程序包还包含一个 `maven-metadata.xml` 文件。必须上传此文件才能成功发布。如果在上传任何程序包文件期间检测到校验和不匹配，则发布将停止。这可能会阻止上传 `maven-metadata.xml`。在发生此情况时，Maven 程序包的状态将设置为 `Unfinished`。您无法下载具有此状态的程序包中的资产。

如果在发布 Maven 程序包时出现校验和不匹配的情况，请记住以下几点：
+  如果在上传 `maven-metadata.xml` 之前出现校验和不匹配的情况，则程序包的状态不会设置为 `Unfinished`。程序包不可见，也无法使用其资产。在发生此情况时，请尝试以下方法之一，然后尝试再次下载资产。
  + 再次运行发布 Maven 程序包的命令。如果因网络问题导致校验和文件在下载期间损坏，此方法可能会起作用。如果已解决网络问题以进行重试，则校验和匹配且下载成功。
  +  如果重新发布 Maven 程序包不起作用，请删除该程序包，然后重新发布它。
+  如果在上传 `maven-metadata.xml` 之后出现校验和不匹配的情况，则程序包的状态会设置为 `Published`。您可以使用程序包中的任何资产，包括校验和不匹配的资产。下载资源时，生成的校验和会随 CodeCatalyst 之下载。如果下载的文件与校验和不匹配关联，则其下载的校验和文件可能与发布程序包时上传的校验和不匹配。

## 使用 Maven 快照
<a name="maven-snapshots"></a>

 Maven *快照*是 Maven 程序包的特殊版本，该版本引用了最新的生产分支代码。它是先于最终发布版本的开发版本。您可以通过附加到程序包版本的后缀 `SNAPSHOT` 来识别 Maven 程序包的快照版本。例如，版本 `1.1` 的快照是 `1.1-SNAPSHOT`。有关更多信息，请参阅 Apache Maven Project 网站上的 [What is a SNAPSHOT version?](https://maven.apache.org/guides/getting-started/index.html#What_is_a_SNAPSHOT_version)。

 CodeCatalyst 支持发布和使用 Maven 快照。您可以将 Maven 快照发布到 CodeCatalyst 存储库，或者（如果您直接连接）发布到上游存储库。但是，不支持程序包存储库及其某个上游存储库中的快照版本。例如，如果您将带有版本的 Maven 包上传`1.2-SNAPSHOT`到包存储库，则 CodeCatalyst 不支持将具有相同快照版本的 Maven 包上传到其上游存储库之一。在此场景中，可能会返回不可预测的结果。

 在发布 Maven 快照时，其先前版本将保留在名为*构建*的新版本中。每次发布 Maven 快照时，都会创建一个新的构建版本。快照的所有先前版本都保留在其构建版本中。发布 Maven 快照时，其状态将设置为 `Published`，包含先前版本的构建的状态设置为 `Unlisted`。

 如果您请求快照，则会返回状态为 `Published` 的版本。这始终是 Maven 快照的最新版本。您也可以请求快照的特定构建。

要删除 Maven 快照的所有构建版本，请使用 CodeCatalyst 控制台。

# 使用 NuGet
<a name="packages-nuget"></a>

这些主题描述了如何使用和发布`NuGet`软件包 CodeCatalyst。

**注意**  
CodeCatalyst 支持 [4.8 及更高NuGet版本](https://docs.microsoft.com/en-us/nuget/release-notes/nuget-4.8-rtm)。

**Topics**
+ [CodeCatalyst 与视觉工作室一起使用](packages-nuget-visual-studio.md)
+ [配置并使用 nuget 或 dotnet CLI](packages-nuget-cli.md)
+ [NuGet 软件包名称、版本和资产名称标准化](nuget-name-normalization.md)
+ [NuGet 兼容性](packages-nuget-compatibility.md)

# CodeCatalyst 与视觉工作室一起使用
<a name="packages-nuget-visual-studio"></a>

 您可以 CodeCatalyst 直接在 Visual Studio 中使用软件包。

要配置和 NuGet 使用`dotnet`或等 CLI 工具`nuget`，请参阅[配置并使用 nuget 或 dotnet CLI](packages-nuget-cli.md)。

**Contents**
+ [使用 CodeCatalyst](#packages-nuget-vs-configure)
  + [Windows](#packages-nuget-vs-configure-windows)
  + [macOS](#packages-nuget-vs-configure-mac)

## 使用 CodeCatalyst
<a name="packages-nuget-vs-configure"></a>

### Windows
<a name="packages-nuget-vs-configure-windows"></a>

**使用 Visual Studio 配置 CodeCatalyst**

1. 需要使用个人访问令牌 (PAT) 进行身份验证 CodeCatalyst。如果您已有一个 PAT，则可以使用它。如果没有 PAT，请按照[使用个人访问令牌向用户授予对存储库的访问权限](ipa-tokens-keys.md)中的说明创建一个 PAT。

1. 使用 `nuget` 或 `dotnet` 配置程序包存储库和凭证。

------
#### [ dotnet ]

   **Linux 和 MacOS 用户：**由于在非 Windows 平台上不支持加密，因此您必须在以下命令中添加 `--store-password-in-clear-text` 标志。请注意，这会将您的密码以纯文本形式存储在配置文件中。

   ```
   dotnet nuget add source https://packages.region.codecatalyst.aws/nuget/space-name/proj-name/repo-name/v3/index.json --name repo_name --password PAT --username user_name
   ```

------
#### [ nuget ]

   ```
   nuget sources add -name repo_name -Source https://packages.region.codecatalyst.aws/nuget/space-name/proj-name/repo-name/v3/index.json -password PAT --username user_name
   ```

------

   输出示例：

   ```
   Package source with Name: repo_name added successfully.
   ```

1. 将 Visual Studio 配置为使用新的程序包来源。在 Visual Studio 中，选择**工具**，然后选择**选项**。

1. 在 “**选项**” 菜单中，展开 “Package **Man NuGet ager**” 部分，然后选择 Package S **ources**。

1. 在 “**可用包源**” 列表中，确保您的*repo\$1name*源已启用。如果您已将包存储库配置为与 NuGet 图库的上游连接，请禁用 **nuget.org 源代码。**

### macOS
<a name="packages-nuget-vs-configure-mac"></a>

**使用 Visual Studio 配置 CodeCatalyst**

1. 需要使用个人访问令牌 (PAT) 进行身份验证 CodeCatalyst。如果您已有一个 PAT，则可以使用它。如果没有 PAT，请按照[使用个人访问令牌向用户授予对存储库的访问权限](ipa-tokens-keys.md)中的说明创建一个 PAT。

1. 在菜单栏上，选择**首选项**。

1. 在该**NuGet**部分中，选择**来源**。

1. 选择**添加**并添加您的存储库信息。

   1. 在 “**名称**” 中，输入您的 CodeCatalyst 软件包存储库名称。

   1. 在 “**位置**” 中，输入您的 CodeCatalyst 包存储库端点。下面的代码片段显示了示例端点。将*space-name**proj-name*、和*repo-name*，替换为您的 CodeCatalyst 空间名称、项目名称和存储库名称。

      ```
      https://packages.region.codecatalyst.aws/nuget/space-name/proj-name/repo-name/
      ```

   1. 对于**用户名**，输入任何有效值。

   1. 对于**密码**，输入您的 PAT。

1. 选择 **添加源**。

1. 如果您已将包存储库配置为与 NuGet图库的上游连接，请禁用 **nuget.org 源代码。**

配置完成后，Visual Studio 可以使用存储 CodeCatalyst 库、其任何上游存储库或 [NuGet.org](https://www.nuget.org/) 中的软件包（如果您将其配置为上游源）。有关在 Visual Studio 中浏览和安装 NuGet 包的更多信息，请参见*NuGet 文档*中的[使用 Package Manager 在 Visual Studio 中安装和管理 NuGet 软件包](https://docs.microsoft.com/en-us/nuget/consume-packages/install-use-packages-visual-studio)。

# 配置并使用 nuget 或 dotnet CLI
<a name="packages-nuget-cli"></a>

您可以使用`NuGet`和之类的 CLI 工具`dotnet`来发布和使用来自的包 CodeCatalyst。本文档提供有关配置 CLI 工具以及使用这些工具来发布或使用程序包的信息。

**Contents**
+ [使用配置 NuGet CodeCatalyst](#nuget-configure-cli)
+ [使用 CodeCatalyst 存储库中的 NuGet 软件包](#nuget-consume-cli)
+ [使用来自 NuGet .org 的 NuGet 软件包 CodeCatalyst](#nuget-consume-nuget-gallery)
+ [将 NuGet 包发布到 CodeCatalyst](#nuget-publish-cli)

## 使用配置 NuGet CodeCatalyst
<a name="nuget-configure-cli"></a>

要 NuGet 使用进行配置 CodeCatalyst，请在 NuGet 配置文件中添加存储库端点和个人访问令牌，以允许`nuget`或`dotnet`连接到您的 CodeCatalyst 软件包存储库。

**NuGet 使用您的 CodeCatalyst 软件包存储库进行配置**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 在项目的概述页面上，选择**程序包**。

1. 从程序包存储库列表中，选择您的程序包存储库。

1. 选择**连接到存储库**。

1. 在 “**连接到存储库**” 对话框中，从包管理器客户端列表中选择**NuGet**或 **dotnet**。

1. 您需要使用个人访问令牌 (PAT) NuGet 进行身份验证 CodeCatalyst。如果您已有一个 PAT，则可以使用它。如果没有 PAT，您可以在此处创建一个。

   1. 选择**创建令牌**。

   1. 选择**复制**以复制您的 PAT。
**警告**  
关闭此对话框后，您将无法再次查看或复制您的 PAT。

1. 配置`nuget`或`dotnet`以使用存储库的 NuGet 终端节点和 CodeCatalyst PAT。替换以下值。
**注意**  
如果通过控制台指令进行复制，则以下值将进行更新且不应更改。
   + *username*用您的 CodeCatalyst 用户名替换。
   + *PAT*用您的 CodeCatalyst PAT 替换。
   + *space\$1name*替换为您的 CodeCatalyst 空间名称。
   + *proj\$1name*用您的 CodeCatalyst 项目名称替换。
   + *repo\$1name*替换为你的 CodeCatalyst 软件包存储库名称。

   1. 对于 `nuget`，请使用 `nuget sources add` 命令。

      ```
      nuget sources add -name "repo_name" -Source "https://packages.region.codecatalyst.aws/nuget/space_name/proj_name/repo_name/v3/index.json" -username "username" -password "PAT"
      ```

   1. 对于 `dotnet`，请使用 `dotnet nuget add source` 命令。

      **Linux 和 macOS 用户：**由于在非 Windows 平台上不支持加密，因此您必须在以下命令中添加 `--store-password-in-clear-text` 标志。请注意，这会将您的密码以纯文本形式存储在配置文件中。

      ```
      dotnet nuget add source "https://packages.region.codecatalyst.aws/nuget/space_name/proj_name/repo_name/v3/index.json" -n "proj_name/repo_name" -u "username" -p "PAT" --store-password-in-clear-text
      ```

配置 NuGet 完毕后 CodeCatalyst，您可以[使用存储在存储 CodeCatalyst 库或其中一个上游存储库中的软件 NuGet 包](#nuget-consume-cli)，并将[ NuGet 包发布](#nuget-publish-cli)到您的 CodeCatalyst 存储库。

## 使用 CodeCatalyst 存储库中的 NuGet 软件包
<a name="nuget-consume-cli"></a>

[配置 NuGet ](#nuget-configure-cli)完毕后 CodeCatalyst，即可使用存储在存储 CodeCatalyst 库或其上游存储库中的 NuGet 软件包。

要使用 nuget 或 dotnet 使用存储库或其上游存储库中的软件包版本，请运行以下命令。 CodeCatalyst *packageName*替换为要使用的软件包的*packageSourceName*名称以及 NuGet 配置文件中 CodeCatalyst 软件包存储库的源名称，后者应该是存储库名称。

**使用 `dotnet` 安装程序包**

```
dotnet add packageName --source packageSourceName
```

**使用 `nuget` 安装程序包**

```
nuget install packageName --source packageSourceName
```

有关更多信息，请参阅 *Microsoft 文档*中的[使用 nuget CLI 管理程序包](https://docs.microsoft.com/en-us/nuget/consume-packages/install-use-packages-nuget-cli)或[使用 dotnet CLI 安装和管理程序包](https://docs.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli)。

## 使用来自 NuGet .org 的 NuGet 软件包 CodeCatalyst
<a name="nuget-consume-nuget-gallery"></a>

您可以通过 CodeCatalyst 存储库使用 [NuGet.org](https://www.nuget.org/) 中的 NuGet 软件包，方法是将存储库配置为与 **NuGet.** org 的上游连接。从 **NuGet.org** 使用的软件包会被提取并存储在您的 CodeCatalyst 存储库中。

**使用 NuGet .org 中的软件包**

1. 如果还没有，请 NuGet 按照中的步骤使用 CodeCatalyst 软件包存储库配置软件包管理器[使用配置 NuGet CodeCatalyst](#nuget-configure-cli)。

1. 确保您的存储库已将 **NuGet.org** 添加为上游连接。**您可以按照中的[添加上游存储库](packages-upstream-repositories-add.md)说明并选择存储库来检查添加了哪些上游源代码或将 **Nuget.org** 添加为上NuGet 游源。**

## 将 NuGet 包发布到 CodeCatalyst
<a name="nuget-publish-cli"></a>

[配置完毕后 NuGet CodeCatalyst，](#nuget-configure-cli)就可以使用`nuget`或`dotnet`将包版本发布到 CodeCatalyst 存储库。

要将软件包版本推送到 CodeCatalyst 存储库，请运行以下命令，并在 NuGet 配置`.nupkg`文件中包含文件的完整路径和 CodeCatalyst 存储库的源名称。

**使用 `dotnet` 发布程序包**

```
dotnet nuget push path/to/nupkg/SamplePackage.1.0.0.nupkg --source packageSourceName
```

**使用 `nuget` 发布程序包**

```
nuget push path/to/nupkg/SamplePackage.1.0.0.nupkg --source packageSourceName
```

# NuGet 软件包名称、版本和资产名称标准化
<a name="nuget-name-normalization"></a>

CodeCatalyst 在存储软件包和资源名称以及软件包版本之前对其进行标准化，这意味着中的名称或版本 CodeCatalyst 可能与发布软件包或资源时提供的名称或版本不同。

P@@ **ackage 名称 CodeCatalyst 标准化：**通过将所有字母转换为小写来标准化 NuGet 软件包名称。

**Package 版本 CodeCatalyst 标准化：**使用与相同的 NuGet模式对 NuGet 软件包版本进行标准化。以下信息来自 NuGet 文档中的[标准化版本号](https://docs.microsoft.com/en-us/nuget/concepts/package-versioning#normalized-version-numbers)。
+ 从版本号中删除前导零：
  + `1.00` 视为 `1.0`
  + `1.01.1` 视为 `1.1.1`
  + `1.00.0.1` 视为 `1.0.0.1`
+ 版本号第四部分中的零会省略掉：
  + `1.0.0.0` 视为 `1.0.0`
  + `1.0.01.0` 视为 `1.0.1`
+ SemVer 2.0.0 版本元数据已删除：
  + `1.0.7+r3456` 视为 `1.0.7`

P@@ **ackage as CodeCatalyst set 名称标准化：**根据标准化的 NuGet 软件包名称和软件包版本构造软件包资产名称。

# NuGet 兼容性
<a name="packages-nuget-compatibility"></a>

 本指南包含有关与不同 NuGet 工具和版本 CodeCatalyst的兼容性的信息。

**Topics**
+ [一般 NuGet 兼容性](#nuget-version-support)
+ [NuGet 命令行支持](#nuget-command-line-support)

## 一般 NuGet 兼容性
<a name="nuget-version-support"></a>

CodeCatalyst 支持 NuGet 4.8 及更高版本。

CodeCatalyst 仅支持 NuGet HTTP 协议的 V3 版本。这意味着不支持某些依赖协议 V2 版本的 CLI 命令。有关更多信息，请参阅下文的 [nuget 命令支持](#nuget-command-support)部分。

CodeCatalyst 不支持 PowerShellGet 2.x。

## NuGet 命令行支持
<a name="nuget-command-line-support"></a>

CodeCatalyst 支持 NuGet (`nuget`) 和.NET 核心 (`dotnet`) CLI 工具。

### nuget 命令支持
<a name="nuget-command-support"></a>

由于 CodeCatalyst 仅支持 V3 NuGet 的 HTTP 协议，因此以下命令在对 CodeCatalyst 资源使用时将不起作用：
+ `list`：`nuget list` 命令显示来自给定来源的程序包列表。要获取软件包存储库中的软件 CodeCatalyst 包列表，请在 CodeCatalyst 控制台中导航到该存储库。

# 使用 Python
<a name="packages-python"></a>

这些主题描述了如何使用 `pip` Python 包管理器以及 `twine` Python 包发布实用工具 CodeCatalyst。

**Topics**
+ [配置 pip 并安装 Python 程序包](packages-python-pip.md)
+ [配置 Twine 并发布 Python 程序包](packages-python-twine.md)
+ [Python 程序包名称规范化](python-name-normalization.md)
+ [Python 兼容性](packages-python-compatibility.md)

# 配置 pip 并安装 Python 程序包
<a name="packages-python-pip"></a>

要`pip`与一起使用 CodeCatalyst，您必须`pip`连接到软件包存储库并提供用于身份验证的个人访问令牌。您可以在 CodeCatalyst 控制台中查看有关`pip`连接到软件包存储库的说明。在您进行身份验证并`pip`连接到之后 CodeCatalyst，您可以运行`pip`命令。

**Contents**
+ [CodeCatalyst 使用 pip 从中安装 Python 软件包](#pip-install)
+ [从 PyPI 开始使用 Python 软件包 CodeCatalyst](#pip-install-pypi)
+ [pip 命令支持](#pip-command-support)
  + [与存储库进行交互的受支持命令](#supported-pip-commands-that-interact-with-a-repository)
  + [支持的客户端命令](#supported-pip-client-side-commands)

## CodeCatalyst 使用 pip 从中安装 Python 软件包
<a name="pip-install"></a>

以下说明说明了`pip`如何配置为从您的 CodeCatalyst 包存储库或其上游存储库之一安装 Python 包。

**配置并使用`pip`从软件包存储库安装 Python CodeCatalyst 软件包**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 在项目的概述页面上，选择**程序包**。

1. 从程序包存储库列表中，选择您的程序包存储库。

1. 选择**连接到存储库**。

1. 在**连接到存储库**对话框中，从程序包管理器客户端列表中选择 **pip**。

1. 您需要一个个人访问令牌 (PAT) 来对 pip 进行 CodeCatalyst身份验证。如果您已有一个 PAT，则可以使用它。如果没有 PAT，您可以在此处创建一个。

   1. 选择**创建令牌**。

   1. 选择**复制**以复制您的 PAT。
**警告**  
关闭此对话框后，您将无法再次查看或复制您的 PAT。

1. 使用`pip config`命令设置 CodeCatalyst 注册表 URL 和凭据。替换以下值。
**注意**  
如果通过控制台指令进行复制，则以下值将进行更新且不应更改。
   + *username*用您的 CodeCatalyst 用户名替换。
   + *PAT*用您的 CodeCatalyst PAT 替换。
   + *space\$1name*替换为您的 CodeCatalyst 空间名称。
   + *proj\$1name*用您的 CodeCatalyst 项目名称替换。
   + *repo\$1name*替换为你的 CodeCatalyst 软件包存储库名称。

   ```
   pip config set global.index-url https://username:PAT@https://packages.region.codecatalyst.aws/pypi/space_name/proj_name/repo_name/simple/
   ```

1. 假设您的存储库或其中一个上游存储库中存在程序包，则可以使用 `pip install` 来安装。例如，使用以下命令来安装 `requests` 程序包。

   ```
   pip install requests
   ```

   使用该`-i`选项可暂时恢复为从 [https://pypi.org](https://pypi.org) 安装软件包，而不是从软件包存储库安装 CodeCatalyst 软件包。

   ```
   pip install -i https://pypi.org/simple requests
   ```

## 从 PyPI 开始使用 Python 软件包 CodeCatalyst
<a name="pip-install-pypi"></a>

**通过为仓库配置与 PyPI 的上游连接，你可以通过 CodeCatalyst 存储库使用 [Python 包索引 (PyPI)](https://www.pypi.org/) 中的 Python 包。**从 **PyPI** 消耗的包会被摄取并存储在你的仓库中。 CodeCatalyst 

**使用来自 PyPI 的程序包**

1. 如果您还没有，请按照中的步骤在 CodeCatalyst 软件包存储库中[CodeCatalyst 使用 pip 从中安装 Python 软件包](#pip-install)配置 pip。

1. 确保您的存储库已将 **PyPI** 添加为上游来源。您可以按照[添加上游存储库](packages-upstream-repositories-add.md)中的说明操作并选择 **PyPI 存储**存储库来检查添加了哪些上游来源或将 **PyPI** 添加为上游来源。

有关从上游存储库请求程序包的更多信息，请参阅[请求包含上游存储库的程序包版本](packages-upstream-repositories-request.md)。

## pip 命令支持
<a name="pip-command-support"></a>

以下各节总结了 CodeCatalyst 存储库支持的 pip 命令以及不支持的特定命令。

**Topics**
+ [与存储库进行交互的受支持命令](#supported-pip-commands-that-interact-with-a-repository)
+ [支持的客户端命令](#supported-pip-client-side-commands)

### 与存储库进行交互的受支持命令
<a name="supported-pip-commands-that-interact-with-a-repository"></a>

此部分列出了 `pip` 命令，其中 `pip` 客户端向其配置的注册表发出一个或多个请求。这些命令已经过验证，在针对 CodeCatalyst 软件包存储库调用时可以正常运行。


****  

| 命令 | 说明 | 
| --- | --- | 
|   [install](https://pip.pypa.io/en/stable/reference/pip_install/)   |  安装程序包。  | 
|   [download](https://pip.pypa.io/en/stable/reference/pip_download/)   |  下载程序包。  | 

CodeCatalyst 不实现`pip search`。如果您配置`pip`了 CodeCatalyst 包存储库，则运行`pip search`将搜索并显示来自 [PyP](https://pypi.org/) I 的包。

### 支持的客户端命令
<a name="supported-pip-client-side-commands"></a>

这些命令不需要与存储库进行任何直接交互，因此 CodeCatalyst 无需执行任何操作即可支持它们。


****  

| 命令 | 说明 | 
| --- | --- | 
|   [uninstall](https://pip.pypa.io/en/stable/reference/pip_uninstall/)   |  卸载程序包。  | 
|   [freeze](https://pip.pypa.io/en/stable/reference/pip_freeze/)   |  按要求格式输出已安装的程序包。  | 
|   [list](https://pip.pypa.io/en/stable/reference/pip_list/)   |  列出已安装程序包。  | 
|   [show](https://pip.pypa.io/en/stable/reference/pip_show/)   |  显示有关已安装程序包的信息。  | 
|   [check](https://pip.pypa.io/en/stable/reference/pip_check/)   |  验证已安装的程序包是否具有兼容的依赖项。  | 
|   [config](https://pip.pypa.io/en/stable/reference/pip_config/)   |  管理本地和全局配置。  | 
|   [wheel](https://pip.pypa.io/en/stable/reference/pip_wheel/)   |  根据您的要求构建 wheel。  | 
|   [hash](https://pip.pypa.io/en/stable/reference/pip_hash/)   |  计算程序包存档的哈希值。  | 
|   [completion](https://pip.pypa.io/en/stable/user_guide/#command-completion)   |  协助完成命令。  | 
|   [debug](https://pip.pypa.io/en/stable/reference/pip_debug/)   |  显示对调试有用的信息。  | 
|  help  |  显示命令的帮助。  | 

# 配置 Twine 并发布 Python 程序包
<a name="packages-python-twine"></a>

要`twine`与一起使用 CodeCatalyst，您必须`twine`连接到您的包存储库并提供用于身份验证的个人访问令牌。您可以在 CodeCatalyst 控制台中查看有关`twine`连接到软件包存储库的说明。在您进行身份验证并`twine`连接到之后 CodeCatalyst，您可以运行`twine`命令。

## CodeCatalyst 使用 Twine 将软件包发布到
<a name="packages-twine-publish"></a>

以下说明说明了如何进行身份验证并`twine`连接到您的 CodeCatalyst 软件包存储库。

**配置并使用`twine`将包发布到您的软件 CodeCatalyst 包存储库**

1. 打开 CodeCatalyst 控制台，[网址为 https://codecatalyst.aws/](https://codecatalyst.aws/)。

1. 在项目的概述页面上，选择**程序包**。

1. 从程序包存储库列表中，选择您的程序包存储库。

1. 选择**连接到存储库**。

1. 在**连接到存储库**对话框中，从程序包管理器客户端列表中选择 **Twine**。

1. 您将需要一个个人访问令牌 (PAT) 来对 twine 进行 CodeCatalyst身份验证。如果您已有一个 PAT，则可以使用它。如果没有 PAT，您可以在此处创建一个。

   1. 选择**创建令牌**。

   1. 选择**复制**以复制您的 PAT。
**警告**  
关闭此对话框后，您将无法再次查看或复制您的 PAT。

1. 您可以使用 `.pypirc` 文件或环境变量配置 twine。

   1. **使用 `.pypirc` 文件进行配置。**

      在选定编辑器中打开 `~/.pypirc`。

      为其添加索引服务器 CodeCatalyst，包括您在上一步中创建和复制的存储库、用户名和 PAT。替换以下值。
**注意**  
如果通过控制台指令进行复制，则以下值将进行更新且不应更改。
      + *username*用您的 CodeCatalyst 用户名替换。
      + *PAT*用您的 CodeCatalyst PAT 替换。
      + *space\$1name*替换为您的 CodeCatalyst 空间名称。
      + *proj\$1name*用您的 CodeCatalyst 项目名称替换。
      + *repo\$1name*替换为你的 CodeCatalyst 软件包存储库名称。

      ```
      [distutils]
      index-servers = proj-name/repo-name
      
      [proj-name/repo-name]
      repository = https://packages.region.codecatalyst.aws/pypi/space_name/proj_name/repo_name/
      password = PAT
      username = username
      ```

   1. **使用环境变量进行配置。**

      设置以下环境变量。在`TWINE_REPOSITORY_URL`值中，*repo\$1name*使用您的 CodeCatalyst 空间*space\$1name**proj\$1name*、项目和包存储库名称更新、和。

      ```
      export TWINE_USERNAME=username
      ```

      ```
      export TWINE_PASSWORD=PAT
      ```

      ```
      export TWINE_REPOSITORY_URL="https://packages.region.codecatalyst.aws/pypi/space_name/proj_name/repo_name/"
      ```

1. 使用 `twine upload` 命令发布 Python 发行版。

# Python 程序包名称规范化
<a name="python-name-normalization"></a>

CodeCatalyst 在存储软件包名称之前对其进行标准化，这意味着中的软件包名称 CodeCatalyst 可能与发布软件包时提供的名称不同。

对于 Python 程序包，在执行规范化时，程序包名称转为小写，所有 `.`、`-` 和 `_` 字符都替换为单个 `-` 字符。因此，程序包名称 `pigeon_cli` 和 `pigeon.cli` 会规范化并存储为 `pigeon-cli`。pip 和 twine 可以使用未规范化的名称。有关 Python 程序包名称规范化的更多信息，请参阅 Python 文档中的 [PEP 503](https://www.python.org/dev/peps/pep-0503/#normalized-names)。

# Python 兼容性
<a name="packages-python-compatibility"></a>

 虽然 CodeCatalyst 不支持 `/simple/` API，但它确实支持 `Legacy` API 操作。 CodeCatalyst 不支持 PyPI `XML-RPC` 或 `JSON` API 操作。

有关更多信息，请参阅 Python 打包管理机构 GitHub存储库中的以下内容。
+ [Legacy API](https://warehouse.pypa.io/api-reference/legacy.html)
+ [XML-RPC API](https://github.com/pypi/warehouse/blob/main/docs/dev/api-reference/xml-rpc.rst)
+ [JSON API](https://docs.pypi.org/api/json/)

# 程序包配额
<a name="packages-quotas"></a>

下表描述了 Amazon 中包裹的配额和限制 CodeCatalyst。有关 Amazon 配额的更多信息 CodeCatalyst，请参阅[CodeCatalyst 的配额](quotas.md)。


| 资源 | 默认配额 | 
| --- | --- | 
| 程序包存储库 | 每个空间最多 1000 个。 | 
| 直接上游存储库 |  每个程序包存储库最多 10 个。  | 
| 已搜索的上游程序包存储库 |  每个请求的程序包版本最多 25 个已搜索的上游存储库。  | 
| 程序包资产文件大小 |  每个程序包资产最多 5GB。  | 
|  程序包资产  |  每个程序包版本最多 150 个。  | 