这是我的问题。我们有一个私有的NPM注册表,只在VPN中工作。我想有一个备用注册表https://registry.npmjs.org,这样当我退出VPN时,它可以无缝工作。
目前我正在使用npmrc,它可以很好地在.npmrc文件之间切换作为解决方案
.npmrc
你可以尝试以下步骤。(在我工作的地方我们就是这么做的)
希望这能有所帮助。
你可以在你的.npmrc文件中有多个范围包注册表。例如:
@polymer:registry=<url register A> registry=http://localhost:4873/
@polymer范围内的包将从https://registry.npmjs.org接收,但其余的包将从本地NPM接收。
@polymer
不是最好的方法,但如果你使用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是你的包范围。
@myco
您可以通过以下方式安装package:
npm install @myco/my-package
更多信息:https://docs.npmjs.com/misc/scope
由于已经有几年了,似乎不可能做到这一点(仅使用npm),这个问题的解决方案是使用Nexus存储库管理器(来自Sonatype)。Nexus支持多个存储库,您可以对它们进行排序,还可以使用代理/缓存来提高速度。
相关信息被复制在下面,所以如果/当上面的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。
npm publish --registry https://nexus/content/repositories/private-repo my-private-package
你可以为你的.npmrc文件中的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在不同的服务器上寻找包。
为此我使用了Strongloop的cli工具;更多信息见https://strongloop.com/strongblog/switch-between-configure-public-and-private-npm-registry/
在存储库之间切换就像:slc registry use <name>一样简单
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.json和package-lock.json在npm安装之后保持不变。
我的方法是做一个轻微的命令行变体,添加注册表开关。
我在npm可执行文件所在的nodejs文件夹中创建了这些文件:
npm-.cmd:
npm-.cmd
@ECHO OFF npm --registry https://registry.npmjs.org %*
npm-:
npm-
#!/bin/sh "npm" --registry https://registry.npmjs.org "$@"
现在,如果我想对普通的npm注册表做一个操作(当我没有连接到VPN时),我只是键入npm-,而我通常会键入npm。
npm
要测试此命令并查看包的注册表,请使用以下示例:
npm- view lodash
PS.我在windows中,并在Bash, CMD和Powershell中测试了这一点。我也
我认为投票最多的答案可能已经过时了。对于2021年6月,使用npmrc有一个更简单的方法来做到这一点。
npmrc
参考npm文档。
如果需要安装npmrc,在命令行中执行 npm i npmrc -g < / p >
npm i npmrc -g
在安装npmrc之后,您可以创建一个概要文件来访问您的自定义(可能是公司的)注册表。
npmrc -c name-of-profile
npmrc -c work
要为概要文件设置一个npm企业注册表,运行以下命令,将your-company-registry替换为您公司的npm企业注册表的名称:
your-company-registry
npm config set registry https://registry.your-company-registry.npme.io/
在你创建了你的npm企业配置文件之后,你可以为不同的注册表创建第二个配置文件,比如公共npm注册表。
要为公共注册表创建一个概要文件,在命令行中运行npmrc -c name-of-profile。例如,要创建一个名为“open-source”的概要文件,运行npmrc -c open-source。 要为您的开源配置文件设置公共注册表,运行以下命令: npm config set registry https://registry.npmjs.org/ < / p >
npmrc -c open-source
npm config set registry https://registry.npmjs.org/
要切换配置文件,在命令行中执行以下命令,将profile-name替换为您的配置文件名称:
npmrc profile-name
不,NPM不支持多个注册表,只支持一个范围。
参考:https://docs.npmjs.com/cli/v7/using-npm/scope
我也有同样的问题,我已经尝试了许多解决方案,但都不起作用,现在我遇到了通过为我的npm私有包使用不同的勺子,这样就可以使用多个具有相同.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}