Repository navigation
Commit d576b40
SwiftPM scaffold: emit resources before publicHeadersPath (#59494)
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
Pull Request resolved: #59494
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.
Reviewed By: christophpurrer
Differential Revision: D127581976
Pulled By: cipolleschi
fbshipit-source-id: c6a958d6cabcc73ef98b5f1bce9d65b15052159a1 parent a185da2 commit d576b40
2 files changed
Lines changed: 32 additions & 3 deletions
File tree
- packages/react-native/scripts/spm
- __tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
853 | 853 | | |
854 | 854 | | |
855 | 855 | | |
| 856 | + | |
| 857 | + | |
| 858 | + | |
| 859 | + | |
| 860 | + | |
| 861 | + | |
| 862 | + | |
| 863 | + | |
| 864 | + | |
| 865 | + | |
| 866 | + | |
| 867 | + | |
| 868 | + | |
| 869 | + | |
| 870 | + | |
| 871 | + | |
| 872 | + | |
| 873 | + | |
| 874 | + | |
| 875 | + | |
| 876 | + | |
| 877 | + | |
| 878 | + | |
| 879 | + | |
| 880 | + | |
| 881 | + | |
| 882 | + | |
856 | 883 | | |
857 | 884 | | |
858 | 885 | | |
| |||
1542 | 1569 | | |
1543 | 1570 | | |
1544 | 1571 | | |
1545 | | - | |
| 1572 | + | |
1546 | 1573 | | |
1547 | 1574 | | |
1548 | 1575 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
113 | | - | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
114 | 116 | | |
115 | 117 | | |
116 | 118 | | |
| |||
778 | 780 | | |
779 | 781 | | |
780 | 782 | | |
781 | | - | |
| 783 | + | |
782 | 784 | | |
783 | 785 | | |
784 | 786 | | |
| |||
0 commit comments