"$npm_execpath" 未被识别为内部或外部命令、程序或可执行批处理文件

"$npm_execpath" isn't recognized as an internal or external command, program, or executable batch file

标题是发生的错误。我在 package.json 中创建了脚本,但我想动态地使用 npmyarn。我读过可以为此使用名为“$npm_execpath”的环境变量,但它不适用于我的配置。这是 package.json 部分的示例:

  "scripts": {
    "start": "run-p start:jsonserver start:dev",
    "start:dev": "node --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js --config ./config/webpack/webpack.standalone.dev.js --open",
    "start:prod": "webpack-dev-server --config ./config/webpack/webpack.standalone.prod.js",
    "start:container": "webpack-dev-server --host 0.0.0.0 --port 4555",
    "start:jsonserver": "node ../Testing.GtP.UI.MockServer/server.js",
    "build:dev": "npm run build:standalone:dev && npm run build:module:dev"
  },

我正在尝试运行“构建”脚本如下:

yarn build / npm run build

但是在每一个都显示错误:

"$npm_execpath" isn't recognized as an internal or external command, program, or executable batch file

希望你能帮助我。提前致谢。

引用环境变量:

每个操作系统使用不同的语法引用环境变量:

  • *nix 操作系统上,例如 macOS 和 Linux,它们是使用美元符号前缀引用的。例如:

    $npm_execpath
    ^
    
  • 在 Windows 上,它们在两边都使用百分号引用。例如:

    %npm_execpath%
    ^            ^
    

检查环境变量是否存在

首先,通过在 package.jsonscripts 部分临时添加一个新脚本来检查 npm_execpath 变量是否存在。让我们将脚本命名为 test-var 并根据您 OS 运行:

对其进行如下定义
  1. 对于Windows (cmd)

    如果你是运行 Windows定义脚本如下:

    "scripts": {
      "test-var": "echo %npm_execpath%",
      ...
    }
    
  2. 对于macOS/Linux (bash)

    如果你是运行macOS/Linux(即bash)那么定义脚本如下:

    "scripts": {
      "test-var": "echo $npm_execpath",
      ...
    }
    

然后通过 运行 以下命令调用脚本:npm run test-varyarn test-var

如果 npm_execpath 变量存在,您应该会看到打印到控制台的路径。例如,在 macOS 运行 npm run test-var 上将打印如下内容:

/usr/local/lib/node_modules/npm/bin/npm-cli.js

在 windows 上,它将打印类似于以下内容的内容:

C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js

当运行 yarn test-var时也应该打印路径。但是,路径指向的文件将是对 yarn.js 的引用。例如,在 macOS 上它会打印这样的东西:

/Users/someone/.yarn/bin/yarn.js

注意: 如果在 运行 上面提到的命令时没有路径打印到你的控制台然后考虑重新安装 yarn and/or npm.


解决方案:

  1. 为macOS/Linux(bash)

    像您目前所做的那样利用 $npm_execpath 变量。

  2. 为Windows (cmd)

    所有脚本中$npm_execpath所有实例替换为:

    node \"%npm_execpath%\"
    

    例如,您当前名为 typecheck:watch 的脚本将被重新定义为:

    "scripts": {
      "typecheck:watch": "node \"%npm_execpath%\" run typecheck -- --watch",
      ...
    }
    

    在上面的示例中,我们显式地利用 nodejs 来调用 npm_execpath 变量。我们还将 npm_execpath 变量放在百分号之间(即 %...%),并将它们也包裹在 JSON 转义双引号中(即 \"...\")。

  3. 跨平台

    必须根据 OS 使用不同的语法来引用变量并不理想,特别是如果您想要同时支持 Windows 和 *nix 操作系统。

    适用于跨平台的单一语法 (Windows, macOS, Linux) 我建议安装和使用 yarpm。在这种情况下,将 all 脚本中 $npm_execpathall 实例替换为 yarpm.

    例如,您当前名为 typecheck:watch 的脚本将被重新定义为:

    "scripts": {
      "typecheck:watch": "yarpm run typecheck -- --watch",
      ...
    }