无法将“ $ npm_execpath”识别为内部或外部命令,程序或可执行批处理文件

时间:2018-12-21 10:45:51

标签: reactjs npm yarnpkg package.json npm-scripts

标题是发生的错误。我在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.Hc2.UI.MockServer/server.js",
    "build:dev": "npm run build:standalone:dev && npm run build:module:dev"
  },

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

yarn build / npm run build

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

  

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

希望您能帮助我。预先感谢。

1 个答案:

答案 0 :(得分:0)

引用环境变量:

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

  • *nix操作系统(例如macOS和Linux)上,使用美元符号前缀对其进行引用。例如:

    $npm_execpath
    ^
    
  • 在Windows上,在两侧均使用百分号对其进行引用。例如:

    %npm_execpath%
    ^            ^
    

检查环境变量是否存在

首先,通过将新脚本临时添加到 package.json npm_execpath部分,检查scripts变量是否存在。让我们将脚本命名为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变量,则应该看到打印到控制台的路径。例如,在运行npm run test-var的macOS上,将显示以下内容:

  

/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操作系统。

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

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

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