Azure App Service部署报错“Unexpected End of File”,请求协助定位问题
你好,我仔细看了你的部署日志和问题描述,已经尝试了回滚代码、重新安装依赖、新建部署槽这些常规操作都没解决,而且本地构建完全正常,确实挺头疼的。从日志里能找到几个关键线索,咱们一步步来定位问题:
先看日志里的核心异常诱因
首先注意到日志里反复出现:
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to Windows directory.
这说明Azure部署过程中用CMD执行脚本时,因为工作目录是UNC路径导致了异常,后续的ng build命令被默认切换到Windows目录执行,自然找不到你的项目文件,这大概率是触发“Unexpected end of file”的根源。另外还有几个潜在问题:
- npm版本不兼容:你的
package-lock.json是lockfileVersion@2,但Azure上用的npm 6.13.4只支持lockfileVersion@1,会导致依赖安装异常 - Node版本不一致:日志里提示脚本用的node是10.6.0,但npm用的是10.19.0,路径冲突可能影响构建
具体排查和解决步骤
1. 解决UNC路径问题,让构建在正确的目录执行
你可以尝试在package.json的build脚本里加上--scripts-prepend-node-path参数,解决Node路径不一致的问题,同时确保脚本在项目目录执行:
修改package.json里的build命令:
"build": "ng build --prod --configuration dev --buildOptimizer=false --scripts-prepend-node-path"
或者,在Azure App Service的配置中,添加应用设置WEBSITE_RUN_FROM_PACKAGE并设置为1,这个设置会让App Service从本地包运行,避免UNC路径的问题。
2. 修复package-lock.json版本兼容问题
因为Azure上的npm 6.x不支持lockfileVersion@2,你可以:
- 本地用npm 6.x重新生成
package-lock.json:先降级本地npm到6.x(npm install -g npm@6),然后删除原有的package-lock.json和node_modules,重新执行npm install,再提交新的lock文件 - 或者升级Azure上的Node版本:在
package.json里指定更高的Node版本(比如14.x,支持lockfileVersion@2),Azure会自动使用对应版本的npm:
"engines": { "node": "14.x", "npm": "6.x" }
3. 手动执行构建,定位具体出错文件
登录到你的App Service的Kudu控制台,进入Debug console -> PowerShell,切换到你的项目目录(D:\home\site\wwwroot),然后手动执行构建命令:
ng build --prod --configuration dev --buildOptimizer=false
这里会输出更详细的错误信息,直接指出哪个文件导致了“Unexpected end of file”,比如可能是某个JSON文件(比如angular.json、环境配置文件)有语法错误,或者某个文件在Git推送时被截断了。
4. 处理phantomjs-prebuilt的安装异常
日志里phantomjs-prebuilt在UNC路径下安装失败,虽然是可选依赖,但可能干扰后续构建。你可以:
- 在
package.json里把它标记为可选依赖,或者直接移除(如果项目不需要的话) - 换成更兼容的替代方案,比如puppeteer
额外检查点
- 验证
angular.json的JSON格式:你附上的配置看起来没问题,但可以用在线JSON验证工具检查有没有语法错误 - 检查Git仓库里的文件:确认所有项目文件都完整推送,没有因为大小限制或特殊字符导致截断
备注:内容来源于stack exchange,提问作者Kron

