NPM:如何在命令行中指定注册表以发布?

40
我正在测试我们的npm包注册表的新版本。我想在我们的CI服务器上运行一个作业,指定一个不同于默认值的注册表。
我尝试执行npm publish --registry "http://nexus.dsv.myhost/nexus/repository/npmjs-registry,但它没有起作用。 它被发布到了默认的注册表中。
如何在运行npm publish时指定不同的注册表。 这是一个作用域包。
3个回答

53

有多种方法可以完成这个任务。

  1. 使用 npm config 命令全局设置注册表

npm config set registry http://nexus.dsv.myhost/nexus/repository/npmjs
  • 使用npm config来为包作用域设置注册表

  • npm config set @<your scope here>:registry http://nexus.dsv.myhost/nexus/repository/npmjs
    
  • 使用发布配置来配置您的 package.json:

  • {
      ...
      "publishConfig": {
        "registry": "http://nexus.dsv.myhost/nexus/repository/npmjs"
      },
      ...
    }
    
    
  • 使用 npmrc配置注册表

  • registry=http://nexus.dsv.myhost/nexus/repository/npmjs
    

    2
    npm config 不起作用,因为我有一个共享的 Node 安装。这是一个 CI 服务器。那会改变在服务器上运行的所有内容的配置。我只想为特定的工作更改它。最好在命令行上配置一些东西,这样我就不需要更改代码了。 - neves
    3
    您的CI工作可以在尝试发布之前在包的根目录生成一个.npmrc文件,如果您需要将其针对于该工作进行特定设置。我更新了我的答案,以包含有关npmrc文件的详细信息。 - Jake Holzinger

    39

    看起来你在npm配置中某个地方配置了特定范围的注册表。

    npm将合并您的全局、本地和CLI提供的配置。但是任何特定于范围的配置都将优先于未加限定符的配置,而不管它们各自定义在哪里。

    例如,如果您在~/.npmrc文件中有@myscope:registry=xyz,那么它将优先于在CLI上提供的--registry=abc,因为特定于范围的注册表始终覆盖未加限定符的注册表。

    但是,您也可以像这样在CLI本身上传递特定于范围的注册表:

    npm publish --@myscope:registry=http://nexus.dsv.myhost/nexus/repository/npmjs-registry
    
    

    请注意,由于 nopt(npm在解析CLI选项时使用的工具)解析自由格式开关的方式,这里需要使用=符号。如果您使用空格代替,则不会按预期工作。


    等号注释的注册表参数刚刚救了我。谢谢。 - silvio

    2
    您还可以通过添加--scope参数直接发布到作用域注册表,其中该作用域已在您的 .npmrc 文件中定义。我找不到关于此功能的任何文档,所以在这里记录一下:

    给定 .npmrc 文件

    @myscope=https://my.custom.registry.url
    

    发布命令

    npm publish --scope=@myscope
    

    这将发布软件包到您的作用域/私有注册表。

    当在 Azure DevOps / Azure Artifacts feeds 中使用 NPM 软件包时,我发现这特别有用。我们决定不使用上游源,而是使用作用域将软件包推送到我们的私有注册表中。

    请注意,按照这种方式进行操作需要您的私有注册表将 @myscope/package-name 作为实际的软件包名称。有关说明,请参阅此 Microsoft 文档

    Azure Artifacts 示例软件包

    根据上面的说明,在使用作用域进行私有存储库和公共 npmjs.org 注册表时,您创建的软件包应该如下所示。

    package.json:

    ...
      "name": "@myscope/my-private-package",
    ...
    

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