私有存储库的 Scoped NPM 将斜杠“/”转换为“%2F”

Scoped NPM for private repository converts slash "/" to "%2F"

我想使用范围从私有存储库中获取私有 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 url(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

如何确保获取的 url 没有“@”且“%2f”是“/”?

谢谢!

根据 this github issue 对于 yarn,尝试将类似的配置添加到您的 .yarnrc:

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

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

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

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

我在 Github 操作中尝试 运行 npm publish .tgz 文件时发现此页面,并获得以下内容(替换范围和包):

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 是导致问题的原因。根据 npmjs documentation.

,我也使用 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 }}

通过 Github Documentation.

注意:我不确定这里是否还需要 NPM_TOKEN。

我 运行 前段时间遇到过完全相同的问题。 如果您的存储库团队访问级别是 read/write,请检查 NPM。 在我这边,我所在的团队只有读取访问权限级别。切换解决了问题。

确保 .yarnrc 实际上包含 注册表“https://registry.npmjs.org/” 并不是 注册表“registry.npmjs.org” 那会给出同样的错误。