为本地开发和 CI 设置私有 npm 注册表身份验证的最佳做法是什么?

What's the best practice to setup private npm registry authentication for local development and CI?

我想知道是否有一般的最佳实践来为本地开发设置私有 npm 注册表身份验证,该实践也适用于 CI(反之亦然)。

这是我目前的理解:

对于本地开发: 运行 npm login 这将创建一个访问令牌,创建一个 ~/.npmrc 文件,并写入访问令牌到该文件如下:

@my-scope:registry=https://registry.npmjs.org/
//registry.npmjs.org/:_authToken=my-auth-token

在我的项目中,我有这个 .npmrc 文件(在 package.json 旁边):

@my-scope:registry=https://registry.npmjs.org/
//registry.npmjs.org/:always-auth=true

这似乎很有效。我可以安装我的私人包,因为 npm 似乎为注册表选择了用户级身份验证设置。

For CI: The NPM docs 建议在项目级别添加以下内容 .npmrc 以在 CI 中注入身份验证:

//registry.npmjs.org/:_authToken=${NPM_TOKEN}

不幸的是,这会覆盖我机器上的用户级配置。 .npmrc 个文件有 the following precedence(从高到低):项目级、用户级、全局、npm 内置。 npm CLI 现在尝试使用 NPM_TOKEN 环境变量进行身份验证,除非我在本地计算机上明确导出它,否则这显然不起作用。

也许我遗漏了一些明显的东西。如果没有,我很好奇是否有任何通用的最佳实践来处理这个问题?当访问令牌已经在用户级别配置时,要求每个员工在他们的机器上导出访问令牌 .npmrc 似乎不是一个很好的解决方案。

或者,可以简单地不理会用户级配置(或 npm 登录),直接在每位员工的本地计算机上将访问令牌导出为 NPM_TOKEN。但是就像提到的那样,我认为这不是一个很好的解决方案。我想象一个标准解决方案(如用户级配置文件),每个员工都可以在其中设置公司的私有注册表。

您可以保留适用于开发的 .npmrc 并通过将其覆盖为 运行 的一部分来在 CI 中猴子修补它:

// your-ci.yaml
steps:
  - env:
      NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
  - run: |
      echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc
      npm install