Windows环境下npm 6正常运行的script在npm 7中执行失败原因问询
npm 6 与 npm 7 脚本兼容性问题原因说明
核心改动点
- npm 6的执行逻辑:Windows环境下执行npm scripts时,npm 6内置了跨平台路径适配逻辑,遇到
./node_modules/.bin/xxx这类Unix风格的相对路径命令时,会自动转换为Windows兼容的路径格式,同时优先调用.cmd后缀的Windows批处理可执行文件,所以你最初的脚本可以正常运行。 - npm 7的执行逻辑变更:npm 7重构了脚本执行内核,移除了Windows下的自动路径适配特性,严格遵循当前系统shell的语法规则。Windows默认的cmd/PowerShell无法识别
./开头的Unix风格相对路径,会把路径开头的.识别为独立命令,因此抛出'.' 不是内部或外部命令的报错。
加node前缀报错的原因
node_modules/.bin目录下不带后缀的json-server是Unix系统专用的shell脚本,不是JavaScript文件。你添加node前缀后,node会直接把shell脚本的内容当成JS代码解析,自然会触发语法错误。
简化脚本可正常运行的原因
无论是npm 6还是npm 7,执行scripts时都会自动把当前项目的./node_modules/.bin目录加入执行环境的PATH变量中,直接写json-server data.json时,系统会自动在PATH目录中匹配对应可执行文件,Windows环境下会优先找到适配Windows的json-server.cmd批处理文件,因此可以正常运行。
内容的提问来源于stack exchange,提问作者Iosif Bujor
相关产品推荐
相关产品推荐

