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

fra*_*ana 3 npm reactjs package.json npm-scripts yarnpkg

标题是发生的错误。我在 package.json 中创建脚本,但我想动态使用npmor yarn。我读过可以使用名为“$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"
  },
Run Code Online (Sandbox Code Playgroud)

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

yarn build / npm run build

但在每个都显示错误:

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

我希望你可以帮助我。提前致谢。

Rob*_*obC 8

引用环境变量:

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


检查环境变量是否存在

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

  1. 对于 Windows(cmd)

    如果您运行的是 Windows,请按如下方式定义脚本:

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

    如果您运行的是 macOS/Linux(即 bash),则按如下方式定义脚本:

    "scripts": {
      "test-var": "echo $npm_execpath",
      ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

然后通过运行以下命令来调用脚本: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%\"
    
    Run Code Online (Sandbox Code Playgroud)

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

    "scripts": {
      "typecheck:watch": "node \"%npm_execpath%\" run typecheck -- --watch",
      ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 跨平台

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

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

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

    "scripts": {
      "typecheck:watch": "yarpm run typecheck -- --watch",
      ...
    }
    
    Run Code Online (Sandbox Code Playgroud)