Rush StackShopBlogEvents
Skip to main content

NPM 仓库认证

私有 NPM 源可以让你的 NPM 包在内部发布并使用,除了私有源需要授权外,其工作方式与公开的 https://www.npmjs.com/ 类似。每个用户需要获取一个访问口令,通常口令会被保存在 ~/.npmrc 文件内。

需要私有 NPM 源的大型项目往往有利于:

  • 在团队内以私有的形式分享代码
  • 代理公开仓库的代码来提高可靠性,并审计公开库,并进行安全筛选
  • 通过安装预编译的工具包加速 CI 操作,而不是在每次调用工具前执行 rush install && rush build
  • 在发布到公开的 NPM 仓库前进行安装测试
  • 发布包装后的第三方库
    (与 GitHub URL dependencies 相比,NPM 包提供了更好的 SemVer 版本管理和更好的缓存机制。)

常用的提供商有:

对于以测试为目的的私有源头,Verdaccio是一个基于 Node.js 的轻量级 Node.js 服务器,可以运行在 http://localhost 上,并实现了完整的私有仓库功能。

源的映射

私有源的映射被定义在 monorepo .npmrc 文件中。

下面的示例将从私有源中安装公司的库,从公共源中获取其他包,公司的库的 NPM scope 为 @example.

common/config/rush/.npmrc

# 将公司的 NPM scope ("@example")映射到私有源:
@example:registry=https://my-registry.example.com/npm-private/

# 否则,使用公共 NPM 仓库
registry=https://registry.npmjs.org/
always-auth=false

# 此处介绍如何在私有源中进行身份校验。
# 出于安全性的考虑,CI 任务需要从环境变量中获取口令,具体内容由私有源决定。
# 如果某一行的环境变量时未定义的,那么 Rush 会忽略这一行,这是为了避免从 ~/.npmrc. 中获取口令时产生一个无效的字符串。
//my-registry.example.com/npm-private/:_password=${MY_CI_TOKEN}
//my-registry.example.com/npm-private/:username=${MY_CI_USER}
//my-registry.example.com/npm-private/:always-auth=true

普遍的是,私有源会有缓存代理,它可以从公共仓库中拿到包,此时,就不需要 NPM scopes 映射了,你的配置项就会是如下:

common/config/rush/.npmrc

# 将所有都映射到私有源
registry=https://my-registry.example.com/npm-private/
always-auth=true

# 此处介绍如何在私有源中进行身份校验。
# 出于安全性的考虑,CI 任务需要从环境变量中获取口令,具体内容由私有源决定。
# 如果某一行的环境变量时未定义的,那么 Rush 会忽略这一行,这是为了避免从 ~/.npmrc. 中获取口令时产生一个无效的字符串。
//my-registry.example.com/npm-private/:_password=${MY_CI_TOKEN}
//my-registry.example.com/npm-private/:username=${MY_CI_USER}

可以通过 .npmrc 页来了解一些比 .npmrc 优先级更高的配置。

使用 "rush setup" 来获取口令

Rush 近期引入了一个实验性的功能:rush install 可以检测用户的源权限缺失或过期,如果过期,则会询问是否执行 "rush setup", 该命令会引导用户来获取口令,然后更新他们的 ~/.npmrc 文件,新的配置会被合并到以前的配置中。

"rush setup" 交互示例如下:

NPM credentials are missing or expired

==> Fix this problem now? (y/N) Yes

This monorepo consumes packages from an Artifactory private NPM registry.

==> Do you already have an Artifactory user account? (y/n) Yes

Please open this URL in your web browser:

https://my-company.jfrog.io/

Your user name appears in the upper-right corner of the JFrog website.

==> What is your Artifactory user name? example-user

Click "Edit Profile" on the JFrog website. Click the "Generate API Key" button if you haven't already done so
previously.

==> What is your Artifactory API key? ***************

Fetching an NPM token from the Artifactory service...

Adding Artifactory token to: /home/example-user/.npmrc

该实现目前只支持 JFrog Artifactory, 其他服务将在未来支持。

需要在 artifactory.json 配置文件中设置 "registryUrl" 字段,并设置 "enabled": true 后就可以使用该功能。文件模版包含其他可选配置的文档,这些可以用来自定义该交互。

参考更多