expo个人开发的GitHub和Eas发布流程
背景
- 国内的网络环境还是什么原因,导致2025年7月起,Eas的打包命令严重问题,没有一次成功。即使开无双,也会在访问Google服务的一瞬间出错。自2025年7月2X日起,我expo.dev的dashboard就没有更新信息了。
- 本地打包仍然可用,但容易卡死,反复无数次才能成功。本地缓存问题?以前没有这么难,奇怪了。本地打包实在太慢,特别是iOS。
- Github在开无双时还算基本可以用。
- 我日常代码管理非常简单:Github的private项目,只有一个main分支,commit后push就完了,即使对个人开发也比较简单粗暴。
- App项目大版本升级时,会新建一个repo,其他时候都是同一个repo。因为我的本地开发,在大版本升级时,会从头新建项目。
目标
打造一个日常GitHub管理代码的流程,稍微规范点,日常还是在main分支开发,打包发布前单开一个branch,主要用于触发Eas服务。 通过GitHub和Expo官方Eas服务联 动,触发打包,高效快速(至少iOS比本地块多了)。
| 需求 | 实现方式 |
|---|---|
日常开发就在 main 分支上 | 继续直接用 main 写代码,无需每次都建分支 |
| 需要远程构建时触发 PR + Expo 构建 | 快速从 main 创建一个构建分支,发 PR,贴 Label,完成后自动删除 |
准备
-
项目push到Github Github新建项目和本地同步的方法,这里就略过,之后单开。 注意要Private,并配置好本地
.gitignore文件。 -
初始化项目的Eas服务
# 确保已登录
eas login
# 只需运行一次(确保会提示生成 projectId 和上传签名材料)
eas build --platform android --non-interactive
eas build --platform ios --non-interactive
如果这一步也出问题就麻烦了,我这个项目是7月初执行的这一步,当时似乎还好。 这时一定要保证有好的网络条件。 执行完后,到expo.dev检查面板,如果有项目名称则ok。
Terminal中,在项目目录执行:
# 初始化项目的eas配置
eas config
这下生成了基本的eas.json
- 定义打包的profiles 在eas.json中配置自己的profile,当然可以用原来的profile如production改,但我建议不要影响原有的,为GitHub触发模式专门准备,和其他(如本地)的profile分开。 我的如下:
{
...
"build": {
"prod_android": {
"extends": "production",
"android": { "image": "latest" }
},
"prod_ios": {
"extends": "production",
"ios": { "image": "latest" }
},
"prod_all": { // 这个基本不用
"extends": "production",
"android": { "image": "latest" },
"ios": { "image": "latest" }
}
}
}
android和iOS分开最好,默认使用最新构建镜像(Expo 官方推荐)。
- Expo配置GitHub连接 登录 expo.dev → Project Settings → GitHub → Connect GitHub 仓库(只授予该 app 仓库访问)docs.expo.devdocs.expo.dev; 在 “Build triggers” 配置中:
- 例如
main分支推送触发打包prod_all; - 也可以设置 PR label 触发 —— PR 中添加 label 如
eas-build-android:prod_android即可打 Android; - 支持平台选择:
eas-build-ios:prod_ios或eas-build-all:prod_all; - 触发方式灵活多样:通过网页 “Build from GitHub” → 选择分支/平台,或给 PR 打 label,操作简单,不需要 CI 文件。 此方案完全不影响本地已有打包方式,无侵入,只需项目和 expo.dev 后台关联。
我选择了PR label触发,相对平衡一点。 这一步注意,代码根目录要正确,默认就是"/"。
当然Expo 还提供
.eas/workflows/*.yml原生工作流方式,直接运行在 expo.dev,而无需 GitHub Action。 问题是你Expo的网络上传有问题啊!😓
日常
✅ Step 1:日常开发保持在 main
继续在 main 分支做日常开发、调试、测试,无需变动流程。
# 有人推荐git checkout main,也行
git switch main
# 编辑代码...
git commit -am "修复组件显示 bug"
git push origin main
✅ Step 2:需要构建时,创建一个构建专用分支
你只在需要构建的时候,从当前的 main 快速拉个构建用分支(不做额外开发):
git checkout -b build/eas-android-20250803
git push origin build/eas-android-20250803
📌 命名建议:
build/eas-平台-日期,比如build/eas-android-20250803
✅ Step 3:GitHub 上发起 PR(无需修改任何代码)
-
在新建的build分支下,修改一点内容,然后commit/push,以触发下面动作。
-
打开 GitHub,进入pull requests,页面会自动提示你:
Compare & pull request
-
点击提示按钮,进入 PR 页面。
-
在右侧添加 Label,例如:
eas-build-android:prod_android
注意名称和expo规范的及eas.json的profile一致。
- 不需要写代码 diff,不需要添加 Reviewer,你自己点就好。
✅ Step 4:Expo GitHub App 识别 Label 并构建
-
构建过程会在 PR → Checks 里展示;
-
Expo Dashboard 会显示构建进度和下载链接;
-
你可以继续用电脑干别的事,等它构建完成。
✅ Step 5:构建完成后,合并 PR 并清理分支
如果你希望主分支也保留这次构建记录,可在 GitHub PR 页面点击 “Merge Pull Request”。 然后回到本地。
git switch main
# 拉一下保证一致性
git pull origin main
# 可以删除这个临时分支了
git branch -d build/eas-android-20250803
git push origin --delete build/eas-android-20250803
也可以 不合并,直接关闭 PR 然后删除分支也没关系 —— 因为你本来就在 main 写代码,构建用 PR 只是工具人 😎。
✅ Step 6:补充:构建不成功,要少量修改再反复提交时
第4步中,如果Eas build不成功,还要少量修改再提交。
- 不要进入第5步。
- 确保你的开发环境还在新的build分支。
- 修改代码等等,commit/push本分支,Github端啥都别动,提交代码会自动触发Eas服务再次build。
- 如果build成功了,进Step 5,否则重复修改。
不管最后如何,你的build分支可能修改了不少东西(热修),记得清除前Merge到main(如有必要)。
git switch main
# 拉一下保证一致性
git pull origin main
# 把 build 上的热修拿回来
git merge build/eas-android-20250803
git push origin main
当然如果是发现了大问题要修改,就不是热修了,最好回到main分支修改。
其他
switch和checkout的区别
来自kimi
git switch 和 git checkout 都能用来“切换分支”,但它们的设计目的不同,switch 是 Git 2.23 起新增的“专门用来切换分支的命令”,而 checkout 是一个“瑞士军刀”式命令,功能更杂。
✅ 1. 语法对比
表格
复制
| 目的 | 推荐命令(Git ≥ 2.23) | 旧命令(仍然可用) |
|---|---|---|
| 切换分支 | git switch <branch> | git checkout <branch> |
| 创建并切换分支 | git switch -c <branch> | git checkout -b <branch> |
| 放弃工作区修改 | git restore <file> | git checkout -- <file> |
| 切换到某次提交 | git switch --detach <commit> | git checkout <commit> |
✅ 2. 为什么要用 switch?
-
语义更清晰:
switch只做“切换分支”,不会误操作文件(checkout既能切换分支又能恢复文件,容易混淆)。 -
更安全:
git switch默认拒绝覆盖未提交的修改,除非你显式加--force。 -
未来趋势:
Git 官方文档推荐用switch/restore取代checkout的“分支切换”和“文件恢复”功能。
✅ 3. 什么时候还会用 checkout?
-
老脚本、老教程里大量存在。
-
需要“检出单个文件”到工作区:
bash
复制
git checkout HEAD~2 -- path/to/file(
switch不支持恢复单个文件,要用git restore)
✅ 总结一句话
切换分支用
switch,恢复文件用restore,checkout仍能工作,但不再是首选。