发布时间:2026/9/7 14:24:53
在 Expo 仓库中从源码构建 Expo Go:开发环境配置、Android/iOS 编译与 Native Component List 验证 在 Expo 仓库中从源码构建 Expo Go开发环境配置、Android/iOS 编译与 Native Component List 验证【免费下载链接】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 官方 monorepo 中的 Expo Go 开发指南系统讲解从源码构建 Expo Go 客户端的完整流程macOS 开发环境如何配置、pnpm setup:native等关键脚本背后的实际行为、Android 与 iOS 两端的具体编译命令以及如何用 Native Component List 应用验证所构建客户端与 Expo SDK 各模块workspace 依赖的联动。读完后你可以独立搭建 Expo Go 的源码开发环境、定位并解决常见的 C/缓存构建问题。一、先判断你是否真的需要构建 Expo Go官方文档在开篇就给出了明确的分流指引如果你只是想安装 Expo Go 到模拟器或真机上无需从源码构建直接通过 Expo 官方渠道安装即可只有当你需要开发 Expo Go 本身时才需要按本文流程操作。此外文档对贡献者给出了两条边界建议Expo SDK 的贡献者开发、测试 SDK 模块改动时应使用仓库中的 Bare Expo 应用apps/bare-expo除非你的改动是 Expo Go 应用自身特有的。普通应用开发者如果你要构建带自定义图标和名称的独立应用应使用 EAS Build如果你需要在 Expo 项目中添加自定义原生模块等原生代码应创建 development build。这两种场景都不需要构建 Expo Go。文档同时提醒向 Expo Go 提交 Pull Request 之前请先与 Expo 团队沟通避免重复投入。一个重要的前提限制官方仅支持在 macOS 上构建 Expo Go。二、环境配置官方六步流程与脚本内部行为文档给出的环境配置步骤为安装 direnv 与 Homebrew → 克隆仓库git clone --recurse-submodules且推荐克隆到完整路径中不含空格的目录→ 在根目录执行brew bundle、pnpm install、pnpm setup:native→ 在packages/expo目录执行pnpm build。下面结合仓库源码说明每一步的真实行为与适用前提。2.1 版本约束根目录 package.json 的engines字段声明了本仓库的运行时要求Node.js^22.13.0 || ^24.3.0 || ^26.0.0 || 27.0.0pnpm^10.33.0。环境搭建前需先满足这两个版本约束。工作区通过pnpm-workspace.yaml与根package.json的workspaces配置管理apps/*、packages/*等子包。2.2pnpm setup:native到底做了什么根 package.json 中定义setup:native: ./scripts/download-dependencies.sh --native ./scripts/setup-react-android.sh查看 scripts/download-dependencies.sh 可知该脚本会检查node、npm、direnv三个命令是否存在缺失则直接报错退出——这就是文档要求先安装 direnv 的原因执行git submodule update --init初始化所有子模块并对每个子模块执行git checkout .恢复干净状态React Native 就是以 Git 子模块形式存在的见下节--native分支下检查 pnpm缺失时通过npm install -g pnpm全局安装然后执行pnpm install。而 scripts/setup-react-android.sh 负责 Android 工具链它要求sdkmanager在 PATH 中或可通过ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager找到随后自动接受 Google 许可协议并依次安装 emulator、NDK21.4.7075529、platform-tools、HAXM、platforms;android-26、build-tools;26.0.3等组件。因此执行该脚本前需要先通过 Android Studio 装好 Android SDK 命令行工具。2.3 根目录其他常用脚本脚本行为见根 package.jsonpnpm install:react-native-lab为 React Native 子模块目录安装 Node 依赖并构建 codegen详见下节pnpm build执行turbo build增量构建各工作区包pnpm setup:docs./scripts/download-dependencies.sh --docs仅初始化docs/文档站依赖三、React Native 实验室构建 Expo Go 的前置依赖Expo Go 并不直接使用 npm 上发布的 React Native而是使用仓库内的react-native-lab。react-native-lab/README.md 说明react-native-lab/react-native是一个指向 Expo 维护的 React Native 仓库的 Git 子模块保持在最新的sdk-*分支上该分支基于上游 React Native 的某个稳定发布版本并叠加少量待上游合并的提交。对应文档构建步骤在 monorepo 根目录执行pnpm install:react-native-lab等价于进入react-native-lab/react-native执行yarn install。根 package.json 中该脚本的实现带有空目录保护若子模块目录为空则跳过并提示因此必须先完成--recurse-submodules克隆或git submodule update --init否则这一步会被静默跳过。可选在react-native-lab/react-native目录执行./gradlew :packages:react-native:ReactAndroid:buildCMakeDebug预构建 React Native Android 依赖。文档指出这属于可选项因为构建 Expo Go 时 RN 终归会被编译但预构建有助于缩小潜在问题的排查范围。Expo Go 的 Android 工程通过 Gradle 配置直接引用该子模块apps/expo-go/android/app/build.gradle 中的react { ... }块将reactNativeDir与codegenDir指向../../react-native-lab/react-native/packages/...并配置debuggableVariants覆盖mobileDebug/mobileRelease/questDebug/questRelease四个变体——由于 Expo Go 的 JS 包由 Metro 在运行时提供而非编译期嵌入所有变体都被标记为 debuggable。四、编译 Expo Go4.1 Android在apps/expo-go/android目录执行./gradlew app:assembleDebug该工程见 apps/expo-go/android/app/build.gradle使用host.exp.exponent作为applicationId与namespace应用名版本号为 Expo Go 客户端版本versionName 56.0.1versionCode 229并通过flavorDimensions device声明了mobile与questMeta Quest 平台两个产品风味。当前仓库的 apps/expo-go/sdkVersions.json 声明的 SDK 版本为57.0.0即该源码构建对应 Expo SDK 57 的 UNVERSIONED 开发态。4.2 iOS在apps/expo-go/ios目录执行pod install然后用 Xcode 打开并运行ios/Exponent.xcworkspace对应 apps/expo-go/ios/Exponent.xcworkspace。iOS 工程目录 apps/expo-go/ios 包含Exponent主 target、ExpoNotificationServiceExtension通知服务扩展、ExponentIntegrationTests集成测试等注意必须打开.xcworkspace而非.xcodeproj否则 CocoaPods 依赖无法被正确解析。4.3 Expo Go 的模块依赖结构Expo Go 自身作为工作区包 apps/expo-go/package.json包名expo/homeprivate: true声明了对几十个workspace:*模块的依赖如expo-camera、expo-location、expo-updates、expo-sqlite等以及react-native 0.87.0、react 19.2.3。两个细节值得注意其expo.autolinking.searchPaths配置了../../react-native-lab/react-native/packages、./node_modules、../../node_modules三个搜索路径并 exclude 自身expo/home这正是原生侧能从子模块而非 npm 包中解析 React Native 的关键apps/expo-go/modules 目录存放 Expo Govendored的原生模块如react-native-view-shot、react-native-webview、react-native-async-storage/async-storage。按 modules/README.md 的说明这些模块会被打补丁应用 Expo Go 特有改动更新时通过工具脚本如et uvm module -c version拉取指定版本并重新应用补丁。五、验证构建产物运行 Native Component List构建完成后文档建议通过 Native Component List 应用验证 Expo Go 与各 Expo 模块的联通性cd apps/native-component-list EXPO_SDK_VERSIONUNVERSIONED npx expo start --clear随后用你刚刚构建出的 Expo Go 应用扫描终端中的二维码打开该应用或在 Metro 终端窗口按i/a快捷键在 iOS 模拟器 / Android 模拟器中打开。EXPO_SDK_VERSIONUNVERSIONED表示使用当前源码树中未发版的 SDK 实现而不是某个已发布 SDK 版本的 API 面——这是开发态验证的核心开关。apps/native-component-list 内含约数百个src/下的组件演示页面*.tsx覆盖相机、定位、传感器、存储等各个模块是端到端排查客户端构建是否正常、某模块是否可用的高价值入口。六、故障排查Troubleshooting文档给出了三级递进的排障方案此处完整保留并补充脚本级说明C 相关编译错误清理 CMake 构建产物缓存.cxxfind . -name .cxx -type d -prune -exec rm -rf {} Android 构建异常先尝试干净构建在apps/expo-go/android目录执行./gradlew clean后重新编译。nuke 核弹方案git submodule foreach --recursive git clean -xfd以及git clean -xfd删除全部未跟踪文件。由于这会同时清掉各子模块内未跟踪内容之后需要重新执行依赖下载脚本 scripts/download-dependencies.sh即重跑pnpm setup:native前半段构建耗时也会相应变长但官方确认该方案有效适合作为最后的兜底手段。七、相关文件索引文件/目录作用apps/expo-go/README.md本文主体Expo Go 源码开发指南apps/expo-go/package.jsonExpo Go 的 JS 依赖与 autolinking 配置apps/expo-go/sdkVersions.json当前 Expo Go 对应 SDK 版本57.0.0apps/expo-go/android/app/build.gradleAndroid 构建脚本含 react-native-lab 路径引用apps/expo-go/ios/Exponent.xcworkspaceiOS Xcode 工作区入口react-native-lab/README.mdReact Native 子模块fork维护策略scripts/download-dependencies.sh子模块初始化与依赖安装--native/--docsscripts/setup-react-android.shAndroid SDK/NDK/平台工具自动安装apps/native-component-list用于验证构建产物的组件演示应用apps/bare-expoSDK 贡献者的开发测试应用Expo Go 的替代入口适用前提小结本文所有命令均以当前仓库实际内容为准要求 macOS 系统、满足根package.json声明的 Node/pnpm 版本、已完成含子模块的仓库克隆Android 侧还需预装 Android SDK 命令行工具链。iOS 侧依赖 CocoaPodspod install与 Xcode。【免费下载链接】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 14:19:53

深挖context_switch:进程切换中mm与内核栈的完整交接机制

进程切换这事,表面上看就是调度器挑个新任务,然后“切换上下文”。可真钻进内核代码,你会发现“切换上下文”这四个字背后站着两个完全不同的世界:一个是用户地址空间的搬运,一个是内核栈的接力。我在读 __schedule …

2026/9/7 14:19:53

擦亮眼睛!并非所有 AI 都能帮你写论文,2026 导师推荐工具盘点

每年毕业季,无数同学深陷论文难题:开题毫无思路、搭建框架耗费数日、初稿逻辑松散、查重标红泛滥、AI检测超标、格式反复被导师驳回。面对这些痛点,许多学生将希望寄托在AI工具上,然而市面上的通用型AI工具虽种类繁多,…

2026/9/7 17:45:30

GPT-5.6时代的多智能体工作流:工具调用与架构选型实战

/* 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 17:45:30

HCIP认证综合实验:网络工程师进阶实战指南

1. HCIP认证与综合实验概述 作为华为认证体系中的高级网络工程师认证,HCIP(Huawei Certified ICT Professional)是网络从业者职业发展的重要里程碑。其中综合实验环节堪称整个认证过程中最具挑战性的部分,它要求考生在限定时间内完…

2026/9/7 17:45:30

元器件长期贮存例外规则详解:IEC 62435-5-2017实战指南

/* 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 17:45:30

Windows 7文件夹绿色对勾的成因与解决方案

1. 问题现象解析:绿色对勾的来源与影响在Windows 7系统中,文件夹左下角突然出现的绿色对勾标识通常与版本控制软件相关。这种现象最常见于安装了TortoiseGit或TortoiseSVN这类图形化版本控制工具后,系统通过Explorer.exe进程在文件资源管理器…

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/7 16:23:03

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;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…