运行npm命令并使用其他.npmrc文件中的设置

问题描述 投票:0回答:1

我正在一个项目中,该项目的根目录发布到注册表,而捆绑的dist发布到另一个注册表。关键是:这些注册表需要很多信息才能存在于.npmrc中,因此我创建了2个不同的文件。像这样的东西:

root/
    src/
    .npmrc
    publish.js
    package.json
    dist/
        js/
        css/
        index.html
        .npmrc

所以我写了一个脚本,增加了版本号,并在dist文件夹中运行了命令npm publish。如果我运行命令:

node publish.js

它将毫无问题地运行。但是,如果我将其放在npm脚本中:

{
    "scripts": {
        "publish:artifact": "node publish.js"
    }
}

这将失败,因为它将使用根.npmrc文件而不是目标文件夹的.npmrc。有没有一种方法可以在忽略当前.npmrc甚至更好地指定要使用的.npmrc文件的路径的同时运行命令?

更新:发布脚本会进行一些计算,然后对child_process脚本使用npm publish exec函数。代码是这样的:

import { exec } from “child_process”;
import path from “path”;

exec(“npm publish”, { cwd: path.join(__dirname, “../dist”) });
npm npm-scripts npm-publish npm-config .npmrc
1个回答
0
投票

tl; dr请参阅下面的[[Solution部分...


背景信息:

NPM提供--userconfig选项和$NPM_CONFIG_USERCONFIG环境变量,它们在npmrc files documentation中描述为;

    每个用户的配置文件(默认为$HOME/.npmrc;,可通过CLI选项--userconfig或环境变量$NPM_CONFIG_USERCONFIG配置)
  • 上述两种机制允许您为

    “用户配置”]指定到不同.npmrc文件的路径。但是,在您的方案中,您想指定“每个项目”配置的路径,即.npmrc目录中root/dist/文件的路径-不幸的是NPM不提供执行此操作的功能。

  • .npmrc中的配置设置成为环境变量:

    当您运行npm run publish:artifact命令时,在configuration settings文件中定义的所有root/.npmrc被重新定义为环境变量。这是在执行npm脚本中定义的命令之前完成的,即在执行node publish.js命令之前。

    检查npm创建的环境变量:

    为了进一步说明您可以将root/.npmrc文件中定义的配置设置重新定义为环境变量;

      首先cd到您的项目目录。
    1. 然后运行以下命令:
    2. npm run env

      如您所见,这(几乎)将NPM添加的所有环境变量打印到您的控制台。相关的环境变量名称以npm_config_开头。

      因此,假设您的root/.npmrc文件定义了以下registry设置:

    root / .npmrc

    registry
    运行registry=https://some-registry.org/
    命令后,您将看到相应的环境变量定义如下:

    npm run env


    解决方案:

    “背景信息”部分中所述,无法为“每个项目” npm_config_registry=https://some-registry.org/ 文件指定路径。因此,请考虑以下解决方案:

    1. root/.npmrc脚本中,使用node.js publish.js属性,并使用必要的process.env前缀环境变量修改此对象。

      基本上,您需要根据npm_config_文件中当前定义的内容,指定每个npm_config_前缀变量并提供其关联值。这将有效地覆盖从root/dist/.npmrc中的任何一个定义的任何设置。

      作为示例,假设four relevant npmrc files文件中定义了以下设置:

      root / dist / .npmrc

      root/dist/.npmrc
      给出该示例,在使用registry=https://some-registry.org/
      always-auth=true
      ...
      运行publish.js命令之前,您需要在exec()中定义以下环境变量:

      publish.js

      npm publish

      注:

      对于使用连字符(import { exec } from "child_process"; import path from "path"; // 1. Define/override npm_config environment variables: process.env.npm_config_registry = "https://some-registry.org/"; process.env.npm_config_always_auth = true; // 2. Execute your npm publish command exec(“npm publish”, { cwd: path.join(__dirname, “../dist”) }); )作为名称分隔符的配置设置,例如-,该分隔符将需要用下划线(always-auth)替换。如您在前面的always-auth示例中看到的,它已更改为_,然后以publish.js开头,形成always_auth

      Tip:

      如果您不确定在使用npm_config_时用于配置设置的正确变量名是什么,您可以始终运行npm_config_always_auth并检查NPM用于的命名法它。
    2. 您可以从process.env中删除npm run env文件,因为它实际上未被使用。
    3. 补充说明:

      [NPM会使用.npmrc程序包本身来解析root/dist文件。您可能需要考虑使用它来解析ini脚本中的.npmrc文件。然后使用root/dist/.npmrc动态定义/覆盖publish.js环境变量(与上面显示的方式大致相同)。我敢肯定,您可以避免在npm_config中对环境设置进行硬编码-但是我自己没有尝试过这样做。
    © www.soinside.com 2019 - 2024. All rights reserved.