如何让package.json中Jasmine本地测试脚本兼容macOS与Windows?
问题背景
我使用Jasmine测试套件运行测试,Mac环境下执行open SpecRunner.html可以正常启动测试页面,对应的package.json脚本配置如下:
"scripts": { "start": "npm install", "test:local": "open SpecRunner.html", "test:remote": "karma start" }
但在Windows机器上执行npm run test:local无法正常工作,Windows下的正确命令是start SpecRunner.html。之前得到的解决方案是拆分多个脚本实现跨平台,但我希望将命令合并为单个脚本。
单脚本跨平台解决方案
方案1:使用跨平台npm工具open-cli(推荐)
open-cli是专门用于跨平台打开文件、URL的npm包,完美支持Mac、Windows、Linux系统,无需自己编写复杂的条件判断。
- 安装依赖:
npm install open-cli --save-dev
- 修改package.json中的
test:local脚本:
"scripts": { "start": "npm install", "test:local": "open-cli SpecRunner.html", "test:remote": "karma start" }
这样不管在Mac还是Windows上执行npm run test:local,都能自动调用对应平台的打开命令启动SpecRunner.html。
方案2:纯Shell命令兼容(无需额外依赖)
如果不想安装第三方包,可以通过尝试执行不同平台命令的方式实现兼容,利用命令执行失败后自动尝试下一个命令的逻辑:
"scripts": { "start": "npm install", "test:local": "cmd /c start SpecRunner.html || open SpecRunner.html || xdg-open SpecRunner.html", "test:remote": "karma start" }
- Windows环境下,
cmd /c start SpecRunner.html会优先执行成功,打开测试页面 - Mac环境下,前面的Windows命令执行失败,会自动执行
open SpecRunner.html - Linux环境下,前两个命令失败后,会执行
xdg-open SpecRunner.html
这种方式无需额外依赖,且Windows用户即使使用Git Bash等类Unix终端,cmd /c start依然能正常触发Windows的打开行为,兼容性较好。
方案3:条件判断式Shell命令(需类Unix终端支持)
如果Windows用户使用Git Bash或WSL(支持uname命令),可以用条件判断实现:
"scripts": { "start": "npm install", "test:local": "if [ \"$(uname)\" = \"Darwin\" ]; then open SpecRunner.html; elif [ \"$(uname -s | cut -c1-5)\" = \"Linux\" ]; then xdg-open SpecRunner.html; else start SpecRunner.html; fi", "test:remote": "karma start" }
注意:这种方式在Windows原生CMD环境下会失效(CMD没有uname命令),仅适用于装有类Unix终端的Windows用户。
总结
优先推荐方案1,open-cli作为成熟的跨平台工具,兼容性和稳定性都有保障,且脚本代码简洁易维护;如果不想增加依赖,方案2的多命令尝试方式兼容性更广,适合大多数场景。
内容的提问来源于stack exchange,提问作者learyjk

