“$npm_execpath”未被识别为内部或外部命令、程序或可执行批处理文件
Posted
技术标签:
【中文标题】“$npm_execpath”未被识别为内部或外部命令、程序或可执行批处理文件【英文标题】:"$npm_execpath" isn't recognized as an internal or external command, program, or executable batch file 【发布时间】:2019-05-21 20:16:13 【问题描述】:标题是正在发生的错误。我在 package.json 中创建脚本,但我想动态使用 npm
或 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"
,
我正在尝试按如下方式运行“构建”脚本:
yarn build / npm run build
但在每个都显示错误:
我希望你能帮助我。提前致谢。
【问题讨论】:
【参考方案1】:引用环境变量:
每个操作系统使用不同的语法引用环境变量:
在*nix 操作系统(例如 macOS 和 Linux)上,它们使用美元符号前缀来引用。例如:
$npm_execpath
^
在 Windows 上,它们在两边都使用百分号来引用。例如:
%npm_execpath%
^ ^
检查环境变量是否存在
首先,通过临时将新脚本添加到 package.json 的 scripts
部分来检查 npm_execpath
变量是否存在。让我们将脚本命名为 test-var
并根据您运行的操作系统将其定义如下:
适用于 Windows (cmd)
如果您运行的是 Windows,请按如下方式定义脚本:
"scripts":
"test-var": "echo %npm_execpath%",
...
对于 macOS/Linux (bash)
如果您运行的是 macOS/Linux(即 bash),则按如下方式定义脚本:
"scripts":
"test-var": "echo $npm_execpath",
...
然后通过运行以下命令调用脚本:npm run test-var
和 yarn 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。
解决方案:
对于 macOS/Linux (bash)
按照您目前的做法使用$npm_execpath
变量。
对于 Windows (cmd)
将所有脚本中$npm_execpath
的所有个实例替换为:
node \"%npm_execpath%\"
例如,您当前名为 typecheck:watch
的脚本将被重新定义为:
"scripts":
"typecheck:watch": "node \"%npm_execpath%\" run typecheck -- --watch",
...
在上面的例子中,我们明确地利用 nodejs 来调用npm_execpath
变量。我们还将npm_execpath
变量放在百分号之间(即%...%
),并将它们也包裹在JSON 转义双引号中(即\"...\"
)。
跨平台
必须为每个操作系统使用不同的语法来引用变量并不理想,特别是如果您希望同时支持 Windows 和 *nix 操作系统。
对于跨平台工作的单一语法(Windows、macOS、Linux),我建议安装和使用yarpm。在这种情况下,将 all 脚本中 $npm_execpath
的 all 个实例替换为 yarpm
。
例如,您当前名为 typecheck:watch
的脚本将被重新定义为:
"scripts":
"typecheck:watch": "yarpm run typecheck -- --watch",
...
【讨论】:
非常感谢@RobC!那太棒了!我没有意识到,但我在 Windows 中使用了 Linux 环境变量:S 哈哈哈以上是关于“$npm_execpath”未被识别为内部或外部命令、程序或可执行批处理文件的主要内容,如果未能解决你的问题,请参考以下文章