npm 可以用于私有包的 AWS CodeArtifact,而所有 npm.org 都用于公共包吗?

问题描述

docs 读起来有点像开发人员应该将所有“包注册职责”交给 AWS CodeArtifact。但是我想继续使用 npm.org 来处理一些包。

给定一个使用私有和公共包的 javascript 应用程序,我可以这样设置 npm/AWS:

  • 私有范围的包(我的代码)从 AWS CodeArtifact 中提取,并且
  • 公共范围的包(例如 lodash)被拉取到 npm.org?

解决方法

我也对此感到困惑,但经过大量阅读后,aws codeartifact 希望您对公共包进行一对一映射。这意味着如果您想要来自公共 npm 存储库的 lodash,您需要将它添加到您的 codeartifact 存储库中。幸运的是,aws 让这一切变得简单,有 2 个解决方案可以实现这一点

解决方案 1:

在您的代码工件存储库上设置一个上游到 npm 注册表。

in console

这将自动创建一个名为“npm-store”的代码工件存储库,当您从 package.json npm install 公共包(当然是登录后)时,它会添加尚未添加的包 安装在“npm-store”上,然后您的 codeartifact 存储库(您将 npm-store 上传到的那个)将从那里下载它,然后将在您的构建中使用。 您还可以设置另一个上游以在同一个存储库上说 pypi。会以同样的方式工作

解决方案 2:

使用 associate-external-connection - 每个代码工件存储库只能有一个外部连接。您要做的是创建一个代码工件存储库,将其命名为“my-external-repo”。现在我可能是错的,但我在 UI 中没有看到任何地方可以设置它,但是如果您使用的是 aws cli,则可以运行类似于此的命令

aws codeartifact associate-external-connection \ --domain "my-org" --domain-owner "account-id" \ --repository "my-external-repo" --external-connection public:npmjs

然后将“my-external-repo”设置为将使用公共 npm 包的 codeartifact 存储库的上游。现在,当您 npm install 时(当然是登录后),将添加不在“my-external-repo”上的公共包,然后您将“my-external-repo”上传到的各种存储库将下载这些包

,

有一种方法可以显式设置两个 npm 注册表,从而实现您想要的。 而不是使用 aws codeartifact login --tool npm --repository my-repo --domain my-domain 登录到 aws,您应该使用更精细的方法,使用以下命令:

# get endpoint 
endpoint = aws codeartifact get-repository-endpoint --domain my_domain --domain-owner 111122223333 --repository my_repo --format npm

# set a scoped registry
npm config set registry endpoint --scope=@my-package

# get token
token = aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --repository my_repo

# set token
npm config set //my_domain-111122223333.d.codeartifact.region.amazonaws.com/npm/my_repo/:_authToken=token

# always truth
npm config set //my_domain-111122223333.d.codeartifact.region.amazonaws.com/npm/my_repo/:always-auth=true

这些命令是对 aws codeartifact login --tool npm --repository my-repo --domain my-domain (more info) 的解构,区别在于不是在您的 registry 文件中设置通用的 .npmrc(用于设置您的 npm) 将设置一个范围的注册表 (more info)。 通过这种方式,您将能够从您想要的来源获取您的包裹。