有没有办法在单个 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 <url>
您可以将其设置为例如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 在不同的服务器上寻找包。
【讨论】:
是的,但是serverA
、serverB
和serverC
示例存储库都来自我们的内部网络,不适合您。我不知道它是否适合您,但如果您认为适合,您可以尝试为内部存储库部署 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 <name>
【讨论】:
【参考方案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.json 和 package-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 文件中配置多个注册表的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在单个对话框/视图中使用 libvlc 同步播放多个文件
有没有办法在 url 更改时更新在单个 spa 中注册的应用程序的历史位置?