命令行工具
expo/eas-cli avatar
expo/eas-cli

EAS CLI 评测:从命令行把 Expo 应用送到应用商店的完整路径

构建、提交和更新 iOS 和 Android 应用程序的最快方式。

1,355 个 Star236 个 ForkTypeScriptMIT

秒懂

它是什么?
EAS CLI 是 Expo 官方推出的命令行工具,覆盖云构建、商店提交、OTA 更新和 CI/CD 自动化。本文基于其 README 与仓库结构,分析它的实际工作方式、上手成本与适用边界。
适合谁用?
EAS CLI 适合已经使用 Expo 或 React Native 的团队,尤其是那些不想自己维护 iOS 证书签名、Android keystore 和商店上传流程的开发者。它把构建、提交、更新和部署串成一条命令链,省去大量脚本胶水。
能商用吗?
可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库在最近一天内有新的提交。
用什么语言写的?
主要是 TypeScript(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决的是发布流程的碎片化问题

移动应用发布从来不是一条命令的事。你要在本地配置 Android SDK 和 Xcode,管理签名证书,处理 Google Play 和 App Store 的上传格式差异,还要在每次发版时重复这些步骤。EAS CLI 把这一串操作压缩成 eas build 和 eas submit。它面向的是使用 Expo 或 React Native 的开发者,尤其是那些不想成为原生构建环境专家的团队。README 明确说这是从源代码到生产的终端原生路径,编译签名二进制、提交商店、推送 OTA 更新都能在同一工具里完成。这不是一个通用构建工具,它绑定在 Expo 的云服务上,所以它的价值前提是你接受云构建。

云构建、提交、更新:三条命令背后的机制

EAS CLI 的核心是三个子命令。eas build 把项目源码上传到 Expo 的云服务器,在那里完成原生编译和签名,返回可安装的二进制。eas submit 拿到这些构建产物,直接上传到 Google Play 和 App Store Connect。eas update 则走另一条路,它推送 JavaScript 和资源更新,用户下次启动时通过分支和频道机制获取新版本。这三个命令共享同一套登录和项目关联机制,eas init 会创建项目配置,后续命令都基于这个配置工作。值得注意的是,update 不经过应用商店审核,这是它和 build 的本质区别,也是它能快速修复线上问题的原因。

从安装到第一次构建:真实命令序列

上手路径在 README 里写得很直白。全局安装 eas-cli,登录 Expo 账号,然后初始化项目。命令如下:npm install --global eas-cli,eas login,eas init。之后就能运行 eas build --platform all 来构建 Android 和 iOS 二进制,eas submit --platform all 提交商店,eas update --branch production --message "Fix checkout crash" 推送更新。如果不想全局安装,可以用 npx eas-cli@latest 代替,每条命令都支持。版本策略也值得注意,README 明确反对把 eas-cli 装进项目依赖,理由是容易产生难以调试的依赖冲突。如果你想锁定版本,需要在 eas.json 里设置 cli.version 字段,例如 ">=21.0.0"。这种设计把 CLI 当作独立工具,而不是项目依赖,降低了升级时的耦合风险。

命令覆盖面:不只是构建和提交

命令列表显示这已经是一个庞大的工具集。除了 build、submit、update,还有 account、billing、branch、channel、credentials、device、env、metadata 等子命令。eas credentials 管理签名证书,eas device 管理 Apple 设备,eas env 管理环境变量,eas channel 管理更新频道。README 还提到 eas workflow,它允许在 .eas/workflows 目录下定义 CI/CD 任务,把构建、测试、提交、更新和部署串成自动化流程。eas metadata:push 则把应用商店的元数据维护也搬到了命令行,目前是预览状态。这种广度意味着 EAS CLI 不只是构建工具,它试图成为整个发布生命周期的控制台。但广度也带来学习成本,新用户需要理解分支、频道、运行时版本这些概念才能用好 update 功能。

一个明显的限制:强绑定云服务

EAS CLI 的所有核心功能都依赖 Expo 的云端基础设施。build 需要上传源码到云,submit 需要云端的构建产物,update 需要 Expo 的推送服务。这意味着没有网络或无法访问 Expo 服务时,这些命令都无法工作。对于有严格数据合规要求的企业,把源代码上传到第三方云可能是个问题。另外,构建环境是 Expo 托管的,你无法完全控制底层系统,虽然 eas build:run 可以在本地模拟构建,但那是调试工具,不是替代方案。还有一个实际限制是版本策略,README 强烈建议全局安装,这在多项目环境中可能导致不同项目使用不同版本的 CLI,虽然 eas.json 的 cli.version 可以检查,但并不能自动切换版本,只是给出警告。

替代方案:本地构建与自建 CI 对比

最直接的替代是放弃云构建,用本地工具链。Android 可以用 Gradle 直接打包,iOS 用 Xcode 的 xcodebuild,然后通过 fastlane 或自写脚本上传商店。这种方式给你完全的控制权,没有云依赖,但代价是你必须自己维护签名证书、处理不同平台的构建差异,还要写 CI 脚本。另一个替代是 GitHub Actions 加 fastlane,很多 React Native 项目采用这种组合。与 EAS CLI 相比,它的区别在于构建发生在你自己的 runner 上,而不是 Expo 的云,因此你可以安装任意依赖、使用自定义镜像。但你需要自己处理密钥管理和上传逻辑。EAS CLI 的优势是这些逻辑已经内置,劣势是你被锁定在 Expo 的生态里。如果你已经深度使用 Expo,这种锁定可能不是问题,但如果你只是用 React Native 而不用 Expo 的其他服务,那就需要权衡。

维护与升级成本:版本更新频繁,但策略明确

从仓库的最近发布记录看,v22.6.0、v22.2.0、v22.0.0 在不到两周内连续发布,说明迭代速度很快。这对使用者意味着需要频繁更新 CLI 以获取新功能和修复。README 给出的策略是全局安装或使用 npx,这样每次运行都是最新版,避免了项目依赖的冲突。但这种策略也有代价,你无法轻易回滚到旧版本,如果新版本引入了破坏性变更,可能会影响你的 CI 流程。eas.json 中的 cli.version 字段可以设置版本范围,但它的作用更像是检查而不是强制,具体行为需要查阅文档确认。许可证是 MIT,这意味着你可以自由修改和分发 CLI 本身,但注意 EAS 服务端是闭源的,你修改 CLI 并不能改变服务端的逻辑。

编辑结论

EAS CLI 适合已经使用 Expo 或 React Native 的团队,尤其是那些不想自己维护 iOS 证书签名、Android keystore 和商店上传流程的开发者。它把构建、提交、更新和部署串成一条命令链,省去大量脚本胶水。但如果你需要完全离线构建、自定义 CI 管道深度控制,或者对云服务有合规要求,它就不是合适选择,因为构建和提交都依赖 Expo 的云端服务。采用前应验证三件事:确认你的项目能否使用 EAS Build 的云环境(特别是原生模块和自定义配置),检查 eas.json 中 cli.version 约束是否符合你的版本管理策略,以及评估 EAS 的计费模式是否在你的预算内。EAS CLI 的 MIT 许可让你可以自由修改和分发 CLI 本身,但服务端仍是闭源的,这一点在选型时要有数。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社区笔记

社区笔记