Skip to content

Commit 713e139

Browse files
authored
fix(🍏): fix podspec issue where the Podfile.lock would be unstable (#3736)
1 parent 28fe6be commit 713e139

File tree

2 files changed

+147
-164
lines changed

2 files changed

+147
-164
lines changed

apps/example/ios/Podfile.lock

Lines changed: 70 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -3208,88 +3208,88 @@ SPEC CHECKSUMS:
32083208
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
32093209
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
32103210
hermes-engine: 11b010917f5f15150b2c015abddef1573d2bb05d
3211-
RCT-Folly: 59ec0ac1f2f39672a0c6e6cecdd39383b764646f
3211+
RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669
32123212
RCTDeprecation: a41bbdd9af30bf2e5715796b313e44ec43eefff1
32133213
RCTRequired: 7be34aabb0b77c3cefe644528df0fa0afad4e4d0
32143214
RCTSwiftUI: a6c7271c39098bf00dbdad8f8ed997a59bbfbe44
3215-
RCTSwiftUIWrapper: 5ec163e8fde163d3fba714a992b50a266e1ece37
3215+
RCTSwiftUIWrapper: ff9098ccf7727e58218f2f8ea110349863f43438
32163216
RCTTypeSafety: 27927d0ca04e419ed9467578b3e6297e37210b5c
32173217
React: 4bc1f928568ad4bcfd147260f907b4ea5873a03b
32183218
React-callinvoker: 87f8728235a0dc62e9dc19b3851c829d9347d015
3219-
React-Core: 19e0183e28d7a6613ecacebd7525fe6650efa3b6
3220-
React-CoreModules: 73cc86f2a0ff84b93d6325073ad2e4874d21ad40
3221-
React-cxxreact: 4bf734645c77c9b86e2f3e933e0411cf2f14d1ba
3219+
React-Core: 76bed73b02821e5630e7f2cb2e82432ee964695d
3220+
React-CoreModules: 752dbfdaeb096658aa0adc4a03ba6214815a08df
3221+
React-cxxreact: b6798528aa601c6db66e6adc7e2da2b059c8be74
32223222
React-debug: 8978deb306f6f38c28b5091e52b0ac9f942b157e
3223-
React-defaultsnativemodule: 724eb9ec388d494f1e2057d83355ee8fe6f1d780
3224-
React-domnativemodule: 9068f41092f725acd09950233d2847364c731947
3225-
React-Fabric: 945cc8abf08d9d0966acef605bffce7b501c49d9
3226-
React-FabricComponents: 4c4ad6f0d16c964a68f945e029505e2eeec6654b
3227-
React-FabricImage: a8b628fd98db21b9f8588e06f14a9194dda11b40
3228-
React-featureflags: 0937601c1af1cc125851ec5bbf4654285d47a3e7
3229-
React-featureflagsnativemodule: ac1a3e0353e1a6e15411b17ed6c7122adb0468a4
3230-
React-graphics: cca521e06463608be46207a4aa160f8a7f725f8b
3231-
React-hermes: ec50b9fcea2c3bfdd42f8cec845eac3f35888572
3232-
React-idlecallbacksnativemodule: effcae5b7b4473211adb154aaa321d5d9e2fbcc9
3233-
React-ImageManager: b38459e538f1840fa5c3e7612a4bcb0029a3c366
3234-
React-intersectionobservernativemodule: 8d33366661971200cf2e151727f6fe007b62ae7b
3235-
React-jserrorhandler: f94c688a0dbe2e045b91b992722b92e97d56f77f
3236-
React-jsi: 3216c876cd4c571a57909e22d77c8fd9530aa067
3237-
React-jsiexecutor: 475563c0042841a85930a455d3199f6b1483a5fe
3238-
React-jsinspector: bc484fb32bf1b9fed80afe8793e614eba4f7b39e
3239-
React-jsinspectorcdp: 5a574d1d35016968a67e78e6b8a7917473ffbb77
3240-
React-jsinspectornetwork: dce3a5a1351b527ee8c28ad4a8bdd211507e1a45
3241-
React-jsinspectortracing: 65f6b166bd67e5adc31eba027e1570bacf7a3cc7
3242-
React-jsitooling: d5463f5489a31640b0fa0ec4e31566ca8aa86c13
3243-
React-jsitracing: 3c7fc18821aba64855acb8658aa857ca6a7fddf6
3244-
React-logger: 6ac901f5c7f7321d2be1a40b203bccc2e23411e3
3245-
React-Mapbuffer: 2e0e7cc5b7064eaed9c8b8afc3a87621cb7ef5cd
3246-
React-microtasksnativemodule: dd4d33b251b57e5027c572c6d0b45cbfbcfaa386
3247-
react-native-safe-area-context: 54d812805f3c4e08a4580ad086cbde1d8780c2e4
3248-
react-native-skia: 99b283ec8fe4c904291f94ba3fab65d701f0c2c5
3249-
React-NativeModulesApple: 7f2f2fed3f6c858889eb61d09941be965d52df58
3250-
React-networking: 43e5e6773ac2ca2a93261a1388fed269c9fce092
3223+
React-defaultsnativemodule: 682b77ef4acfb298017be15f4f93c1d998deb174
3224+
React-domnativemodule: 4c4b44f7eb68dbc3a2218db088bef318a7302017
3225+
React-Fabric: b6f82a4d8498ce4475586f71ca8397a771fe292d
3226+
React-FabricComponents: c8695f4b11918a127c4560d66f7d3fdb01a17986
3227+
React-FabricImage: d64f48830f63830e8ffaaf69fa487116856fbbf1
3228+
React-featureflags: 2a46b229903e906d33dbaf9207ce57c59306c369
3229+
React-featureflagsnativemodule: cba6c0814051a0934f8bcee4a436ee2a6bcc9754
3230+
React-graphics: 3d0435051e1ab8904d065f8ffbe981a9fc202841
3231+
React-hermes: 32fc9c231c1aa5c2fcfe851b0d19ee9269f88f4c
3232+
React-idlecallbacksnativemodule: f8ee42581795c4844d97147596bcc2d824c0f188
3233+
React-ImageManager: e8f7377ef0585fd2df05559a17e01a03e187d5cf
3234+
React-intersectionobservernativemodule: b1bea12ca29accdd2eda60c87605a6030b894eb9
3235+
React-jserrorhandler: 1a86df895b4eaf4e771abe8cf34cbb26d821f771
3236+
React-jsi: adf8527fec197ad9d0480cc5b8945eb56de627f0
3237+
React-jsiexecutor: 315fa2f879b43e3a9ca08f5f4b733472f7e4e8a4
3238+
React-jsinspector: b4fd1933666bcb2549b566b40656c1e45e9d7632
3239+
React-jsinspectorcdp: 80141710f2668e5b8f00417298d9b76b4abf90fa
3240+
React-jsinspectornetwork: 1d3ea717dbbec316cd8c21a0af53928a7bf74901
3241+
React-jsinspectortracing: 4ce745374d4b2bfbd164cce9f8de8383d3d818a0
3242+
React-jsitooling: fc4ac4c3b1f3f9f7fedf0c777c6ff3f244f568bd
3243+
React-jsitracing: bff08a6faeef4a9bd286487da191f5e5329e21a9
3244+
React-logger: b8483fa08e0d62e430c76d864309d90576ca2f68
3245+
React-Mapbuffer: 7b72a669e94662359dad4f42b5af005eb24b4e83
3246+
React-microtasksnativemodule: cdc02da075f2857803ed63f24f5f72fc40e094c0
3247+
react-native-safe-area-context: c00143b4823773bba23f2f19f85663ae89ceb460
3248+
react-native-skia: 1f7acabcba351a50fc087267b86d16f4a0e16675
3249+
React-NativeModulesApple: a2c3d2cbec893956a5b3e4060322db2984fff75b
3250+
React-networking: 3f98bd96893a294376e7e03730947a08d474c380
32513251
React-oscompat: 80166b66da22e7af7fad94474e9997bd52d4c8c6
3252-
React-perflogger: 63c90e0d8c24df87ffa14dad01aeafc352847dd0
3253-
React-performancecdpmetrics: 5a9b81c08f75045635127d626440d9ada01e774b
3254-
React-performancetimeline: 31cebfff69ec9174b3fb54b0606fcb12ef91cbad
3252+
React-perflogger: d6797918d2b1031e91a9d8f5e7fdd2c8728fb390
3253+
React-performancecdpmetrics: 5570be61e2f97c4741c5d432c91570e8e5a39892
3254+
React-performancetimeline: 5763499ae1991fc18dcf416e340ce7bc829bb298
32553255
React-RCTActionSheet: 3bd5f5db9f983cf38d51bb9a7a198e2ebea94821
3256-
React-RCTAnimation: 346865a809fa5132f6c594c8b376c6cf46b44e88
3257-
React-RCTAppDelegate: b2d1e0d3663c987f49f45094883b9e36fcbf0181
3258-
React-RCTBlob: 74759ebb7ff9077d19f60c301782c1f8c3eb2813
3259-
React-RCTFabric: 7b4b14dad21ca99333ebcbc0bf5c205647a315a8
3260-
React-RCTFBReactNativeSpec: 39151968adb68b8c59f29a8bd4223d4d7780a793
3261-
React-RCTImage: 60763f56e8a5e45d861d7c4777e428bb820ec52a
3262-
React-RCTLinking: 52aee78b0b3163167c7fcf58f80a42943c03a056
3263-
React-RCTNetwork: f5e1e8ae5eff6982efff6289b06ec0a76d0a6ac2
3264-
React-RCTRuntime: 0e99199322afd372e74b95ae5c58f4e074cc2855
3265-
React-RCTSettings: 298bb40d3412bf32e0b4f0797e48416b0b7278a1
3266-
React-RCTText: dfb74800e27d792d1188fa975a3b9807c3362e3e
3267-
React-RCTVibration: ffe5fd4f50a835e353a3b6869eb005dab11eea44
3256+
React-RCTAnimation: 46a9978f27dc434dbeed16afa7b82619b690a9af
3257+
React-RCTAppDelegate: 62ecd60a2b2a8cae26ce6a066bfa59cfde97af01
3258+
React-RCTBlob: 8285c859513023ee3cc8c806d9b59d4da078c4ba
3259+
React-RCTFabric: 05ed09347e938de985052f791a6a0698816d5761
3260+
React-RCTFBReactNativeSpec: 83ba579fca9a51e774ac32578ef5dd3262edd7e2
3261+
React-RCTImage: a5364d0f098692cfbf5bef1e8a63e7712ecb14b7
3262+
React-RCTLinking: 34b63b0aa0e92d30f5d7aa2c255a8f95fa75ee8f
3263+
React-RCTNetwork: 1ef88b7a5310b8f915d3556b5b247def113191ed
3264+
React-RCTRuntime: ed29cf68a46782fec891e5afe1d8d758ca6ccd9b
3265+
React-RCTSettings: 2c45623d6c0f30851a123f621eb9d32298bcbb0c
3266+
React-RCTText: 0ee70f5dc18004b4d81b2c214267c6cbec058587
3267+
React-RCTVibration: 88557e21e7cc3fe76b5b174cba28ff45c6def997
32683268
React-rendererconsistency: d280314a3e7f0097152f89e815b4de821c2be8b9
3269-
React-renderercss: 8a1a346f3665fd5ea7a7be7b3b9f95d4743e1180
3270-
React-rendererdebug: af74afdfb3d6c5382ebab35562efd8eb9e690473
3271-
React-RuntimeApple: 06e33d291e72fd0c73ac47046c3536d77d5aeedd
3272-
React-RuntimeCore: 99273d2af072062eb07f0b2d2d4a0f2de697ea14
3273-
React-runtimeexecutor: 2063c03c18810ee57939d138142e6493333360ef
3274-
React-RuntimeHermes: 2253a7f4c8d56b449230b330b0b15383ed4b3df4
3275-
React-runtimescheduler: ff37ac6720a943da91645c06274282ac46b71f23
3276-
React-timing: 831d7e081ba4c332ca5cccf389b88e363f13f2b4
3277-
React-utils: 25db6c17598c4fed22b5956d7551bb8bddf1f95b
3278-
React-webperformancenativemodule: 57e41e6193cfb815bde0b5534bef68673f1270eb
3279-
ReactAppDependencyProvider: bfb12ead469222b022a2024f32aba47ce50de512
3280-
ReactCodegen: 9ca1bd49eee1eccf6e427e406d2163f49e9c48c0
3281-
ReactCommon: 05ad684db7d88e194272ae26baddf6300e30b8b7
3282-
ReactNativeHost: e7e0a518b0120f0070b3e1f13c7006d3e0e8ee13
3283-
ReactTestApp-DevSupport: 6994b53b5b81139a8ce63e0776c726c95de079a1
3269+
React-renderercss: f8cbf83d95c2c2bbf893d37fe50c73f046584411
3270+
React-rendererdebug: 37216ddfcd38e49d1e92bf9052ea4bc9d7b932e5
3271+
React-RuntimeApple: 1c0e7cb8e1c2c5775585afcaaa666ec151629a8d
3272+
React-RuntimeCore: 925fe2ca24cf8e6ed87586dbb92827306b93b83f
3273+
React-runtimeexecutor: 962dae024f6df760d029512a7d99e3f73d570935
3274+
React-RuntimeHermes: 19a7c59ec1bc9908516f0bbc29b49425f6ec64ba
3275+
React-runtimescheduler: 62f21127cd97f4d8f164eee5150d3ce53dd36f66
3276+
React-timing: 8757bf6fb96227c264f2d1609f4ba5c68217b8ce
3277+
React-utils: 8ab26781c2f5c2f7fafb2022c8ab39d39f231b80
3278+
React-webperformancenativemodule: 7953b7fe519f76fa595111fe18ff3d5de131bfe9
3279+
ReactAppDependencyProvider: 0eb286cc274abb059ee601b862ebddac2e681d01
3280+
ReactCodegen: b8e56b780fffe6edd6405be0af4a1e3049a937f7
3281+
ReactCommon: ac934cb340aee91282ecd6f273a26d24d4c55cae
3282+
ReactNativeHost: eef98ec49b55d88ad4cabf5a4378a12b42b551ee
3283+
ReactTestApp-DevSupport: ea18f446cff64b6c9a3e28788600c82ecf51bde6
32843284
ReactTestApp-Resources: 1bd9ff10e4c24f2ad87101a32023721ae923bccf
3285-
RNGestureHandler: 77eecab5fd636666ca73a55bb61e2f1a685b7e84
3286-
RNReanimated: 459e2ce3a80bae43e129c3cc570b03716a0a316f
3287-
RNScreens: b2a5c76af24a02a2fd71bfce42780fdd9c79cc6d
3288-
RNSVG: ea9cbf6dcdbebdfff5822b0ad9311bbc4510a0b7
3289-
RNWorklets: 83d68ffdb8f2c04e029bb2753ef0d88313f02aba
3285+
RNGestureHandler: cd4be101cfa17ea6bbd438710caa02e286a84381
3286+
RNReanimated: 8182ef6e805d04dce3618f1a843cb8d2f9ae23b4
3287+
RNScreens: 714e10b6b554f7dc7ad9f78dcf36dc8e3fc73415
3288+
RNSVG: 11354d28dd6cb71a59570b68c91ba6772a2d781d
3289+
RNWorklets: d9fe4a51421f69ce78bb415a7e0710c15fe61150
32903290
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
3291-
Yoga: 5bd0956bf9cb16f75101e78b5e852c7577bc5a45
3291+
Yoga: 5456bb010373068fc92221140921b09d126b116e
32923292

32933293
PODFILE CHECKSUM: 87506345285a0371afb28b9c3e6daaa999c214f3
32943294

3295-
COCOAPODS: 1.15.2
3295+
COCOAPODS: 1.16.2

packages/skia/react-native-skia.podspec

Lines changed: 77 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,6 @@ require "json"
44

55
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
66

7-
# Resolve npm package path using Node.js resolution (handles monorepos, pnpm, etc.)
8-
resolve_skia_package = lambda do |package_name, required: true|
9-
begin
10-
# Use node to resolve the package - this handles all edge cases:
11-
# - Hoisted packages in monorepos
12-
# - pnpm symlinked packages
13-
# - Yarn PnP
14-
# - Different node_modules structures
15-
result = `node -e "console.log(require.resolve('#{package_name}/package.json'))" 2>/dev/null`.strip
16-
if $?.success? && !result.empty?
17-
return File.dirname(result)
18-
end
19-
rescue => e
20-
# Node resolution failed
21-
end
22-
23-
# Fallback: walk up directories looking for node_modules
24-
current = __dir__
25-
while current != "/"
26-
candidate = File.join(current, "node_modules", package_name)
27-
if File.exist?(File.join(candidate, "package.json"))
28-
return candidate
29-
end
30-
current = File.dirname(current)
31-
end
32-
33-
if required
34-
Pod::UI.puts "\n"
35-
Pod::UI.puts "ERROR: Could not find #{package_name}".red
36-
Pod::UI.puts "Make sure you have run 'yarn install' or 'npm install'".red
37-
Pod::UI.puts "\n"
38-
raise "#{package_name} not found. Please install dependencies."
39-
end
40-
41-
nil
42-
end
43-
447
# Check if Graphite is enabled
458
use_graphite = false
469
if ENV['SK_GRAPHITE']
@@ -50,48 +13,6 @@ else
5013
puts "-- SK_GRAPHITE: OFF (set SK_GRAPHITE=1 to enable)"
5114
end
5215

53-
# Check if xcframeworks already exist (e.g., from install-skia-graphite script)
54-
local_ios_libs = File.join(__dir__, "libs/ios")
55-
local_macos_libs = File.join(__dir__, "libs/macos")
56-
xcframeworks_preinstalled = File.exist?(local_ios_libs) &&
57-
Dir.glob(File.join(local_ios_libs, "*.xcframework")).any? &&
58-
File.exist?(local_macos_libs) &&
59-
Dir.glob(File.join(local_macos_libs, "*.xcframework")).any?
60-
61-
if xcframeworks_preinstalled
62-
puts "-- Using pre-installed xcframeworks from libs/"
63-
ios_package = nil
64-
macos_package = nil
65-
tvos_package = nil
66-
else
67-
# Resolve Skia binary packages from npm
68-
prefix = use_graphite ? "react-native-skia-graphite" : "react-native-skia"
69-
70-
ios_package = resolve_skia_package.call("#{prefix}-apple-ios")
71-
macos_package = resolve_skia_package.call("#{prefix}-apple-macos")
72-
tvos_package = use_graphite ? nil : resolve_skia_package.call("#{prefix}-apple-tvos", required: false)
73-
74-
puts "-- Skia iOS package: #{ios_package}"
75-
puts "-- Skia macOS package: #{macos_package}"
76-
puts "-- Skia tvOS package: #{tvos_package}" if tvos_package
77-
78-
# Verify the packages contain the expected files
79-
ios_libs_path = File.join(ios_package, "libs")
80-
unless File.exist?(ios_libs_path) && Dir.glob(File.join(ios_libs_path, "*.xcframework")).any?
81-
Pod::UI.puts "\n"
82-
Pod::UI.puts "┌─────────────────────────────────────────────────────────────────────────────┐".red
83-
Pod::UI.puts "│ │".red
84-
Pod::UI.puts "│ ERROR: Skia prebuilt binaries not found in #{prefix}-apple-ios! │".red
85-
Pod::UI.puts "│ │".red
86-
Pod::UI.puts "│ The package was found but doesn't contain the expected xcframeworks. │".red
87-
Pod::UI.puts "│ Try reinstalling: yarn add #{prefix}-apple-ios │".red
88-
Pod::UI.puts "│ │".red
89-
Pod::UI.puts "└─────────────────────────────────────────────────────────────────────────────┘".red
90-
Pod::UI.puts "\n"
91-
raise "Skia xcframeworks not found in #{ios_libs_path}"
92-
end
93-
end
94-
9516
# Set preprocessor definitions based on GRAPHITE flag
9617
preprocessor_defs = use_graphite ?
9718
'$(inherited) SK_GRAPHITE=1 SK_IMAGE_READ_PIXELS_DISABLE_LEGACY_API=1 SK_DISABLE_LEGACY_SHAPER_FACTORY=1' :
@@ -105,22 +26,83 @@ framework_names = ['libskia', 'libsvg', 'libskshaper', 'libskparagraph',
10526
# Build platform-specific framework paths (relative to pod's libs directory)
10627
ios_frameworks = framework_names.map { |f| "libs/ios/#{f}.xcframework" }
10728
osx_frameworks = framework_names.map { |f| "libs/macos/#{f}.xcframework" }
108-
tvos_frameworks = tvos_package ? framework_names.map { |f| "libs/tvos/#{f}.xcframework" } : []
109-
110-
# Prepare command to copy xcframeworks from npm packages into pod directory
111-
# (skipped if xcframeworks are already preinstalled)
112-
prepare_commands = []
113-
unless xcframeworks_preinstalled
114-
prepare_commands << "rm -rf libs/ios libs/macos libs/tvos"
115-
prepare_commands << "mkdir -p libs/ios libs/macos"
116-
prepare_commands << "cp -R '#{ios_package}/libs/'*.xcframework libs/ios/"
117-
prepare_commands << "cp -R '#{macos_package}/libs/'*.xcframework libs/macos/"
118-
if tvos_package
119-
prepare_commands << "mkdir -p libs/tvos"
120-
prepare_commands << "cp -R '#{tvos_package}/libs/'*.xcframework libs/tvos/"
121-
end
29+
# tvOS frameworks - only declare if libs/tvos/ already exists (otherwise leave empty)
30+
tvos_frameworks = if use_graphite || !Dir.exist?(File.join(__dir__, 'libs', 'tvos'))
31+
[]
32+
else
33+
framework_names.map { |f| "libs/tvos/#{f}.xcframework" }
12234
end
12335

36+
# Prepare command resolves paths at RUNTIME (not evaluation time) to ensure deterministic checksums
37+
# This script:
38+
# 1. Checks if xcframeworks are already installed (e.g., from Graphite script)
39+
# 2. If not, resolves npm package paths and copies xcframeworks
40+
# The script content is deterministic - no machine-specific paths embedded in the podspec
41+
prepare_command_script = <<-'SCRIPT'
42+
node -e "
43+
const path = require('path');
44+
const fs = require('fs');
45+
const { execSync } = require('child_process');
46+
47+
const iosLibs = 'libs/ios';
48+
const macosLibs = 'libs/macos';
49+
50+
// Check if xcframeworks are already installed
51+
const hasIos = fs.existsSync(iosLibs) && fs.readdirSync(iosLibs).some(f => f.endsWith('.xcframework'));
52+
const hasMacos = fs.existsSync(macosLibs) && fs.readdirSync(macosLibs).some(f => f.endsWith('.xcframework'));
53+
54+
if (hasIos && hasMacos) {
55+
console.log('-- Using pre-installed xcframeworks from libs/');
56+
process.exit(0);
57+
}
58+
59+
// Determine package prefix based on SK_GRAPHITE env var
60+
const useGraphite = process.env.SK_GRAPHITE === '1' || (process.env.SK_GRAPHITE || '').toLowerCase() === 'true';
61+
const prefix = useGraphite ? 'react-native-skia-graphite' : 'react-native-skia';
62+
63+
// Resolve package paths
64+
let iosPackage, macosPackage, tvosPackage;
65+
try {
66+
iosPackage = path.dirname(require.resolve(prefix + '-apple-ios/package.json'));
67+
macosPackage = path.dirname(require.resolve(prefix + '-apple-macos/package.json'));
68+
} catch (e) {
69+
console.error('ERROR: Could not find ' + prefix + '-apple-ios or ' + prefix + '-apple-macos');
70+
console.error('Make sure you have run yarn install or npm install');
71+
process.exit(1);
72+
}
73+
74+
// Verify xcframeworks exist in the packages
75+
const iosXcf = path.join(iosPackage, 'libs');
76+
if (!fs.existsSync(iosXcf) || !fs.readdirSync(iosXcf).some(f => f.endsWith('.xcframework'))) {
77+
console.error('ERROR: Skia prebuilt binaries not found in ' + prefix + '-apple-ios!');
78+
process.exit(1);
79+
}
80+
81+
console.log('-- Skia iOS package: ' + iosPackage);
82+
console.log('-- Skia macOS package: ' + macosPackage);
83+
84+
// Clean and copy
85+
execSync('rm -rf libs/ios libs/macos libs/tvos', { stdio: 'inherit' });
86+
execSync('mkdir -p libs/ios libs/macos', { stdio: 'inherit' });
87+
execSync('cp -R \"' + iosPackage + '/libs/\"*.xcframework libs/ios/', { stdio: 'inherit' });
88+
execSync('cp -R \"' + macosPackage + '/libs/\"*.xcframework libs/macos/', { stdio: 'inherit' });
89+
90+
// Handle tvOS (non-Graphite only)
91+
if (!useGraphite) {
92+
try {
93+
tvosPackage = path.dirname(require.resolve(prefix + '-apple-tvos/package.json'));
94+
console.log('-- Skia tvOS package: ' + tvosPackage);
95+
execSync('mkdir -p libs/tvos', { stdio: 'inherit' });
96+
execSync('cp -R \"' + tvosPackage + '/libs/\"*.xcframework libs/tvos/', { stdio: 'inherit' });
97+
} catch (e) {
98+
console.log('-- tvOS package not found, skipping');
99+
}
100+
}
101+
102+
console.log('-- Copied xcframeworks from npm packages');
103+
"
104+
SCRIPT
105+
124106
Pod::Spec.new do |s|
125107
s.name = "react-native-skia"
126108
s.version = package["version"]
@@ -139,7 +121,8 @@ Pod::Spec.new do |s|
139121
s.source = { :git => "https://github.com/shopify/react-native-skia/react-native-skia.git", :tag => "#{s.version}" }
140122

141123
# Copy xcframeworks from npm packages into pod directory structure
142-
s.prepare_command = prepare_commands.join(" && ")
124+
# The script is deterministic - path resolution happens at runtime, not evaluation time
125+
s.prepare_command = prepare_command_script
143126

144127
s.requires_arc = true
145128
s.pod_target_xcconfig = {

0 commit comments

Comments
 (0)