Skip to content

SwiftPM scaffold: emit resources before publicHeadersPath - #59494

Closed
chrfalch wants to merge 1 commit into
mainfrom
spm-gap-resource-bundles
Closed

chrfalch wants to merge 1 commit into
mainfrom
spm-gap-resource-bundles

Conversation

@chrfalch

Copy link
Copy Markdown
Collaborator

Summary:

The SwiftPM scaffolder (npx react-native spm scaffold) writes a Package.swift for a library from its podspec. When the podspec has s.resources and the library has public headers, the scaffolder writes publicHeadersPath: before resources: in the target. Swift requires the parameters in their declared order, so package resolution fails:

error: argument 'resources' must precede argument 'publicHeadersPath'

This change:

  1. Writes resources: before publicHeadersPath: in the scaffolded target (scaffold-package-swift.js).
  2. Raises SCAFFOLDER_VERSION from 20 to 21. spm scaffold then writes the manifest again for libraries that still have a manifest from an older scaffolder version. spm update does not do this.

The autolinker (generate-spm-autolinking.js) writes the same two arguments in the same wrong order, at two places. Neither place can fail today, so this PR leaves them unchanged:

  • generateAutolinkedPackageSwift writes inline targets, but main() passes none.
  • generateSynthPackageSwift runs, but only for spmModules targets, and those never set resources. So it never writes the resources: line today.

A note on privacy manifests: this work started from the belief that scaffolded libraries lose the PrivacyInfo.xcprivacy file that their podspec lists in resource_bundles. That is not the case. The scaffolded target uses path: ".", so SwiftPM finds the file by itself and copies it into the app. #57305 is a different fix: it covers React Native's own privacy manifests in the prebuilt React.framework.

This PR does not depend on other open PRs.

Changelog:

[IOS] [FIXED] - SwiftPM: scaffolded Package.swift writes resources: before publicHeadersPath:, so libraries with podspec resources and public headers resolve

Test Plan:

Unit tests (from the repository root):

yarn jest packages/react-native/scripts/spm
  • A new test checks that resources: comes before publicHeadersPath:. It failed before the fix (Expected: < 1471, Received: 1509) and passes after it.
  • All 25 test suites and 1188 tests pass.
  • eslint --max-warnings 0 and prettier --check are clean on both changed files.

End to end, with a new React Native 0.88.0 app and react-native-device-info 15.0.2, converted with npx react-native spm add --deintegrate:

  1. For this test only, I added s.resources = ['ios/PrivacyInfo.xcprivacy'] to the library's podspec. Without the fix, spm scaffold wrote a manifest that failed with the error above.
  2. With this fix applied to the app's node_modules/react-native/scripts/spm/scaffold-package-swift.js:
    • npx react-native spm scaffold wrote version 21, with resources: before publicHeadersPath:.
    • An xcodebuild Debug build for the iOS simulator gave BUILD SUCCEEDED.
    • The app contains RNDeviceInfo_RNDeviceInfo.bundle/PrivacyInfo.xcprivacy, and it is byte-identical to the library's file. The build gave no duplicate-resource warning.

Not covered: the device-info build also needed a hand edit to publicHeadersPath: "ios/RNDeviceInfo". The scaffolder writes "ios", and Xcode 27.1 RC rejects that header layout. That is a separate scaffolder issue, and a separate PR will fix it.

The scaffolder wrote publicHeadersPath: before resources: in the target.
Swift requires the declared parameter order, so a library with podspec
resources and public headers failed to resolve. Bump SCAFFOLDER_VERSION
to 21 so existing scaffolds regenerate.
@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Oct 26, 2026
@chrfalch
chrfalch requested a review from cipolleschi October 26, 2026 14:20
@facebook-github-tools facebook-github-tools Bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Oct 26, 2026
@meta-codesync

meta-codesync Bot commented Oct 26, 2026

Copy link
Copy Markdown

@cipolleschi has imported this pull request. If you are a Meta employee, you can view this in D127581976.

@meta-codesync meta-codesync Bot closed this in d576b40 Oct 26, 2026
@react-native-bot

Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @chrfalch in d576b40

When will my fix make it into a release? | How to file a pick request?

@react-native-bot react-native-bot added the Merged This PR has been merged. label Oct 26, 2026
@meta-codesync

meta-codesync Bot commented Oct 26, 2026

Copy link
Copy Markdown

@cipolleschi merged this pull request in d576b40.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. Merged This PR has been merged. p: Expo Partner: Expo Partner Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants