Windows10执行firebase deploy部署Functions报ENOENT预部署错误如何解决
问题成因
- Windows 环境下的进程调用逻辑错误:Firebase CLI 执行predeploy钩子时,会通过
spawn系统调用启动子进程,对应配置中把npm --prefix "xxx" run lint整段作为单个命令传入,CLI没有将可执行文件npm和后续参数拆分,系统会尝试查找名称为整段命令的可执行文件,自然找不到就抛出ENOENT错误。 - npm 可执行文件识别问题:Windows 下 npm 的实际可执行文件后缀是
.cmd,如果没有显式写后缀,部分环境下spawn调用无法正确识别npm命令。 - 变量语法不兼容终端:配置中用的
%RESOURCE_DIR%是CMD终端的变量写法,如果使用的是PowerShell终端,该变量无法被正确解析,会导致路径拼接错误。 - lint脚本缺失:如果
functions目录下的package.json中没有定义lint对应的脚本命令,即使路径正确也会执行失败返回非0退出码。
修复方案
- 优先修改
firebase.json中的predeploy配置,显式指定npm.cmd,适配Windows环境:
{ "firestore": { "rules": "firestore.rules", "indexes": "firestore.indexes.json" }, "functions": { "predeploy": [ "npm.cmd --prefix \"%RESOURCE_DIR%\" run lint" ] } }
- 如果使用PowerShell终端,把变量替换为PowerShell语法:
"npm.cmd --prefix \"$env:RESOURCE_DIR\" run lint" - 如果不需要部署前执行lint检查,可以直接删除整个
predeploy配置项,跳过该步骤即可正常部署。 - 检查
functions目录下的package.json,确认scripts字段中存在lint命令的定义,不存在的话可以自行添加或者删除predeploy配置。
原始报错信息
code: 'ENOENT', errno: 'ENOENT', syscall: 'spawn npm --prefix "D:\Project\Web\functions" run lint', path: 'npm --prefix "D:\Project\Web\functions" run lint', spawnargs: [] } Error: functions predeploy error: Command terminated with non-zero exit code1
报错截图

内容的提问来源于stack exchange,提问作者Taha Sami
相关产品推荐
相关产品推荐

