程序包概览
程序包 是解析依赖关系和安装软件所需的软件和元数据的捆绑包。在 CodeArtifact 中,程序包由程序包名称、可选的命名空间(例如,@types/node 中的 @types)、一组程序包版本和程序包级元数据(例如 npm 标签)组成。
支持的软件包格式
AWS CodeArtifact 支持 Cargo、通用、Maven、npm、NuGet、PyPI、Ruby 和 Swift 程序包格式。
程序包发布
您可以使用 npm、twine、Maven、Gradle、nuget 和 dotnet 等工具将任何受支持程序包格式的新版本发布到 CodeArtifact 存储库。
发布权限
您的 AWS Identity and Access Management (IAM) 用户或角色必须具有发布到目标存储库的权限。发布程序包需要以下权限:
-
Cargo:
codeartifact:PublishPackageVersion -
通用:
codeartifact:PublishPackageVersion -
Maven:
codeartifact:PublishPackageVersion和codeartifact:PutPackageMetadata -
npm:
codeartifact:PublishPackageVersion -
NuGet:
codeartifact:PublishPackageVersion和codeartifact:ReadFromRepository -
Python:
codeartifact:PublishPackageVersion -
Ruby:
codeartifact:PublishPackageVersion -
Swift:
codeartifact:PublishPackageVersion
在前面的权限列表中,IAM 策略必须为 codeartifact:PublishPackageVersion 和 codeartifact:PutPackageMetadata 权限指定 package 资源。还必须指定 codeartifact:ReadFromRepository 权限的 repository 资源。
有关 CodeArtifact 中的权限的更多信息,请参阅AWS CodeArtifact 权限参考。
覆盖程序包资产
您无法重新发布已存在且包含不同内容的程序包资产。例如,假定您已经发布了一个具有 JAR 资产 mypackage-1.0.jar 的 Maven 程序包。仅当新旧资产的校验和完全相同时,您才能再次发布该资产。要重新发布包含新内容的相同资产,请先使用 delete-package-versions 命令删除该程序包版本。尝试重新发布具有不同内容但名称相同的资产会导致出现 HTTP 409 冲突错误。
对于支持多种资产(通用、PyPI 和 Maven)的程序包格式,您可以向现有程序包版本添加使用不同名称的新资产,前提是您拥有所需的权限。对于通用程序包,只要程序包版本处于 Unfinished 状态,就可以添加新资产。由于 npm 的每个程序包版本仅支持单个资产,因此若要以任何方式修改已发布的程序包版本,都必须先使用 delete-package-versions 删除版本。
如果您尝试重新发布已存在的资产(例如 mypackage-1.0.jar),并且已发布资产和新资产的内容相同,则因为该操作具有幂等性,所以操作会成功。
私有程序包和公有存储库
CodeArtifact 不会将存储在 CodeArtifact 存储库中的程序包发布到公有存储库,例如 npmjs.com 或 Maven Central。CodeArtifact 将程序包从公有存储库导入到 CodeArtifact 存储库,但绝不会将程序包导出到公有存储库。您发布到 CodeArtifact 存储库的程序包将保持私有,并且仅提供给您已为其授予访问权限的 AWS 账户、角色和用户。
发布经过修补的程序包版本
有时,您可能想要发布修改后的程序包版本,可能是在公有存储库中可用的版本。例如,您可能在名为 mydep 1.1 的关键应用程序依赖项中发现了一个错误,您需要在程序包供应商审查和接受更改之前尽快修复该错误。如前所述,如果可以通过上游存储库和外部连接从您的 CodeArtifact 存储库访问公有存储库,则 CodeArtifact 会阻止您在 CodeArtifact 存储库中发布 mydep 1.1。
要解决此问题,请将程序包版本发布到无法访问公有存储库的另一个 CodeArtifact 存储库。然后使用 copy-package-versions API 将 mydep 1.1 的已修补版本复制到 CodeArtifact 存储库中,您将在那里使用它。
发布的资产大小限制
可以发布的程序包资产的最大大小受资产文件大小最大配额的限制,如AWS CodeArtifact 中的配额中所示。例如,您发布的 Maven JAR 或 Python Wheel 不能超过当前资产文件大小的最大配额。如果您需要在 CodeArtifact 中存储更大的资产,请申请增加配额。
除了资产文件大小的最大配额外,npm 程序包发布请求的最大大小为 2 GB。此限制与资产文件大小的最大配额无关,不能随着配额的增加而提高。在 npm 发布请求 (HTTP PUT) 中,程序包元数据和 npm 程序包 tar 存档的内容捆绑在一起。因此,可以发布的 npm 程序包的实际最大大小会有所不同,具体取决于所包含元数据的大小。
注意
已发布的 npm 包的最大大小限制为小于 2 GB。
发布延迟
已发布到 CodeArtifact 存储库的程序包版本通常在不到一秒内可供下载。例如,如果您使用 npm publish 命令将 npm 程序包版本发布到 CodeArtifact,则该版本应在不到一秒钟内就可供 npm
install 命令使用。但是,发布可能不一致,有时可能需要更长的时间。如果您必须在发布后立即使用程序包版本,请使用重试来确保下载可靠。例如,发布程序包版本后,如果第一次尝试下载时刚刚发布的程序包版本最初不可用,请重复下载最多三次。
注意
从公有存储库导入程序包版本通常要花比发布更长的时间。有关更多信息,请参阅 外部连接延迟。
程序包版本状态
CodeArtifact 中的每个程序包版本都有一个状态,描述了程序包版本的当前状态和可用性。您可以使用 AWS CLI 和 SDK 来更改程序包版本状态。有关更多信息,请参阅 更新程序包版本状态。
程序包版本状态的可能值如下所示:
-
已发布 - 已成功发布程序包版本,可以使用程序包管理器来请求版本。在返回给程序包管理器的程序包版本列表中将包括该程序包版本,例如,在
npm view <package-name> versions的输出中。程序包版本的所有资产均可从存储库中获得。 -
未完成 - 客户端已上传程序包版本的一个或多个资产,但尚未通过将其变为
Published状态来最终完成上传。当前,只有通用程序包版本和 Maven 程序包版本可以处于Unfinished状态。对于 Maven 程序包,当客户端上传程序包版本的一个或多个资源但没有为包括该版本的程序包发布maven-metadata.xml文件时,就会发生这种情况。当 Maven 程序包版本是未完成时,向客户端(例如mvn或gradle)返回的版本列表中不会包括该版本,因此在构建时不能使用该版本。通过在调用 PublishPackageVersion API 时提供unfinished标志,可以有意地使通用程序包保持在Unfinished状态。通过省略unfinished标志或调用 UpdatePackageVersionsStatus API,可以将通用程序包更改为Published状态。 -
未列出 - 可以从存储库下载程序包版本的资产,但向程序包管理器返回的版本列表中未包括该程序包版本。例如,对于 npm 程序包,
npm view <package-name> versions的输出将不包括该程序包版本。因为在可用版本列表中未显示该版本,这意味着 npm 的依赖项解析逻辑不会选择该程序包版本。但是,如果npm package-lock.json文件中已经引用了未列出的程序包版本,则仍然可以下载和安装该版本,例如在运行npm ci时。 -
已存档 - 无法再下载该程序包版本的资产。在返回给程序包管理器的版本列表中不会包括该程序包版本。由于资产不可用,因此会阻止客户端使用程序包版本。如果您的应用程序构建依赖于更新为已存档的版本,那么构建就会出问题,前提是该程序包版本尚未在本地缓存。因为存储库中仍存在已存档的程序包版本,您不能使用程序包管理器或构建工具来重新发布该版本,但您可以使用 UpdatePackageVersionsStatus API 将程序包版本的状态更改回未列出或已发布。
-
已处置 - 程序包版本未出现在列表中,也无法从存储库下载资产。已处置和已存档之间的主要区别在于,在已处置状态下,CodeArtifact 会永久删除程序包版本的资产。因此,您无法将程序包版本从已处置更改为已存档、未列出或已发布。由于已删除资产,因此无法再使用该程序包版本。将程序包版本标记为已处置后,我们将不再向您收取程序包资产的存储费用。
在不带 --status 参数的情况下调用 list-package-versions 时,默认返回所有状态的程序包版本。
除了前面列出的状态外,还可以使用 DeletePackageVersions API 删除程序包版本。删除程序包版本后,存储库中将不再存在该版本,您可以使用程序包管理器或构建工具随意地重新发布该程序包版本。删除程序包版本后,我们将不再向您收取程序包版本的资产的存储费用。
程序包名称、程序包版本和资产名称规范化
在存储程序包之前,CodeArtifact 会对程序包名称、程序包版本和资产名称进行规范化,这意味着 CodeArtifact 中的名称或版本可能与发布程序包时提供的名称或版本不同。有关如何在 CodeArtifact 中对每种程序包类型的名称和版本进行规范化的更多信息,请参阅以下文档:
CodeArtifact 不会对其他程序包格式进行规范化。