有没有办法在一个npmrc文件中配置多个注册中心

这是我的问题。我们有一个私有的NPM注册表,只在VPN中工作。我想有一个备用注册表https://registry.npmjs.org,这样当我退出VPN时,它可以无缝工作。

目前我正在使用npmrc,它可以很好地在.npmrc文件之间切换作为解决方案

226331 次浏览

你可以尝试以下步骤。(在我工作的地方我们就是这么做的)

  • 创建具有两个(或多个)存储库源地址的注册表组。一个是你的内部private,另一个是npmjs的代理,优先考虑内部的。
  • 在.npmrc文件中将这个组作为您的注册表。这样,npm将总是尝试从内部获取它,如果没有找到从代理获取它

希望这能有所帮助。

你可以在你的.npmrc文件中有多个范围包注册表。例如:

@polymer:registry=<url register A>
registry=http://localhost:4873/

@polymer范围内的包将从https://registry.npmjs.org接收,但其余的包将从本地NPM接收。

不是最好的方法,但如果你使用mac或linux,甚至在windows中,你可以为不同的注册表设置别名。

##############NPM ALIASES######################
alias npm-default='npm config set registry https://registry.npmjs.org'
alias npm-sinopia='npm config set registry http://localhost:4873/'

对于任何正在寻找身份验证解决方案的人,我将在范围包解决方案中添加,您可以在.npmrc文件中有多行:

//internal-npm.example.com:8080/:_authToken=xxxxxxxxxxxxxxx
//registry.npmjs.org/:_authToken=yyyyyyyyyy

每一行代表一个不同的NPM注册表

在4.4.1版本中,如果可以更改包名,请使用:

npm config set @myco:registry http://reg.example.com

其中@myco是你的包范围。

您可以通过以下方式安装package:

npm install @myco/my-package

更多信息:https://docs.npmjs.com/misc/scope

由于已经有几年了,似乎不可能做到这一点(仅使用npm),这个问题的解决方案是使用Nexus存储库管理器(来自Sonatype)。Nexus支持多个存储库,您可以对它们进行排序,还可以使用代理/缓存来提高速度。

存在免费版和专业版/付费版。支持该特性的描述如下: https://help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries < / p >

相关信息被复制在下面,所以如果/当上面的URL/链接停止工作时,信息仍然在这里。

存储库组是将所有npm注册库从存储库管理器公开给用户的推荐方式,而不需要任何进一步的客户端配置。存储库组允许你将多个代理和托管存储库的聚合内容用一个URL暴露给npm和其他工具。

它允许你创建私有的npm注册表

一个私有的npm注册表可以用来上传你自己的包以及第三方的包。

为了减少重复下载并提高开发人员和CI服务器的下载速度,您应该代理托管在https://registry.npmjs.org的注册表。默认情况下,npm直接访问这个注册表。您还可以代理所需的任何其他注册中心。

因此,你要做的事情的一个快速项目列表是:

  • 安装关系

  • 创建本地/私有回购(或指向另一台服务器上的私有回购)

  • 创建一个GROUP,其中列出您的私有回购和公共回购。

  • 配置$HOME/。npmrc文件指向刚刚创建的“GROUP”。

  • 将你的私有npm包发布到本地回购。

  • 用户现在可以运行一次性设置。

npm config set registry https://nexus/content/groups/GROUP

    然后用户可以通过npm install安装公共包或私有包。 NPM install my-private-package NPM安装lodash any-other-public包 李< /代码> < / >

你的公共包和私有包都可以通过一个简单的npm install命令来安装。Nexus找到搜索组中配置的每个repo的包,并返回结果。所以npm仍然认为只有一个注册表,但在幕后有多个回购被使用。

重要提示:当你发布你的组件时,你需要指定npm publish --registry https://nexus/content/repositories/private-repo my-private-package命令,以便你的包被发布到正确的repo。

你可以为你的.npmrc文件中的registry条目使用多个存储库语法:

registry=http://serverA.url/repository-uri/
//serverB.url/repository-uri/
//serverC.url/repository-uri/:_authToken=00000000-0000-0000-0000-0000000000000
//registry.npmjs.org/

这会让你的npm在不同的服务器上寻找包。

为此我使用了Strongloop的cli工具;更多信息见https://strongloop.com/strongblog/switch-between-configure-public-and-private-npm-registry/

在存储库之间切换就像:slc registry use <name>一样简单

当我的公司建立自己的注册表时,我遇到了同样的问题,所以我大量地将proxy-registry重做为proxy-multi-registries来解决这个问题。希望它也能帮助到你。

截至2020年4月13日,没有这样的功能,除非你能够使用不同的作用域,但你可以使用postinstall脚本作为解决方案。它总是在每个npm安装之后执行好吧:

假设你已经将.npmrc配置为从你的私有github回购中安装@foo-org foo-pack-private,但@foo-org foo-pack-public公共包在npm上(在相同的范围:foo-org下)。

你的postinstall可能看起来像这样:

"scripts": {
...
"postinstall": "mv .npmrc .npmrcc && npm i @foo-org/foo-pack --dry-run && mv .npmrcc .npmrc".
}

不要忘记从依赖关系数组中删除@foo-pack / foo-org,以确保npm安装不会试图从github中获取它,并添加——即将标志,以确保package.jsonpackage-lock.jsonnpm安装之后保持不变。

我的方法是做一个轻微的命令行变体,添加注册表开关。

我在npm可执行文件所在的nodejs文件夹中创建了这些文件:

npm-.cmd:

@ECHO OFF
npm --registry https://registry.npmjs.org %*

npm-:

#!/bin/sh
"npm" --registry https://registry.npmjs.org "$@"

现在,如果我想对普通的npm注册表做一个操作(当我没有连接到VPN时),我只是键入npm-,而我通常会键入npm

要测试此命令并查看包的注册表,请使用以下示例:

npm- view lodash

PS.我在windows中,并在Bash, CMD和Powershell中测试了这一点。我也

我认为投票最多的答案可能已经过时了。对于2021年6月,使用npmrc有一个更简单的方法来做到这一点。

参考npm文档

1. 安装npmrc

如果需要安装npmrc,在命令行中执行 npm i npmrc -g < / p >

2. 创建你的第一个npm配置文件

在安装npmrc之后,您可以创建一个概要文件来访问您的自定义(可能是公司的)注册表。

要创建一个npm企业配置文件,在命令行上运行npmrc -c name-of-profile。 例如,要创建一个名为“work”的配置文件,运行如下命令: npmrc -c work < / p >

要为概要文件设置一个npm企业注册表,运行以下命令,将your-company-registry替换为您公司的npm企业注册表的名称:

npm config set registry https://registry.your-company-registry.npme.io/

3.为公共npm注册表创建一个配置文件

在你创建了你的npm企业配置文件之后,你可以为不同的注册表创建第二个配置文件,比如公共npm注册表。

要为公共注册表创建一个概要文件,在命令行中运行npmrc -c name-of-profile。例如,要创建一个名为“open-source”的概要文件,运行npmrc -c open-source。 要为您的开源配置文件设置公共注册表,运行以下命令: npm config set registry https://registry.npmjs.org/ < / p >

4. 带有npmrc的开关配置文件

要切换配置文件,在命令行中执行以下命令,将profile-name替换为您的配置文件名称:

npmrc profile-name

不,NPM不支持多个注册表,只支持一个范围。

参考:https://docs.npmjs.com/cli/v7/using-npm/scope

我也有同样的问题,我已经尝试了许多解决方案,但都不起作用,现在我遇到了通过为我的npm私有包使用不同的勺子,这样就可以使用多个具有相同.npmrc文件的注册表:

  • .npmrc:(你可以放尽可能多的包)
@scop1:registry=https://gitlab.example.com/api/v4/projects/<project1_id>/packages/npm/
@scop2:registry=https://gitlab.example.com/api/v4/projects/<project2_id>/packages/npm/


//gitlab.example.com/api/v4/projects/<project1_id>/packages/npm/:_authToken=${GITLAB_TOKEN}
//gitlab.example.com/api/v4/projects/<project2_id>/packages/npm/:_authToken=${GITLAB_TOKEN}