Skip to content

[SDK 56][iOS] EAS auto-enables precompiled modules with useFrameworks: static and pod install fails with a duplicate ExpoContacts pod (works locally) #3910

Description

@janicduplessis

Build/Submit details page URL

https://expo.dev/accounts/tlon/projects/groups/builds/6b9f9554-d8d3-43af-bd25-5efbe4e0103e

(Public CI run that started this build: https://github.com/tloncorp/tlon-apps/actions/runs/28060676912)

Summary

On Expo SDK 56 with ios.useFrameworks: "static", EAS Build turns on EXPO_USE_PRECOMPILED_MODULES=1 by itself. pod install then fails in the Install pods phase with a duplicate pod error for ExpoContacts. The same project, with the same autolinking commands, installs pods fine when I build locally (not on EAS). Setting EXPO_USE_PRECOMPILED_MODULES=0 in the build profile avoids it and the build completes.

Managed or bare?

Bare (the native ios/android projects are committed), pnpm monorepo.

Environment

npx expo-env-info:

  expo-env-info 2.0.14 environment info:
    System:
      OS: macOS 26.5
      Shell: 5.9 - /bin/zsh
    Binaries:
      Node: 22.22.2
      npm: 10.9.7
      Watchman: 2026.03.02.00
    Managers:
      CocoaPods: 1.16.2
    IDEs:
      Xcode: 26.2/17C52
    npmPackages:
      babel-preset-expo: ~56.0.0 => 56.0.13
    npmGlobalPackages:
      eas-cli: 19.0.1
    Expo Workflow: bare

Other relevant versions (from the mobile app's package.json):

  • expo@56.0.12, react-native@0.85.3, New Architecture enabled
  • expo-contacts@~56.0.9
  • @react-native-firebase/{app,crashlytics,perf}@^24.0.0 with $RNFirebaseAsStaticFramework = true
  • iOS ios.useFrameworks: "static" (needed for @react-native-firebase/* static linking)
  • pnpm monorepo (pnpm 9.0.5, node 22.22.0 on the EAS build)
  • EAS Build image macos-tahoe-26.4-xcode-26.4

The build that hit this ran on EAS, so the failing pod install is in the EAS build log linked above, not on my machine.

Error output

pod install fails in the EAS Install pods phase with:

[!] There are multiple dependencies with different sources for `ExpoContacts` in `Podfile`:
- ExpoContacts (from `../../../node_modules/expo-contacts/ios`)
- ExpoContacts (from `../../../node_modules/expo-contacts/ios/ExpoContacts.podspec`)
pod install exited with non-zero code: 1

Earlier in the same install log:

[Expo] EXPO_USE_PRECOMPILED_MODULES=1 was set, but React Native is configured to build from source (RCT_USE_PREBUILT_RNCORE is not 1). Precompiled Expo modules require the prebuilt React.xcframework, so every Expo module will be built from source for this install.

What I noticed:

  • The duplicate only shows up on the EAS precompiled-modules path. When I run the same autolinking commands from the generated Podfile locally (not on EAS), ExpoContacts is added only once, through use_expo_modules!. It does not show up in the use_native_modules! output. No duplicate locally.
  • There is no manual pod 'ExpoContacts' or extraPods entry. The duplicate comes from autolinking on the precompiled path: one source is the module folder expo-contacts/ios, the other is its ExpoContacts.podspec.
  • EAS turns on EXPO_USE_PRECOMPILED_MODULES=1 by itself for SDK 56, which is why this happens on the build servers but not locally.

Workaround

Set EXPO_USE_PRECOMPILED_MODULES=0 in the build profile env (build all Expo modules from source). pod install then succeeds and the build completes normally.

The other option, RCT_USE_PREBUILT_RNCORE=1, gets past the ExpoContacts duplicate, but then use_react_native_codegen_discovery is skipped, so third-party New Architecture codegen headers go missing (for example react-native-worklets's <rnworklets/rnworklets.h> is not found at compile time).

Reproducible demo or steps to reproduce from a blank project

I have not been able to pull a small standalone repro out of the (private) monorepo yet, but the trigger is specific and consistent: SDK 56 + ios.useFrameworks: "static" + EAS turning on precompiled modules. The expected behavior is that the precompiled-modules autolinking adds ExpoContacts (and other Expo modules) only once, the same as local pod install. Happy to gather more from a build if that helps.

Originally filed against the SDK repo (closed for missing repro): expo/expo#47266

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions