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

Posted

技术标签:

【中文标题】有没有办法在单个 npmrc 文件中配置多个注册表【英文标题】:Is there any way to configure multiple registries in a single npmrc file 【发布时间】:2015-12-14 12:29:26 【问题描述】:

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

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

【问题讨论】:

我其实很想知道同样的事情。也许要么让我的私人注册表首先被 ping,如果它失败回退到公共注册表(从本地回退,而不是私有服务器上的一个设置)。或者根据我的 wifi 名称切换我的注册表。 对于像我这样迷失的灵魂,usefull doc to npmrc ***.com/a/67067209/4989208 【参考方案1】:

您可以尝试一些步骤。 (这是我们在工作场所的做法)

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

希望对您有所帮助。

【讨论】:

如何在 npm 中创建注册表组?这是什么意思? @Tuupertunut registry 最简单的方法是使用某种存储库管理器,例如 sonatype nexus。它可以托管私有注册表、npmjs 中的代理以及创建存储库组。【参考方案2】:

您的.npmrc 文件中可以有多个scoped packages 注册表。例如:

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

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

【讨论】:

感谢您的建议。您能否告诉我,是否可以向这些范围内的注册表添加身份验证?因为我需要主注册表的 _auth 密钥。 什么是作用域包?我从来没有听说过这个。 @jcollum,范围包只是通过命名空间分组(或范围)的包。有关详细信息,请参阅docs.npmjs.com/misc/scope。范围界定可用于关联多个包(如 @angular),这使得很容易知道一个包(@angular/core)是 Angular 的一部分,但也可以是像 @mycompany/mypackage 这样的公司。 如果没有范围包,这可能吗?假设我们正在寻找这个特定的包去这个注册表,否则去那个注册表 @PinguinoSod,不,它仍然(截至 2019 年 12 月)不能用于非范围包。 Sonatype 是我所知道的唯一解决方案。见***.com/a/50995915/3281336【参考方案3】:

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

【讨论】:

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

对于同时寻求身份验证解决方案的任何人,我会添加范围包解决方案,您可以在 .npmrc 文件中包含多行:

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

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

【讨论】:

我会使用命令npm login --registry=npm.example.com。它将登录凭据 (authTokens) 存储在用户文件夹中的 .npmrc 文件中,因此您不需要在源代码中包含它 (docs.npmjs.com/cli/adduser) 它对我有用,谢谢,基本上我的 lib 有私有 nexus 注册表,但我的 Lib 还有一些依赖项需要从 registry.npmjs.org 安装,这对我有用【参考方案5】:

在 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)初始化你的包,然后发布它。 好的,但是该注册表如何回退 当我运行 npm i 时,我得到了 Invalid package name "@npmjs/": name can only contain URL-friendly characters 我也有名字只能包含URL友好字符的错误 这种方法对我来说看起来更干净。有没有办法在 package.json 中做到这一点?【参考方案6】:

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

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

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

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

它允许您创建私有 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 查找包搜索组中配置的每个 repo 并返回结果。所以 npm 仍然认为只有一个注册表,但在幕后使用了多个 repos。

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

【讨论】:

我是否可以在 .npmrc 文件中同时配置注册表(用于部署我自己的工件和拉取公共工件),这样我每次进行 npm 发布时就不必提及?为了推送我的工件,我使用了单独的 npm 存储库,而为了拉取所有工件,我使用了虚拟存储库。请帮我在 .npmrc 文件中进行配置。 @AnshitaSingh 我刚刚经历了这个。如果你喜欢我有一个不同的发布存储库(例如npm-private而不是npm-group),你可以覆盖你项目的package.json中的registry-key(详见https://blog.sonatype.com/using-nexus-3-as-your-repository-part-2-npm-packages)。使用 npm config set registry &lt;url&gt; 您可以将其设置为例如npm-group,包含npm-registry(转发仓库)和npm-private(你自己的仓库)。我使用了这个解决方案,因为从本地 GitLab CE 中获取工件太复杂了。【参考方案7】:

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

【讨论】:

是的,但是serverAserverBserverC 示例存储库都来自我们的内部网络,不适合您。我不知道它是否适合您,但如果您认为适合,您可以尝试为内部存储库部署 Nexus Repository Manager。 根据this response,双斜杠没有意义,所以你只是在设置没有值的键 据我从 npm/ini 属性文件阅读器中看到的,确实, // 将被读取为没有值的键。顺便说一句,就像作用域部分一样,它将被存储为辅助注册服务器。它们将进入 npm 并根据 npm 的内部评估算法作为注册表配置服务器进行处理。 有没有人试过这个解决方案。它是否有效并有助于配置后备存储库? 是否有任何官方文档描述此功能?我找不到任何东西。【参考方案8】:

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

在存储库之间切换很简单:slc registry use &lt;name&gt;

【讨论】:

【参考方案9】:

我在公司建立自己的注册表时遇到了同样的问题,因此我将proxy-registry 大量修改为proxy-multi-registries 以解决此问题。希望对你也有帮助。

【讨论】:

【参考方案10】:

从 2020 年 4 月 13 日起,除非您能够使用不同的范围,否则没有此类功能,但您可以使用 postinstall 脚本作为解决方法。它总是在每次 npm install 之后执行,

假设您已将 .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".

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

【讨论】:

为那些可能不知道的人澄清一下:postinstall 仅在本地包安装后执行(即npm install)而不是依赖项/devDependency 安装for该包(即@987654323 @)【参考方案11】:

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

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

npm-.cmd:

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

npm-:

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

现在,如果我想对普通的 npm 注册表进行操作(当我没有连接到 *** 时),我只需输入 npm-,我通常会输入 npm

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

npm- view lodash

附言。我在 Windows 中,并在 Bash、CMD 和 Powershell 中对此进行了测试。我也

【讨论】:

【参考方案12】:

我相信票数最高的答案可能已经过时了。从 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。例如,要创建一个名为“开源”的配置文件,请运行 npmrc -c open-source。 要为您的开源配置文件设置公共注册表,请运行以下命令: npm config set registry https://registry.npmjs.org/

4。使用 npmrc 切换配置文件

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

npmrc profile-name

【讨论】:

如何处理在多个存储库中使用范围名称的用例?例如。 npm 上的 @test/a 和 github 上的 @test/b @ShawnMclean 你能详细说明这个问题吗?我不太明白你要做什么。【参考方案13】:

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

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

【讨论】:

以上是关于有没有办法在单个 npmrc 文件中配置多个注册表的主要内容,如果未能解决你的问题,请参考以下文章

如何添加 .npmrc 文件?

有没有办法在单个对话框/视图中使用 libvlc 同步播放多个文件

有没有办法在 url 更改时更新在单个 spa 中注册的应用程序的历史位置?

每个目标有多个配置文件

是否可以在单个变量(批处理文件)中分配多个值?如果没有,有没有办法以更有效的方式运行它?

npmrc npm配置文件