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

时间:2015-09-17 15:01:29

标签: node.js npm

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

P.S。目前我正在使用npmrc,它可以很好地切换.npmrc文件作为解决方法

13 个答案:

答案 0 :(得分:116)

您可以在.npmrc文件中为scoped packages设置多个注册表。例如:

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

@polymer范围内的软件包将从https://registry.npmjs.org收到,但其余的将从您当地的NPM收到。

答案 1 :(得分:40)

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

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

@myco是您的包裹范围。

您可以这样安装软件包:

npm install @myco/my-package

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

答案 2 :(得分:14)

不是最好的方法但是如果你在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/'

答案 3 :(得分:13)

对于那些也在寻找身份验证解决方案的人,我会添加一个范围包解决方案,您可以在.npmrc文件中包含多行:

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

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

答案 4 :(得分:6)

由于已经有两年了,而且似乎不可能做到这一点(仅使用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文件,使其指向刚创建的“组”。

  • 将您的私有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命令,以便将包发布到正确的仓库中。

答案 5 :(得分:4)

您可以对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在不同的服务器中查找软件包。

答案 6 :(得分:3)

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

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

希望有所帮助。

答案 7 :(得分:2)

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

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

答案 8 :(得分:2)

我认为最高投票的答案可能已经过时。从 2021 年 6 月开始,使用 npmrc 可以更轻松地执行此操作。

参考npm Docs

1.安装 npmrc

要安装 npmrc,请在命令行上运行 npm i npmrc -g

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

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

要创建 npm Enterprise 配置文件,请在命令行上运行 npmrc -c name-of-profile。 例如,要创建一个名为“work”的配置文件,请运行以下命令: npmrc -c work

要为配置文件设置 npm Enterprise 注册表,请运行以下命令,将 your-company-registry 替换为您公司的 npm Enterprise 注册表的名称:

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

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

创建 npm Enterprise 配置文件后,您可以为不同的注册表(例如公共 npm 注册表)创建第二个配置文件。

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

4.使用 npmrc 切换配置文件

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

npmrc profile-name

答案 9 :(得分:1)

自2020年4月13日起,除非您能够使用其他范围,否则没有此类功能,但是您可以使用 postinstall 脚本作为解决方法。每次 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.json package-lock.json 保持不变 npm安装之后。

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

我的公司设置了自己的注册表时遇到了同样的问题,因此我将proxy-registry大量改编为proxy-multi-registries以解决此问题。希望对您有所帮助。

答案 12 :(得分:0)

不,NPM 不支持多个注册表,除了一个作用域。

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