Azure Web Apps中调用项目依赖的npm/yarn脚本提示程序未找到的原因咨询
这个问题我之前也碰到过,核心原因其实出在GitHub Actions构建到Azure部署的文件完整性上,和你设置的SCM_DO_BUILD_DURING_DEPLOYMENT=false没有直接关联——这个配置只是阻止Oryx在Azure端重新构建,不会影响你上传文件的内容。
具体到你遇到的cross-env找不到的错误,本质是node_modules/.bin/cross-env这个符号链接指向的目标文件在Azure容器中不存在,主要有以下几种可能的诱因:
依赖包目录未完整部署:如果你的GitHub Actions工作流中,部署前有文件复制/打包操作(比如只复制构建产物而漏掉了
node_modules下的完整依赖包目录),就会出现这种情况。node_modules/.bin里的可执行文件都是符号链接,它们指向对应依赖包内部的脚本文件(比如cross-env的链接指向../cross-env/src/bin/cross-env.js),如果node_modules/cross-env目录没有被完整上传到Azure,自然找不到目标文件。生产环境依赖清理误删了必要包:如果你的构建脚本中执行了
npm prune --production或者yarn install --production这类命令,而cross-env被你标记在了devDependencies里,那么它会被从node_modules中移除,但node_modules/.bin里的符号链接可能还残留着,导致运行时找不到对应的脚本。部署工具的符号链接处理问题:有些部署工具在传输文件时,无法正确保留符号链接的指向关系——比如把符号链接当成普通文本文件复制,或者在跨环境传输时破坏了相对路径的指向,导致Azure容器里的符号链接指向了不存在的路径。
你最后改用Azure预装的pm2直接启动服务能解决问题,本质是绕开了通过node_modules/.bin中的符号链接调用依赖程序的环节,自然不会触发路径指向错误的问题。
内容的提问来源于stack exchange,提问作者janluke

