如何在 .npmrc 文件中为作用域注册表设置 _auth?

57

我想知道如何配置.npmrc文件,以便我可以使用默认的注册表和具有身份验证的不同作用域注册表。

我正在使用Nexus进行私有存储库,并且不确定如何为特定的注册表设置身份验证,只有默认的注册表可以。

例如,我的~/.npmrc文件内容如下:

registry=https://registry.npmjs.org/
@test-scope:registry=http://nexus:8081/nexus/content/repositories/npm-test/
email=test@user.com
_auth="…"

如果我针对test-scope范围的包执行npm publish,则会出现身份验证错误。

据我所知,_auth仅适用于registry=...部分。是否有一种方法可以为@test-scope:registry=...部分指定auth密钥?

谢谢,


如果我理解你的情况正确的话,你正在请求为你的npm-private注册表和npm-open注册表分别设置两个不同的身份验证。 - Suhas Gavad
1
不一定是npm-open,目前只需要npm-private,尽管了解它们如何都具有身份验证会很有趣。(我意识到示例有一个_auth键) - Willem van Ketwich
我认为没有办法做到这一点,因为我的假设是您将使用与作用域注册表相同的用户名/密码进行注册表。您是否有不通过NXRM代理npmjs.org的原因?如果是这样,我认为您可以使用相同的用户/身份验证,它会起作用。这是预期的用例。 - joedragons
我们在使用Nexus代理时遇到了TTL和同一软件包的不同版本的问题,因此正在考虑这个作为替代方案。 - Willem van Ketwich
1
@joedragons FYI - 据我所知,这是可能的。请看下面我的回答。 - Willem van Ketwich
3个回答

76

所以,经过对NPM源代码的一些挖掘,发现有一种方法可以做到这一点。

我的解决方案如下:

registry=https://registry.npmjs.org/
@test-scope:registry=http://nexus:8081/nexus/content/repositories/npm-test/
//nexus:8081/nexus/content/repositories/npm-test/:username=admin
//nexus:8081/nexus/content/repositories/npm-test/:_password=YWRtaW4xMjM=
email=…

说明:

@test-scope 范围指定了在执行 npm publish 命令时,应该将具有该范围的包发布到不同于默认的 registry= 的注册表中。

两行以 //nexus:8081/... 开头的内容用于为作用域存储库指定凭据,包括 username_password,其中 _password 是从先前使用的 _auth 凭据中提取出的 base64 编码的密码组件。

使用这种方法,只有作用域内的软件包才会从私有注册表中发布和安装,而所有其他软件包都会从默认的注册表中安装。

编辑:

此外,密码可以作为环境变量进行指定,以便它不会以明文形式存储在文件中。

例如:

registry=https://registry.npmjs.org/
@test-scope:registry=http://nexus:8081/nexus/content/repositories/npm-test/
//nexus:8081/nexus/content/repositories/npm-test/:username=admin
//nexus:8081/nexus/content/repositories/npm-test/:_password=${BASE64_PASSWORD}
email=…

另外,使用Nexus时,必须指定email=行。


3
查看我的答案,了解不存储计划测试密码的标准方式。 - c0l3
1
微软文档明确指出要“追加”而不是“前置”作用域。谢天谢地,我找到了你的答案。 - Jnr
2
最终,当与Nexus配对使用时,有些东西帮助我顺利完成了Gitlab CICD!在我的.gitlab-ci.yml文件中,我设置了npm config set 'nexusUrlHere/repository/npm-group/:_auth' "${NEXUS_TOKEN}",然后我将NEXUS_TOKEN设置为Gitlab中的一个秘密,然后我们就可以开始了 :) - Phil D.

18

由于某种奇怪的原因,在使用作用域包时,_auth 被称为 _authToken。如果您正在使用它,则不必将明文密码存储在您的 .npmrc 文件中。

registry=https://registry.npmjs.org/
@test-scope:registry=http://nexus:8081/nexus/content/repositories/npm-test/ 
//nexus:8081/nexus/content/repositories/npm-test/:_authToken=...
email=…

5
运行以下命令,将@company-scope替换为作用域,将company-registry替换为您公司的npm企业注册表名称:
npm login --scope=@company-scope --registry=https://registry.company-registry.npme.io/

此信息可在npm的文档中获取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接