这是我的问题。我们有一个私有的NPM注册表,只能在VPN中使用。我希望有一个备用注册表https://registry.npmjs.org,这样当我离开VPN时,它可以无缝地工作。
P.S。目前我正在使用npmrc,它可以很好地切换.npmrc文件作为解决方法
答案 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
答案 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)
您可以尝试一些步骤。 (我们在工作场所如何做到这一点)
希望有所帮助。
答案 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。
要安装 npmrc,请在命令行上运行
npm i npmrc -g
安装 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/
创建 npm Enterprise 配置文件后,您可以为不同的注册表(例如公共 npm 注册表)创建第二个配置文件。
要为公共注册表创建配置文件,请在命令行上运行 npmrc -c name-of-profile
。例如,要创建一个名为“open-source”的配置文件,请运行 npmrc -c open-source
。
要为您的开源配置文件设置公共注册表,请运行以下命令:
npm config set registry https://registry.npmjs.org/
要切换配置文件,请在命令行上运行以下命令,将 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 不支持多个注册表,除了一个作用域。