React Native项目package.json中ci脚本执行报错排查请求
排查React Native项目CI脚本执行错误的问题
我来帮你拆解这个CI脚本的问题和错误原因:
一、CI脚本本身的逻辑缺陷
你的ci脚本有两处明显的问题:
mv命令的逻辑错误:mv ./report/* ./report/unit.xml这个操作逻辑有误——如果report目录下有多个文件,mv无法把多个源文件移动到一个目标文件中(只有目标是目录时才能批量移动);如果是单个文件,这个命令是重命名,但脚本不管测试结果如何都强行执行该操作,完全忽略了报告是否生成的情况。- 冗余的执行逻辑:
((start-server-and-test ... && mv ...) || mv ...)的写法完全多余,本质上不管前序步骤成功还是失败,都会尝试执行mv操作,这就导致即使测试没运行、报告没生成,也会触发mv的找不到文件错误。
二、错误出现的具体原因
1. Node.js版本与依赖包不兼容导致TypeError
第一个报错TypeError [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type function,根源是你使用的Node.js版本(看起来是v8.x或更早)和start-server-and-test依赖的get-stream模块版本不兼容。老版本Node.js的util.promisify只接受回调风格的函数作为参数,而新版本的get-stream或其依赖的execa模块调用promisify时传入了非函数值,直接触发了这个类型错误。
2. 报告文件未生成导致mv命令失败
第二个报错mv: cannot stat './report/*': No such file or directory,是因为前面的start-server-and-test因TypeError崩溃,导致nightwatch测试脚本根本没机会运行,自然不会生成报告文件。再加上脚本开头执行了rm -rf ./report/*清空了报告目录,mv命令找不到任何可操作的文件,所以抛出这个错误。
三、修复建议
- 升级Node.js版本:建议升级到Node.js v12.x及以上版本,解决
util.promisify的兼容性问题,让start-server-and-test能正常运行。 - 修正CI脚本逻辑:
- 先确保
report目录存在,避免rm和mv因目录不存在报错:添加mkdir -p ./report在rm之前。 - 调整
mv的逻辑,只在测试成功且报告生成时执行合理的文件操作(比如替换为nightwatch实际生成的报告文件名)。 - 简化脚本逻辑,去掉冗余的
|| mv操作,示例如下:"ci": "mkdir -p ./report && rm -rf ./report/* && start-server-and-test start http://localhost:8000 test && mv ./report/nightwatch-report.xml ./report/unit.xml"
- 先确保
内容的提问来源于stack exchange,提问作者Ashish Jindal
相关产品推荐
相关产品推荐

