发布时间:2026/9/7 8:09:03
Expo 仓库的 Agent 开发工作流:et CLI、红绿测试与提交规范的完整实践 Expo 仓库的 Agent 开发工作流et CLI、红绿测试与提交规范的完整实践【免费下载链接】expoAn open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web.项目地址: https://gitcode.com/GitHub_Trending/ex/expo本文基于 Expo 仓库中的 Agent 指令文档 .claude/CLAUDE.md 展开完整还原在该 monorepo 中贡献代码的标准工作流仓库自带 CLIexpotoolset的调用方式与底层实现、红绿red/green测试规则、Jest 与 Swift/Kotlin 原生单测的编写位置与运行命令、基于 Turborepo 的提交前校验流程以及 PR 提交与错误信息撰写的团队规范。读完本文你可以直接在 Expo 仓库中独立完成从开发、测试、校验到提交 PR 的完整闭环。expotoolset仓库专属 CLI 的调用方式Expo 仓库自带一个内部 CLI 工具expotools直接以et command ...args形式调用。文档中特别强调必须直接调用et不要通过npx、bunx或pnpm run间接执行该命令由.envrc中的PATH_add bin通过direnv注入 PATH。如果 shell 中找不到et只需在仓库根目录执行一次direnv allow兜底方式是绕过 PATH 直接用 Node 执行node ./tools/bin/expotools.js command。仓库中大量流程原生单测、prebuild 等都依赖它因此掌握et是贡献 Expo 的第一步。源码印证et的自动重建机制从源码结构看et之所以可以在空依赖环境下直接运行是因为 tools/bin/expotools.js 是一个自举包装器它在 tools/package.json 中注册为bin字段下的et与expotools两个入口main: build/expotools.js并在启动时计算src/源码校验和calculateSourceChecksumAsync若cache/.state.json中记录的校验和与当前不一致或build/目录不存在就自动重新编译 TypeScript 后再加载命令——这就是注释里 “Rebuilding expotools” 提示的来源。CLI 参数解析则基于expo/commander见 tools/package.json 的依赖声明。et check-packages最常用的一条命令check-packages用于验证目标包可以成功构建且测试通过是开发过程中最常触达的命令。其完整参数定义见 tools/src/commands/CheckPackages.ts# 校验指定包别名et check / et cp et check-packages ...packages # 常用选项 et check-packages --since commit # 增量校验只检查自该提交以来受影响的包默认基准为 main 分支 HEAD et check-packages --all # 检查全部包忽略 --since et check-packages --core # 额外强制检查核心包expo、expo-modules-core et check-packages --no-test # 跳过 test 任务 et check-packages --no-lint # 跳过 lint 任务 et check-packages --fix-lint # 以 --fix 模式运行 lint单独成批执行 et check-packages --no-format # 跳过 format 任务 et check-packages --fix-format # format 任务带 --write 自动修正 et check-packages --no-dependency-check # 跳过 depscheck 任务任务组装逻辑同样值得注意CheckPackages.tsbuild与typecheck恒定执行——因为build会重新生成产物depscheck、test、lint默认开启可分别用--no-*关闭核心包常量CORE_PACKAGES [expo, expo-modules-core]--core会将其无条件加入检查范围。底层实现et如何驱动 Turborepotools/src/Turbo.ts 中的runTurboTasksAsync是共享的任务执行入口它把参数翻译成pnpm turbo run tasks...filters→ 逐个转成--filterpkgaffected→ 追加--affected并通过环境变量TURBO_SCM_BASE传入--since基准 refcontinueOnError→ 追加--continuedependencies-successful即某个包失败时仍继续运行其依赖已成功的包保证一次运行能看到尽可能多的失败项passthroughArgs→ 追加在--之后透传给底层 npm script例如lint --fix。这与 turbo.json 中的任务定义一一对应build声明build/**、plugin/build/**、cli/build/**、utils/build/**为产物并依赖^build、typecheck、depscheck、lintcache: false、format依赖lint、testcache: falseoutputLogs: errors-only。此外还配置了concurrency: 90%、10 天/10GB 的本地缓存上限以及远程缓存本地校验与 CI 走的是同一套任务图Turbo.ts中注释明确说明该函数同时被check-packages和发布流水线共用。红绿规则Red/Green先有失败测试再写实现文档将测试驱动作为硬性规则Red/green:先写测试并让它失败然后再实现功能或修复问题直到测试通过。不允许在失败测试存在之前就编写实现。这条规则约束的是开发顺序而非仅测试覆盖先看到红色的失败输出确认断言确实覆盖了目标行为再进入绿色的实现阶段。编写测试JS/TS 单元测试单元测试使用Jest文件紧邻源码存放两种约定位置独立目录__tests__/或与源码同级的*.test.ts文件例如 tools/src/commands 相关的测试 中即可见到*.test.ts命名惯例。这些测试会作为et check-packages流程中test任务的一部分运行因此“提交前跑一次et check-packages”即等价于“构建 类型检查 单测”的完整验证。Swift/Kotlin 原生测试原生单元测试的组织与运行方式存放位置Swift/Kotlin 单测位于packages/pkg/ios/Tests/与packages/pkg/android/目录下运行命令统一通过et native-unit-tests执行可按包缩小范围# 运行所有提供原生测试的包 et native-unit-tests # 只测 iOS 平台、只测 expo/ui 包 et native-unit-tests -p ios --packages expo/ui命令的完整选项定义见 tools/src/commands/NativeUnitTests.ts-p, --platform stringandroid、ios或both不传时命令会用交互式提问inquirer让你选择默认android-t, --type stringlocal默认或instrumented如平台支持--packages string逗号分隔的包名列表缺省为所有提供单测的包--affected只测自--since默认main以来受变更影响的包及其依赖方目前仅 iOS 支持且传了--packages时会被忽略。实现上该命令分别委托给 AndroidNativeUnitTests.ts 与 IosNativeUnitTests.ts。iOS/macOS 的 pod install 注意事项文档给出一条容易踩坑的实操建议在iOS/macOS 上运行原生测试或构建之前必须先安装 Pods每当新增或修改 iOS 的test_spec后需要再次pod installAndroid 无此步骤直接运行pod install不要用et pod-install——直接运行更快且避免为你没在工作的应用例如 Expo Go也安装依赖iOS 单测是针对 bare-expo 应用运行的因此 Pods 应安装在apps/bare-expo/ios目录下执行。提交前校验Turborepo 与et check-packages的关系提交commit之前文档允许用两种方式跑全量任务# 方式一Turborepo 直接跑某任务到所有依赖方 turbo run task # 例如 build、typecheck、depscheck、test、lint # 方式二只针对改动过的包与 CI 的校验方式一致 et check-packages ...改动的包名两条路径最终殊途同归et check-packages内部就是runTurboTasksAsync调用pnpm turbo run见 tools/src/Turbo.ts因此本地结果与 CI 检查具有可比性。关于产物提交有一条明确的红线编译产物build/已被 gitignore.gitignore 第 22 行的/packages/**/build/规则不纳入版本控制Turborepo 会按需重新生成并缓存build/对应 turbo.json 中build任务的outputs声明只暂存源码改动绝不把build/加进提交。创建 PR提交信息与描述规范PR 流程以 CONTRIBUTING.md 贡献指南与仓库 PR 模板.github/PULL_REQUEST_TEMPLATE为准核心要求如下。提交信息commit message格式固定为[平台][api] 标题例如[ios][video] Fix black screen on older devicesPR 描述各部分Why改动动机关联相关 issue、论坛帖子或功能请求How功能如何实现、bug 如何修复以及为什么选择该方案Test Plan说明如何测试、评审者如何复现——当没有自动化测试时附上终端输出或截图Checklist已添加CHANGELOG.md条目已通过et check-packages验证构建、类型检查、lint 与测试参考 guides/contributing/Updating Changelogs.md 了解 changelog 更新规范如相关确认改动可配合npx expo prebuild与 EAS Build 工作符合文档写作风格指南见 guides/Expo Documentation Writing Style Guide.md。提交前最后检查运行et check-packages覆盖构建、类型检查、lint 与测试清理多余的console.log与被注释掉的代码确认没有把 gitignore 的build/产物暂存进去。错误信息撰写规范What / Why / How文档对面向用户的错误信息提出了结构化的写法要求这也是阅读 Expo CLI 源码时会反复遇到的一种风格What明确说明失败了什么Why在用户的抽象层级上解释可能原因而不是复述症状How告诉用户下一步做什么——修复方法、变通方案、调试步骤或何时联系支持。用户通常是开发者。语气要求具体、冷静、可执行specific, calm, and actionable不能止步于症状即使确切修法未知也必须给出一个有用的下一步。诊断细节只在有助于排障时提供并清晰标注。文档给出的完整示例The JavaScript bundler couldnt bundle your code because it depends on a Node.js native addon (node_modules/example/example.node). Use a different package fully implemented in JavaScript, or see the Metro resolution docs if this package already provides one and the bundler may not be configured to resolve it.这条错误信息同时回答了 What打包器无法打包、Why依赖了 Node.js 原生 addon、How换纯 JS 包或检查解析配置。小结.claude/CLAUDE.md 用一页篇幅把 Expo 仓库的日常开发纪律浓缩成了可执行清单direnv allow启用et、et check-packages对齐 CI 校验、红绿规则约束开发顺序、et native-unit-tests加apps/bare-expo/ios下的pod install覆盖原生测试、build/永不入 git、PR 按 Why/How/Test Plan/Checklist 四段填写。结合 tools/ 下的命令源码CheckPackages.ts、NativeUnitTests.ts、Turbo.ts与 turbo.json 的任务定义可以确认这些规范并非口号而是由仓库内工具链直接支撑和执行的工程约定。【免费下载链接】expoAn open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web.项目地址: https://gitcode.com/GitHub_Trending/ex/expo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/9/7 8:04:02

StateAct:解决AI智能体长时任务状态管理的核心技术

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 8:04:02

大模型竞赛编程金牌之路:Post-Training核心原理与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 8:04:02

VS2022+Qt+QXlsx实战:从环境搭建到Excel报表与频谱分析全流程

简介:一套基于VS2022与QT环境的QXlsx集成资源,专为需要在C项目中直接读写Excel(xlsx)文件的开发者设计。QXlsx是当前较常用的轻量级Excel读写库,但许多人在MSVC编译时因QtGui、QtCore的私有头文件路径设置不当而反复报…

2026/9/7 12:09:35

加扰与解扰原理及工程实践:从LFSR到同步恢复的完整指南

简介:加扰与解扰是数字通信中改善信号质量与数据安全的关键环节。这一资源面向通信工程与FPGA开发学习者或相关工程师,聚焦基于VHDL的加解扰算法设计、Modelsim功能仿真及硬件板卡验证。压缩包共132个文件,约1.37MB,以vhd源码文件…

2026/9/7 12:09:35

AES密钥查找工具原理与内存转储分析实战

简介:这份开源工具面向安全分析与逆向工程场景,可帮助安全研究员、CTF选手在运行进程的内存中定位AES密钥,支持128位、192位与256位密钥。工具基于C实现,压缩包共10个文件,以.h头文件、.cpp源码及Visual Studio工程文件…

2026/9/7 12:09:35

Windows下CUDA开发环境完整搭建指南:解决版本兼容与安装陷阱

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 12:04:35

元器件采购平台怎么选?按预算分档的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 0:47:43

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/7 0:14:19

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/7 0:14:17

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目:基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念,但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测,PyQt5 负责提供可视化的桌面交互界…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介:UL 1642是锂电池安全领域的重要规范,本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读,用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件,压缩包大小834KB,便…

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介:BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本,由BSI标准出版,重点规定游乐设施和游乐设备在设计与制造环节的安全准则,与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/6 11:40:10

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/6 19:33:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…