Conversation
#44956) # Why Running `pod install` with `use_expo_modules_tests!` failed because `expo-task-manager` and `unimodules-app-loader` did not declare a `test_spec`. # How Added a `test_spec` to both podspecs and a minimal `ExpoSpec` that verifies the shared singleton can be resolved (`EXTaskService.shared` and `UMAppLoaderProvider.sharedInstance()`). # Test Plan Ran the new test targets locally via the generated Xcode workspace and confirmed both specs pass. # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why Align with latest React Native core version. # How - Update package versions: - react-native 0.85.1 -> 0.85.2 - @react-native/normalize-colors 0.85.1 -> 0.85.2 - @react-native/babel-preset 0.85.1 -> 0.85.2 - @react-native/dev-middleware 0.85.1 -> 0.85.2 - @react-native/jest-preset 0.85.1 -> 0.85.2 - Add test targets to `ExpoTaskManager` and `UMAppLoader` # Test Plan - Run Bare Expo - Run Minimal tester # Checklist <!-- Please check the appropriate items below if they apply to your diff. --> - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
## Summary
Compared to `main`, this updates `.github/workflows/ios-prebuild-external-xcframeworks.yml` so manual runs can optionally publish per-flavor zip archives of the generated external XCFramework tarballs to GCS.
## What Changed
- add `workflow_dispatch` inputs for `publish` and required `sdk-version`
- keep `packages` and `concurrency` as manual prebuild controls
- validate that `publish=true` is only allowed for full builds, not package-scoped runs (not sure what is the expected flow here if we wanted to allow both `publish` and `packages`. Would we merge ZIP from some previous publish with the newly published partial packages? How would we learn what was the previous publish?)
- add the OIDC permissions needed to authenticate GitHub Actions to Google Cloud
- keep uploading raw XCFramework tarballs to GitHub artifacts before zip packaging
- package available tarballs into `xcframeworks-{Debug|Release}.zip`
- upload those zips to `gs://eas-build-precompiled-modules/precompiled-modules/$SDK_VERSION/...`, allowing reruns to overwrite the same object path
- disable matrix fail-fast and allow partial outputs to continue through artifact upload and GCS upload when packaging produced a zip
## Validation
- Successful smoke run: [24712070220](https://github.com/expo/expo/actions/runs/24712070220)
- GitHub artifact downloads:
- [xcframeworks-Debug](https://github.com/expo/expo/actions/runs/24712070220/artifacts/6550439823)
- [xcframeworks-Release](https://github.com/expo/expo/actions/runs/24712070220/artifacts/6550611596)
- GCS uploads:
- `gs://eas-build-precompiled-modules/precompiled-modules/55.0.2-alpha.0-gcs-smoke.20260421.2/xcframeworks-Debug.zip`
- `gs://eas-build-precompiled-modules/precompiled-modules/55.0.2-alpha.0-gcs-smoke.20260421.2/xcframeworks-Release.zip`
- `mise exec -- yarn prettier --check .github/workflows/ios-prebuild-external-xcframeworks.yml`
# Why `@react-native-community/picker` is a popular package and `Picker` is a very common component. We want to have a drop-in replacement for it in `expo-ui`. # How - New `packages/expo-ui/src/picker/` module with platform-specific implementations: - **iOS**: SwiftUI wheel picker via `Host` + `SwiftUIPicker`, supporting `color` and `fontFamily` per item. - **Android**: `ExposedDropdownMenuBox` via `Host` + `SegmentedButton`, supporting per-item `enabled`. - **Web**: Throws with guidance to use `<select>`. - NCL example screen (`CommunityPickerScreen`) demonstrating standard, styled, disabled, colored, font-family, and item-enabled variants. # Test Plan 1. Open NCL → UI → Community Picker on iOS and Android. 2. Verify all sections render and selection works (selected value text updates). 3. "Disabled" section: confirm the picker is not interactive. 4. "Item color" (iOS): confirm colored text on each item. 5. "Item enabled" (Android): confirm disabled items cannot be selected. # Checklist - [x] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why The prebuild step is NOT `continue-on-error` — a failed build must fail the job so broken runs are visible in the UI. Now the job is green even when prebuild fails. # How Removed continue-on-error: true and switched cancel() checks to success() checks to fix that the workflow went green even when prebuild failed. # Test Plan Run workflow
# Why The scheduler unblocked dependents as soon as a dependency finished, without checking whether it actually succeeded. So when react-native-worklets fails, react-native-reanimated (which depends on RNWorklets) will still be launched — and either cascaded a misleading "xcframework not found, please build worklets first" error that buried the real root cause, or, on machines with a stale RNWorklets.xcframework left over from a previous good build, silently built against the stale artifact — which is where the non-deterministic failures came from. The fix tracks failed packages in the scheduler and short-circuits dependents before they run, so a failed upstream always prevents a downstream build instead of racing with the filesystem. # How Scheduler.ts: - Added a failedOrDoomed: Set<string> next to the existing completed set. - When a package returns with result.errors.length > 0, it goes into that set. - Before launching any package, compute failedDeps = package.deps ∩ failedOrDoomed. If non-empty, pass that list through to the executor as a third argument. - Because synthesized skip-results also carry errors, the poison propagates transitively through the DAG without any extra logic — a dependent that's skipped becomes "failed" itself and poisons its dependents. Executor.ts: - In the scheduler callback, if failedDeps is non-empty: log ⏭️ Skipping <pkg> — dependency failed: <deps> and return a synthesizeSkippedResult(...) instead of actually running. - synthesizeSkippedResult produces one UnitStatus (all stages 'skipped', with a skipReason string) + one UnitError per product × flavor, so the summary, error log, and exit code all reflect the skip without touching disk. Reporter.ts: - A unit with skipReason is rendered as a single-line ⛔ Skipped (dependency X failed) and counted as failed — so the summary is visually distinct from a real generate failure and the ❌ N failed total stays honest. Net effect: a failed upstream deterministically prevents its downstream from running, regardless of what leftover artifacts happen to be on disk.
# Why After upgrading to REA 4.3.0 and RNWorklets 0.8.1 the prebuild failed due to missing headers # How Fixed by adding missing header directories to spm.config.json # Test-plan Run prebiuld on main: `et prebuild -f Debug --external-only --clean`
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
See Commits and Changes for more details.
Created by
pull[bot] (v2.0.0-alpha.4)
Can you help keep this open source service alive? 💖 Please sponsor : )