从Node.js脚本中读取npm配置值

时间:2018-01-08 21:12:24

标签: node.js npm

在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,可以给我相同的结果。我找不到它。

4 个答案:

答案 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的知名属性之一(例如teststart),则需要使用npm run <script-name>而不是npm <script-name>

参考:https://docs.npmjs.com/misc/config

答案 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);
}

备注:

  1. execSync()选项stdio配置为阻止将返回的registry值记录到控制台。
  2. 正则表达式/\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