我正在一个项目中,该项目的根目录发布到注册表,而捆绑的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”) });
tl; dr请参阅下面的[[Solution部分...
--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
到您的项目目录。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/
文件指定路径。因此,请考虑以下解决方案:
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用于的命名法它。process.env
中删除npm run env
文件,因为它实际上未被使用。补充说明:
.npmrc
程序包本身来解析root/dist
文件。您可能需要考虑使用它来解析ini脚本中的.npmrc
文件。然后使用root/dist/.npmrc
动态定义/覆盖publish.js
环境变量(与上面显示的方式大致相同)。我敢肯定,您可以避免在npm_config
中对环境设置进行硬编码-但是我自己没有尝试过这样做。