Windows环境下package.json脚本中mkdir -p命令无法执行的问题
解决Windows环境下npm脚本执行
mkdir -p报错的问题 这个问题我之前在项目里也碰到过,你操作本身没出错,核心原因是npm在Windows环境下默认会调用系统自带的cmd.exe来执行脚本命令,而不是你当前打开的git-bash或Cygwin终端。
为什么会出现这个矛盾?
你在git-bash里手动输入mkdir -p distrib/images能正常运行,是因为此时是bash环境在解析命令,它支持-p参数递归创建目录;但npm执行脚本时,并不会自动切换到bash环境,而是用Windows原生的cmd来处理,而cmd的mkdir命令不支持-p参数(它的递归参数是/p,但用法和bash的-p也不完全一致),所以就会报「命令语法错误」。
几个可行的解决方案:
1. 强制npm用bash执行脚本
在脚本命令前加上bash -c,让npm调用bash来解析命令,这样就能正常识别-p参数了:
"scripts": { "create-images-dir": "bash -c 'mkdir -p distrib/images'" }
2. 使用跨平台的目录创建工具(推荐)
安装专门的跨平台包mkdirp,它能在所有系统下统一处理递归创建目录的需求,不用考虑环境差异:
首先安装依赖:
npm install mkdirp --save-dev
然后修改脚本:
"scripts": { "create-images-dir": "mkdirp distrib/images" }
3. 用Windows原生命令写法(不推荐,灵活性差)
如果不想额外安装包,可以用cmd的语法来实现递归创建,但写法比较繁琐,而且只能针对固定路径:
"scripts": { "create-images-dir": "if not exist distrib mkdir distrib && if not exist distrib\\images mkdir distrib\\images" }
总结
最稳妥的方式是用第二种跨平台工具的方案,能避免不同系统环境下的命令差异问题;如果只想依赖bash环境,第一种方案也能解决你的问题。
内容的提问来源于stack exchange,提问作者Vasiliy
相关产品推荐
相关产品推荐

