在Node.js中,我想读取npm用来确定下载包的位置的registry
属性的值。
const registry = someApi.get('registry');
我想知道,以便我可以创建一个preinstall脚本,确保开发人员通过本地Artifactory实例而不是直接从npm.org下载包。
const EXPECTED_REGISTRY = 'https://example.com/artifactory'
const registry = someApi.get('registry');
if (registry !== EXPECTED_REGISTRY) {
console.log('Please configure your .npmrc to use Artifactory');
console.log('See http://example.com/instructions');
process.exit(1);
}
这样做的一种方法是炮轰npm config list --json
。必须有一个API,可以给我相同的结果。我找不到它。
答案 0 :(得分:4)
虽然已经有一个可接受的答案,但我将为后代发布一个替代答案。
如果您使用npm
命令运行脚本并将脚本添加到 package.json 文件的scripts
属性中,则应该可以访问NPM配置属性通过模式process.env.npm_config_*
到您的NodeJS脚本。
例如,给定此 package.json 文件:
{
"scripts": {
"start": "node -p \"process.env.npm_config_foo\""
}
}
运行以下命令时:
npm config set foo bar
npm start
输出为:
> @ start /Users/anonymous/projects/my-package
> node -p "process.env.npm_config_foo"
bar
请注意,如果您的scripts
属性不是NPM的知名属性之一(例如test
,start
),则需要使用npm run <script-name>
而不是npm <script-name>
。
答案 1 :(得分:3)
我非常肯定你必须&#34;支持&#34;,我没有其他API知道。
您可以使用节点execSync()或exec()方法执行npm config
子命令get,即:
$ npm config get registry
使用execSync()
的节点示例:
const execSync = require('child_process').execSync;
const EXPECTED_REGISTRY = 'https://example.com/artifactory';
const registry = execSync('npm config get registry',
{ stdio: ['ignore', 'pipe', 'pipe'] }).toString().replace(/\n$/, '');
if (registry !== EXPECTED_REGISTRY) {
console.log('Please configure your .npmrc to use Artifactory');
console.log('See http://example.com/instructions');
process.exit(1);
}
备注:强>
execSync()
选项stdio
配置为阻止将返回的registry
值记录到控制台。/\n$/
用于删除换行符。答案 2 :(得分:1)
这里有npm软件包,不需要像已接受的答案中那样进行炮击:
https://www.npmjs.com/package/libnpmconfig
您甚至可以在节点脚本中导入npm软件包,先执行npm.load()
,然后执行npm.config.get(<whatever-key>)
。
答案 3 :(得分:-1)
保存在配置块中的值可以通过添加“npm_package_config_”在 npm 脚本内部访问。
例如
{
"config": {
"fooVar": "abc123"
}
"scripts": {
"echo": "echo $npm_package_config_fooVar"
}
}
> npm run echo
> abc123