近日,一则关于“YARN is used on expo.dev build and fails”的技术问题在开发者社区引发广泛讨论。作为前端开发领域常用的包管理工具,YARN 在跨平台应用开发框架 Expo 的构建过程中“水土不服”,导致不少开发者在 CI/CD 流水线或本地构建时频频碰壁。本次事件不仅暴露出工具链间的兼容性隐患,也再次敲响了技术选型与环境配置的警钟。

事件回顾:构建失败成“拦路虎”

据了解,多位开发者在尝试通过 Expo 官方构建服务 expo.dev 打包应用时,当项目使用的包管理器为 YARN(尤其是 Yarn Berry 及较新版本),构建流程会在中途抛出异常,提示“YARN is used”并直接中断。这一错误出现得毫无征兆,让不少依赖 Expo 快速开发跨平台应用(包括 iOS、Android 及 Web 端)的团队措手不及。

有开发者反映,项目本身在本地开发环境一切正常,一旦使用 Expo 原生构建服务(EAS Build)进行远程打包,就立即“卡壳”。更令人困惑的是,即使是严格按照官方文档配置了 YARN 环境变量,问题依然存在。

技术解析:根源出在哪里?

经过社区技术人员的初步排查,问题核心指向 Expo 构建服务对 YARN(特别是 v2 以上版本)的支持尚未完善。Expo 底层构建流程默认依赖 npm 的某些特性,而 YARN(尤其是采用 PnP 模式)对依赖的解析与安装机制与 npm 存在显著差异。

具体来说,YARN Berry(v2+)默认启用了“即插即用”(Plug‘n’Play,PnP)功能,不再生成传统的 node_modules 文件夹,而是通过 .pnp.cjs 文件来解析依赖位置。这一创新虽然极大提升了安装速度和磁盘性能,但却与 Expo 构建工具链中基于 node_modules 路径查找依赖的逻辑产生了冲突。

此外,Expo 的内置脚本及部分原生模块钩子仍在使用 npm 指令进行依赖校验或后续操作。当检测到项目使用 YARN 时,部分旧版构建镜像无法正确适配,导致流程“死锁”。问题并非永久的“硬伤”,而在版本适配的时间差上。

影响范围:从个人到团队的多米诺骨牌

此次故障波及面甚广。对于独立开发者而言,一次简单的 expo build:androidexpo build:ios 命令,可能就要耗费数十分钟等待构建结果,最终等来的却是红色报错。对于中等规模的开发团队,CI/CD 流水线因此中断,影响版本发布节奏。有团队反馈,他们在升级至 Expo SDK 50 后,为了兼容新版特性将包管理器从 npm 切换为 YARN Berry,结果构建频频失败,周末紧急上线的版本被迫回退。

受影响的项目大多具备以下特征:使用 YARN v2/v3/v4 作为包管理器;配置了 PnP 模式(默认或手动开启);未显式在项目根目录设置 enableScripts: false 或进行其他兼容性调整。

解决方案与最佳实践:给开发者的三条建议

面对这一棘手问题,Expo 官方与社区已紧急响应。以下为当前可行的解决路径:

  1. 临时降级方案:将项目包管理器回退至 npm 或 YARN Classic(v1.x)。对于 YARN v2+ 用户,可在项目 .yarnrc.yml 中强制使用 nodeLinker: node-modules 模式,禁用 PnP,从而让 node_modules 重新回归。这虽非最佳实践,但能快速解决构建阻塞。

  2. 环境配置核查:在 Expo 项目的 eas.json 文件中,检查 build 配置块下的 nodeyarn 版本设置。确保指定了项目中实际使用的版本号。部分老版本构建镜像(如 default)对新版 YARN 支持欠佳,可考虑升级镜像版本。

  3. 使用官方推荐工具:Expo 官方目前更倾向推荐使用 npm 或 pnpm 进行构建。如果团队对 YARN 有强依赖性,建议在项目初始化前使用 npx create-expo-app 时,观察终端提示的包管理器检测逻辑,手动选择最稳定的选项。

行业深思:工具生态的脆弱与韧性

此次事件并非孤例。在开发生态系统中,工具链的“排列组合”往往伴随着冲突隐患。YARN 在 Expo 构建场景中的失败,本质上是一种“适配滞后”——创新特性与主流基础设施的磨合周期被高估。但也不应因噎废食。YARN Berry 带来的性能提升自有其价值,Expo 作为跨平台开发的引擎也在持续迭代。

开发者社区已经有人在 GitHub 相关 issue 下贴出了初步的 pull request,Expo 团队也明确表示正在修复此兼容性问题。预计在后续的 SDK 小版本更新中,对 YARN 的全面支持将得到补全。

结语

每一次“构建失败”背后,都是一次技术决策的复盘。对于开发者而言,这次事件提醒我们:敏捷与稳定之间需要平衡。选用前沿工具为效率加油的同时,也应在 CI/CD 流程中预留“兼容性缓冲区”——比如在主要构建管道之外设置次要的验证环境,提前暴露潜在冲突。否则,创新的代价可能就是一次猝不及防的“一夜回退”。