适用于私有存储库的范围NPM将斜杠“ /”转换为“%2F”

时间:2019-11-12 22:05:01

标签: node.js npm nexus

我想使用作用域从私有存储库中获取私有npm。 我已经将.npmrc设置为这样。

registry=https://registry.npmjs.org/
@myco:registry=https://nexus.myco.com/nexus/repository/

我已经将.yarnrc设置为这样。

registry "https://registry.npmjs.org/"
"@myco:registry" "https://nexus.myco.com/nexus/repository/"

但是当我这样做时:

yarn --verbose add @myco/some-private-npm

它抛出此错误:

verbose 0.708 Performing "GET" request to "https://nexus.myco.com/nexus/repository/@myco%2fsome-private-npm".
verbose 0.792 Request "https://nexus.myco.com/nexus/repository/@myco%2fsome-private-npm" finished with status code 404.

当我这样做时:

 yarn --verbose add @myco:some-private-npm

它转到以下400个网址(Nexus:无效的存储库路径):

verbose 0.957 Request "https://nexus.myco.com/nexus/repository/@myco:some-private-npm" finished with status code 400.

实际npm位于:

https://nexus.myco.com/nexus/repository/myco/some-private-npm

如何确保获取的网址没有“ @”并且“%2f”是​​“ /”?

谢谢!

4 个答案:

答案 0 :(得分:1)

对于纱线,每this github issue,请尝试向您的.yarnrc添加类似的配置:

registry "https://registry.npmjs.org/"
"@myco:registry" "https://nexus.myco.com/nexus/repository/"

否则,我建议仔细阅读链接的问题并尝试提供的解决方案。

答案 1 :(得分:0)

另一种可能的情况是,斜杠编码并不是真正的问题。您根本无权访问该特定存储库。

这将解释404,因为如果出于安全原因您没有访问权限,就好像它不存在,您就不会获得401。

答案 2 :(得分:0)

我还尝试在Github Actions中运行.tgz文件的npm publish并获得以下内容(替换范围和包)时,找到了此页面:

npm ERR! 404 Not Found - PUT https://registry.npmjs.org/@SCOPE%2fPACKAGE - Not found
npm ERR! 404 
npm ERR! 404  '@SCOPE/PACKAGE@0.0.5' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)

此软件包 IS 已发布,因此我认为%2f引起了该问题。根据{{​​3}},我也使用NPM_TOKEN作为环境变量。

解决方案:

      - name: Setup Node.js environment
        uses: actions/setup-node@v2.1.2
        with:
          node-version: '12'
          registry-url: 'https://registry.npmjs.org'
        
      - name: Publish to npmjs
        run: |
          npm install
          npm run pack
          npm publish <package tgz> --access public
        env:
          NPM_TOKEN: ${{ secrets.NPM_APIKEY }}
          NODE_AUTH_TOKEN: ${{ secrets.NPM_APIKEY }}

通过npmjs documentation

注意:我不确定此处是否仍需要NPM_TOKEN。

答案 3 :(得分:0)

前段时间,我遇到了完全相同的问题。 在NPM处检查您的存储库团队访问级别是否为读/写。 在我这边,我所在的团队只有读访问级别。切换解决了这个问题。