package.json 支持复合变量吗?

Does package.json support compound variables?

一个尊重构建工件的 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 数组变量的实际工作原理?如果做不到这一点,您能否推荐一种替代方法来达到相同的目的?非常感谢!

搜索的文档:

简答:

"Does package.json support compound variables?"

很遗憾,不适合您使用它们的方式。它只有 package json vars which can be used in npm scripts 而已。例如在 *Nix 上将 echo 脚本定义为:

"echo": "echo $npm_package_version"

或在 Windows 上将其定义为:

"echo": "echo %npm_package_version%"

将打印版本,例如0.0.0.

注意: cross-env 提供了一种适用于 cross-platform.[=104 的单一语法的解决方案=]

除了 scripts 部分之外,您当然不能在 package.json 字段的其他地方包含 parameter substitution ${...}


附加信息:

关于您随后的评论:

How array values defined in .npmrc can be used in package.json

据我所知,我认为你做不到。例如,假设我们;

  1. 将这个人为的 .npmrc 保存在项目目录的根目录中。

    .npmrc

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

    npm run env
    

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

    因此,在使用 package.json vars 的 npm 脚本中,以下内容有效:

    "echo": "echo $npm_config_foo"
    

    然而,以下内容(用于引用数组)不会 - 仅仅因为它不存在;

    "echo": "echo $npm_config_quux"
    

ininode.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. 然后给出我之前在 运行ning:

    时提到的人为 .npmrc 文件
    npm run echo
    

    它将打印:

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