首页 > 解决方案 > "$npm_execpath" 未被识别为内部或外部命令、程序或可执行批处理文件

问题描述

标题是正在发生的错误。我在我的 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" 未被识别为内部或外部命令、程序或可执行批处理文件

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

标签: reactjsnpmyarnpkgpackage.jsonnpm-scripts

解决方案


引用环境变量:

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

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

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

    %npm_execpath%
    ^            ^
    

检查环境变量是否存在

首先,npm_execpath通过临时将新脚本添加到package.jsonscripts的部分来检查变量是否存在。让我们命名脚本并根据您正在运行的操作系统将其定义如下:test-var

  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 和/或 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. 跨平台

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

    对于跨平台( WindowsmacOSLinux )工作的单一语法,我建议安装和使用yarpm。在这种情况下,将所有脚本中的所有实例替换为.$npm_execpathyarpm

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

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

推荐阅读