有没有办法在单个npmrc文件中配置多个注册表


143

这是我的问题。我们有一个私有NPM注册表,仅在VPN中有效。我想拥有一个后备注册表https://registry.npmjs.org,以便当我退出VPN时它可以无缝运行。

PS当前,我正在使用npmrc,它可以很好地在.npmrc文件之间进行切换,这是一种解决方法


8
我实际上很想知道同一件事。也许首先让我的私有注册表ping通,或者如果它无法回退到公共注册表(从本地回退,而不是私有服务器上的一个设置)。或者根据我的wifi名称切换我的注册表。
ProLoser '16

1
对于像我这样迷失的灵魂,npmrc
Andreas

Answers:


194

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

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

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


15
感谢您的建议。您能否告诉我们,是否可以向这些范围内的注册表添加身份验证?因为我需要主目录的_auth密钥。
Bloomca

3
什么是范围包?我从来没有听说过。
jcollum

1
@jcollum,作用域包只是通过名称空间分组(或作用域)的包。有关详细信息,请参见docs.npmjs.com/misc/scope。范围可用于关联多个软件包(例如@angular),这使得很容易知道一个软件包(@ angular / core)是Angular的一部分,但也可以是像@ mycompany / mypackage这样的公司。
PatS

6
没有作用域包,这可能吗?假设我们要查找的特定软件包请转到该注册表,否则请转到该注册表
PinguinoSod

2
@PinguinoSod,不,对于非范围内的软件包来说仍然无法使用(截至2019年12月)。Sonatype是我所知道的唯一解决方案。参见stackoverflow.com/a/50995915/3281336
PatS

71

在版本4.4.1上,如果可以更改程序包名称,请使用:

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

@myco您的包装范围在哪里。

您可以通过以下方式安装软件包:

npm install @myco/my-package

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


还需要使用范围(npm init --scope = myco)初始化您的软件包,然后发布它。
gjegadesh

1
好的,但是该注册表
有何后盾

1
Invalid package name "@npmjs/": name can only contain URL-friendly characters跑步的时候到了npm i
umutesen '19

我也有名字只能包含URL友好字符错误
katwhocodes

这种方法对我来说看起来更干净。在package.json中有没有办法做到这一点?
哈里·克里希纳·加迪帕蒂

19

对于也在寻找身份验证解决方案的任何人,我都会添加作用域软件包解决方案,您可以在.npmrc文件中包含多行:

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

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


4
我会使用命令npm login --registry=npm.example.com。它将存储在.npmrc文件中的登录凭据(authTokens)在你的用户文件夹,这样你就需要把它的源代码做(docs.npmjs.com/cli/adduser
magikMaker

它为我工作,谢谢,基本上我有私人关系登记到我的lib中,但我的库有哪些需要从安装再过依赖 registry.npmjs.org,这个工作对我来说
Chanuka Asanka

17

这不是最好的方法,但是如果即使在Windows中也使用Mac或Linux,则可以为不同的注册表设置别名。

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

2
一种类似的解决方案是设置一个别名,该别名将--registry选项传递给npm。这具有相同的效果,但仅适用于单个命令。语法为alias npm-sin=npm --registry https://localhost:4873/
PatS

11

由于已经有几年了,而且似乎不可能做到这一点(仅使用npm),因此解决此问题的方法是使用Nexus Repository Manager(来自Sonatype)。Nexus支持多个存储库,您可以订购它们,还可以代理/缓存以提高速度。

有免费版和专业版/付费版。支持此功能的功能在以下网址中进行了描述:https : //help.sonatype.com/repomanager3/node-packaged-modules-and-npm-registries

相关信息在下面重复,因此,如果/当上述URL /链接停止工作时,该信息仍在此处。

建议使用存储库组,以将所有npm注册表存储库从存储库管理器公开给用户,而无需任何其他客户端配置。存储库组允许您使用一个指向npm的URL和其他工具来公开多个代理和托管存储库的聚合内容。

它使您可以创建私人npm注册表

私人npm注册表可用于上载您自己的软件包以及第三方软件包。

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

因此,为完成这项工作而要做的事情的简要项目清单是:

  • 安装Nexus

  • 创建本地/专用存储库(或指向另一台服务器上的专用存储库)

  • 创建一个列出您的私人仓库和公共仓库的GROUP。

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

  • 将您的私有npm软件包发布到本地仓库。

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

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

  • 然后,用户可以通过安装公共或私有软件包npm install npm install my-private-package npm install lodash any-other-public-package

而且您的公共和私有软件包都可以通过一个简单的npm install命令安装。Nexus找到在组中配置的每个存储库中搜索的软件包,然后返回结果。因此,npm仍然认为只有一个注册表,但是幕后正在使用多个存储库。

重要说明:发布组件时,需要指定npm publish --registry https://nexus/content/repositories/private-repo my-private-package命令,以便将软件包发布到正确的存储库。


我可以在.npmrc文件中配置两个注册表(用于部署我自己的工件和拉公共工件),以便我在每次进行npm发布时都不必提及吗?为了推送我的工件,我正在使用单独的npm存储库,而为了拉出所有工件,我正在使用虚拟存储库。请帮助我同时在.npmrc文件中进行配置。
Anshita Singh

1
@AnshitaSingh我刚刚经历了这个。如果您喜欢我有一个用于发布的其他存储库(例如npm-private而不是npm-group),则可以registrypackage.json项目的中覆盖-key (https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packages有关详细信息,请参见)。使用,npm config set registry <url>您可以将其设置为例如npm-group,其中包含npm-registry(转发存储库)和npm-private(您自己的存储库)。我使用了此解决方案,因为要从本地GitLab CE中获取工件太复杂了。
伊戈尔

7

您可以对文件中的registry条目使用多种存储库语法.npmrc

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

这将使您的npm在不同的服务器中查找软件包。


是的,但是serverAserverBserverC例如仓库都从我们的内部网络中,你不会工作。我不知道它是否适合您,但如果认为适合,您可以尝试为内部存储库部署Nexus Repository Manager。
费尔南多·费尔南德斯

1
根据此响应,双斜杠没有任何意义,因此您只需将键设置为无值
PinguinoSod

1
据我从npm / ini属性文件阅读器看到的,确实,//将被读取为没有值的键。顺便说一句,像范围部分一样,它将被存储为辅助注册表服务器。它们将进入npm,并将根据npm的内部评估算法作为注册表配置服务器进行处理。
Fernando Fernandes

1
有没有人尝试过这种解决方案。它有效并且有助于配置后备存储库吗?
路加·P·伊萨克

3

您可以尝试一些步骤。(它如何在我的工作场所做到)

  • 创建具有两个(或更多)存储库源地址的注册表组。一个是您的内部私有,另一个是npmjs的代理,优先于内部的代理。
  • 使该组成为.npmrc文件中的注册表。这样,npm将始终尝试从内部服务器获取它,如果找不到,则从代理服务器获取它。

希望有帮助。


6
如何在npm中创建注册表组?那是什么意思?
Tuupertunut

1
@Tuupertunut注册表最简单的方法是使用某种存储库管理器,例如sonatype nexus。它可以托管私人注册表,npmjs中的代理以及创建存储库组。
Kaus Untwale



1

到2020年4月13日,除非您能够使用其他范围,否则将没有此类功能,但是您可以使用安装后脚本作为解决方法。它总是执行,还有,以后每次NPM安装

假设您已将.npmrc配置为从私有github存储库中安装@ foo-org / foo-pack-private,但是@ foo-org / foo-pack-public公共软件包位于npm上(在同一范围内:foo- org)。

您的后安装可能如下所示:

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

不要忘记从依赖项数组中删除@ foo-pack / foo-org,以确保npm install不会尝试从github获取它,并添加--dry-run标志以确保package.jsonpackage- npm安装lock.json保持不变。


0

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

我在找到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中对此进行了测试。我也

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.