From aa56c2ec0fef704cbd1e07168c5f967cb5cac005 Mon Sep 17 00:00:00 2001 From: sunnylqm Date: Wed, 30 Apr 2025 11:18:02 +0800 Subject: [PATCH] improve podspec detection --- react-native-update.podspec | 99 +++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 26 deletions(-) diff --git a/react-native-update.podspec b/react-native-update.podspec index cd23eb0..2f74817 100644 --- a/react-native-update.podspec +++ b/react-native-update.podspec @@ -9,7 +9,6 @@ podspec_dir = File.dirname(__FILE__) Pod::Spec.new do |s| is_expo_in_podfile = false - is_version_sufficient = false begin # Check Podfile for use_expo_modules! podfile_path = File.join(Pod::Config.instance.installation_root, 'Podfile') @@ -17,24 +16,67 @@ Pod::Spec.new do |s| podfile_content = File.read(podfile_path) is_expo_in_podfile = podfile_content.include?('use_expo_modules!') end - # Check root package.json for Expo version >= 50 - root_package_json_path = File.join(podspec_dir, '..', '..', 'package.json') - if File.exist?(root_package_json_path) - pkg_json = JSON.parse(File.read(root_package_json_path)) - expo_version_string = pkg_json['dependencies']&.[]('expo') || pkg_json['devDependencies']&.[]('expo') - if expo_version_string - match = expo_version_string.match(/\d+/) + rescue => e + # Silently ignore errors during check + end + + # Determine final validity by checking Podfile presence AND Expo version + valid_expo_project = false # Default + if is_expo_in_podfile + # Only check expo version if use_expo_modules! is present + is_version_sufficient = false + begin + expo_version_str = `node --print \"require('expo/package.json').version\"`.strip + if expo_version_str && !expo_version_str.empty? + match = expo_version_str.match(/^\d+/) if match major_version = match[0].to_i is_version_sufficient = major_version >= 50 end end + rescue + # Node command failed, version remains insufficient end - rescue => e - # Silently ignore errors during check + + # Final check + valid_expo_project = is_version_sufficient end - # Determine final validity - valid_expo_project = is_expo_in_podfile && is_version_sufficient + + # Set platform based on whether it's a valid Expo project and if we can parse its target + final_ios_deployment_target = '11.0' # Default target + + if valid_expo_project + # --- Try to find and parse ExpoModulesCore.podspec only if it's an Expo project --- + parsed_expo_ios_target = nil + expo_modules_core_podspec_path = begin + package_json_path = `node -p "require.resolve('expo-modules-core/package.json')"`.strip + File.join(File.dirname(package_json_path), 'ExpoModulesCore.podspec') if $?.success? && package_json_path && !package_json_path.empty? + rescue + nil + end + + if expo_modules_core_podspec_path && File.exist?(expo_modules_core_podspec_path) + begin + content = File.read(expo_modules_core_podspec_path) + match = content.match(/s\.platforms\s*=\s*\{[\s\S]*?:ios\s*=>\s*'([^\']+)'/) # Match within s.platforms hash + if match && match[1] + parsed_expo_ios_target = match[1] + else + match = content.match(/s\.platform\s*=\s*:ios,\s*'([^\']+)'/) # Fallback to s.platform = :ios, 'version' + if match && match[1] + parsed_expo_ios_target = match[1] + end + end + rescue => e + # Pod::UI.warn "Failed to read or parse ExpoModulesCore.podspec content: #{e.message}" + end + end + if parsed_expo_ios_target + final_ios_deployment_target = parsed_expo_ios_target + end + end + + s.platforms = { :ios => final_ios_deployment_target } s.name = package['name'] s.version = package['version'] @@ -45,8 +87,7 @@ Pod::Spec.new do |s| s.homepage = package['homepage'] s.cocoapods_version = '>= 1.6.0' - # s.platform = :ios, "8.0" - # s.platforms = { :ios => "11.0" } + s.source = { :git => 'https://github.com/reactnativecn/react-native-update.git', :tag => '#{s.version}' } # Conditionally set source files @@ -92,20 +133,26 @@ Pod::Spec.new do |s| # Conditionally add Expo subspec and check ExpoModulesCore version if valid_expo_project supports_bundle_url_final = false # Default - begin - # Check installed ExpoModulesCore version for bundle URL support - expo_core_package_json_path = File.join(podspec_dir, '..', 'expo-modules-core', 'package.json') - if File.exist?(expo_core_package_json_path) - core_package_json = JSON.parse(File.read(expo_core_package_json_path)) - installed_version_str = core_package_json['version'] - if installed_version_str - installed_version = Gem::Version.new(installed_version_str) + + # 1. Try executing node to get the version string + expo_modules_core_version_str = begin + # Use node to directly require expo-modules-core/package.json and get its version + `node --print \"require('expo-modules-core/package.json').version\"` # Execute, keep raw output + rescue + # Node command failed (e.g., node not found, package not found). Return empty string. + '' + end + + # 2. Process the obtained version string (if not empty) + if expo_modules_core_version_str && !expo_modules_core_version_str.empty? + begin + # Compare versions using Gem::Version (handles trailing newline) + installed_version = Gem::Version.new(expo_modules_core_version_str) target_version = Gem::Version.new('1.12.0') supports_bundle_url_final = installed_version >= target_version - end - end - rescue JSON::ParserError, Errno::ENOENT, ArgumentError, StandardError => e - # Pod::UI.warn "Could not check ExpoModulesCore version: #{e.message}" + rescue ArgumentError + # If Gem::Version fails parsing, supports_bundle_url_final remains false. + end end s.subspec 'Expo' do |ss|