【问题标题】:Suddenly, NPM script variables no longer work突然,NPM 脚本变量不再起作用
【发布时间】:2022-04-23 04:03:08
【问题描述】:

我在 NPM 脚本中使用像这样的 package.json 变量:

// package.json
{
  "version": "0.12.1",
  "scripts": {
    "get-version": "echo %npm_package_version%"
  }
}

npm run get-version 当前回显%npm_package_version% 而不是0.12.1。过去,这些脚本运行时没有任何问题。突然只有变量名回来了。具有多个存储库。我运行 Windows 10 2004 和 NodeJS v15.4.0。

Node.js 15 中的 NPM 脚本有变化吗?是错误还是功能?

【问题讨论】:

  • 对于跨平台,请考虑使用cross-var,然后您可以使用单一语法,即使用美元前缀$... 而不是%...%。例如; "get-version": "cross-var echo $npm_package_version"
  • 顺便说一句。如果你cd到你的项目目录并运行npm run env,你可以验证npm_package_version是否存在于环境变量列表中。
  • 感谢您的编辑。 npm run env 工作并列出npm_package_version。不明白为什么%npm_package_version% 不再起作用了。使用npm install cross-var --save-dev 安装后,cross-var 的技巧有效。
  • @JordanRamstad:npm config get script-shell 显示了什么?
  • @entitycs 是的,虽然现在我确实看到了这个问题,但相关问题与我的问题并不完全相同(我尝试将其作为解决方案,但它也不起作用),提出赏金是可能有点仓促,应该提出我自己的问题。基本上我希望能够运行一个 npm 脚本并从 cli 传递一个变量,并让节点脚本可以访问它。我还没有找到一个有效的解决方案,并且已经求助于使用环境变量。但是,我在上一条评论中描述它的方式在以前的版本中有效,在 package.json 中定义了像 $variable 这样的变量。

标签: windows variables npm package.json


【解决方案1】:

更新:未能在 Windows 上扩展环境变量似乎是 a recent high-priority known bug in the npm CLI

因为这是npm@7 特定的,所以在发布修复程序之前,您可以降级到npm@6

原始答案:

对于这个问题的具体情况,最简单的解决方案是使用node

    "get-version": "node -p process.env.npm_package_version"

这适用于 Node.js 支持的所有平台。

如果您需要更通用的解决方案并且不想重写一堆脚本来使用node,您可以尝试cross-var,如cmets 中@RobC 所述。

至于问题的根源,可能你是在windows bash shell下运行的,这种情况下你可以这样用:

    "get-version": "echo $npm_package_version"

但这不适用于非 bash Windows 环境。

【讨论】:

  • 我用错误链接和解决方法更新了我的答案。
【解决方案2】:

我发现简单的 hack 在我的情况下非常有效,

特别是在您的用例中

// package.json
{
  "version": "0.12.1",
  "scripts": {
    "get-version": "node -e \"console.log(process.env.npm_package_version)\""
  }
}

用法

npm run get-version

无论如何你想传递参数。

// package.json
{
  "scripts": {
    "get-argument": "node -e \"console.log('your argument:',  process.argv[1] )\"",
  }
}

测试示例

npm run get-argument hello_world

【讨论】:

  • Windows cmd 在运行第二个示例时会抛出错误,因为单引号包含 JS。对于跨平台,请考虑:1) 将第二个示例中的引用更改为:"get-argument": "node -e \"console.log('your argument:', process.argv[1] )\""注意:单引号现在包含'your argument' 字符串,所有JS 都包含在JSON 转义双引号(\"...\")中2) 同样,您的第一个示例应该是"get-version": "node -e \"console.log(process.env.npm_package_version)\""即用 JSON 转义双引号将 JS 括起来.
  • 感谢您关注@RobC,
【解决方案3】:

默认值是处理未定义值的好方法。我们使用预定义的值。在我们的 NPM 脚本中,我们可以使用以下语法来实现;

{
  "version": "0.12.1",
  "scripts": {
    "get-version": "echo ${npm_package_version:0.99}"
  }
}

当然,从 bash 提示符运行 npm 可能会有所帮助。我想从 Cmd/Powershell 运行“可能会工作”,但我会小心的。

【讨论】:

  • 如果您想使用默认值,那么您的语法不正确。你想要的是${npm_package_version:-2.0.0},即你缺少一个连字符。这确保了如果 npm_package_version 未设置或为空,则扩展例如2.0.0 被替换。否则,npm_package_version 的值将被替换。 (注意:npm在*nix上运行脚本的shell默认为sh,在windows上默认为cmd,因此参数扩展只能在前一种情况下成功。)
【解决方案4】:

仅供参考 - 如果您使用包配置变量,则版本 7 中的相关更改: 变量名称从 V6 中的 npm_package_config_customFooVar 更改为 V7 中的 npm_config_customFooVar 将这些适当的(如下)描述为正在使用的环境(Windows bash linux 等)。或使用像 cross-var 这样的 lib。

包.json

{
  "config": {
    "customFooVar": "bar",
    "env": "development"
   },
  "scripts": {
    "get-var": "echo using env1 $npm_config_customFooVar OR env2 %npm_config_customFooVar%"
    "build": "npm config set myAppName:env"
    "postbuild": "cross-var ng build --configuration=$npm_config_env && cross-var node myOtherBuildSript.js $npm_config_env"
  }
} 

e.g. npm-cli call (note space after --) as this is passed to the script. Not to npm itself.

npm run build -- production

【讨论】:

    【解决方案5】:

    将 args 从 package.json 传递到 cli 回显 %npm_package_version%

    【讨论】:

      【解决方案6】:

      这个解决方案允许我在 Windows 和 Unix 中使用 npm_package_version 变量: 安装 run-script-os 作为开发依赖项。然后在您的package.json 中可以使用该变量:

      "scripts": {
          ...
          "postversion": "yarn postversion-wrapper",
          "postversion-wrapper": "run-script-os",
          "postversion-wrapper:windows": "echo %npm_package_version%",
          "postversion-wrapper:nix": "echo $npm_package_version"
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        • 2019-11-04
        • 2011-02-09
        • 2018-12-21
        • 1970-01-01
        • 2016-03-05
        相关资源
        最近更新 更多