package.json是否支持复合变量?

时间:2020-08-19 19:00:22

标签: npm package.json .npmrc

一个尊重semver目录结构的构建项目的项目即将开始,而package.json或.nmprc似乎是定义此元数据的正确位置。这是一些初步的代码,演示了如何实现目标:

{
  "name": "com.vendor.product"
, "version": "0.0.0"
, "directories": {
    "build": "./out"
  }
, "main": "./${npm_directories_build}/${npm_package_name}/${npm_package_version}/${npm_package_name}.js"
, "exports": "${npm_package_main}"
, "scripts": {
    "echo": "echo\"${npm_package_exports}\""
  }
}

我希望

npm run echo

将复合变量结果打印到标准输出中,

./out/com.vendor.product/0.0.0/com.vendor.product.js

但是,它会打印文字文本

${npm_package_export}

我试图在.npmrc中使用数组变量

outpath[]=./out
outpath[]=/${npm_package_name}
outpath[]=/${npm_package_version}

但是

...
{
  "echo": "echo \"${npm_config_outpath}\""
}

仅打印一个空的换行符


预计package.json支持复合变量,但是现在这个假设是有问题的。我已经检查过文档,但是我遗漏了一些东西或未定义。避免长时间重复相同的数据(例如,多次引用包变量以生成单个路径)。软件包名称和版本旨在始终以可靠和可预测的方式指示构建文件的位置。 如果不支持复合变量,您能否阐明.npmrc数组变量的实际工作方式?如果没有,您是否可以推荐一种替代方法来达到相同的目的?非常感谢!

搜索的文档:

1 个答案:

答案 0 :(得分:1)

简短答案:

“ package.json是否支持复合变量?”

不幸的是,不是,不是您想要使用它们的方式。它只有package json vars,只能在npm scripts中使用。例如,在* Nix上,将echo脚本定义为:

"echo": "echo $npm_package_version"

或在Windows上将其定义为:

"echo": "echo %npm_package_version%"

将打印版本,例如0.0.0

注意: cross-env提供了适用于跨平台的单一语法的解决方案。

您当然不能在{em> package.json 字段中的${...}部分之外的其他地方添加parameter substitution scripts


其他信息:

关于您的后续评论:

.npmrc中定义的数组值如何在package.json中使用

我不相信你可以。例如说我们;

  1. 将此设计好的.npmrc保存在项目目录的根目录中。

    .npmrc

    quux[]="one"
    quux[]="two"
    quux[]="three"
    
    foo=foobar
    
  2. 然后cd到项目目录并运行以下命令以打印所有环境变量:

    npm run env
    

    如您所见,npm已添加了npm_config_foo=foobar环境变量。但是,对于quux数组,没有添加npm_config_quux=[ ... ]环境变量。

    因此,在使用 package.json vars 的npm脚本中,以下方法确实有效:

    "echo": "echo $npm_config_foo"
    

    但是,以下内容(用于引用该数组)却不是-仅仅是因为它不存在;

    "echo": "echo $npm_config_quux"
    

ini node.js程序包:

也许可以考虑研究npm用于解析.npmrc文件的ini node.js包。例如:

  1. 如果运行以下命令以将软件包安装在项目中:

    npm i -D ini
    
  2. 然后根据此定义npm echo脚本:

    "scripts": {
      "echo": "node -e \"var fs = require('fs'), ini = require('ini'); var config = ini.parse(fs.readFileSync('./.npmrc', 'utf-8')); console.log(config.quux)\""
    }
    

    请注意,它使用nodejs命令行选项-e来评估JavaScript代码。它实际上执行以下操作:

    var fs = require('fs'),
        ini = require('ini');
    
    var config = ini.parse(fs.readFileSync('./.npmrc', 'utf-8'));
    console.log(config.quux);
    
  3. 然后给出了我之前在运行时提到的人为.npmrc文件:

    npm run echo
    

    它将打印:

    [ 'one', 'two', 'three' ]