如何定位Podfile.lock中间接依赖来源并锁定对应版本?
解决React Native间接依赖Pod更新引发的功能异常
一、定位间接依赖的来源
Podfile.lock确实没有npm的package-lock.json那样直观的依赖树,但可以通过以下方式找出更新Pod的引入来源:
- 安装cocoapods-dependency-tree插件:
gem install cocoapods-dependency-tree,执行pod dependency-tree查看完整依赖关系 - 执行
pod outdated --verbose,输出会显示每个更新Pod的依赖路径 - 执行
pod install --verbose,日志中会明确记录每个Pod被哪个直接依赖引入
二、锁定可疑Pod版本
找到引发问题的间接依赖后,直接在Podfile中声明其稳定版本(取自之前正常状态的Podfile.lock),示例:
# 锁定GoogleUtilities到之前的稳定版本 pod 'GoogleUtilities', '7.11.0'
声明后执行pod install,该Pod版本会被固定,不再自动更新。
三、快速恢复稳定状态
如果暂时无法定位具体问题Pod,可以先回退到稳定依赖状态:
- 备份当前Podfile.lock
- 恢复到之前功能正常时的Podfile.lock
- 执行
pod install --no-repo-update,强制使用lock文件中的旧版本依赖,验证功能是否恢复 - 若恢复正常,再逐个更新Pod,逐步排查出问题依赖
附:你的Podfile
platform :ios, '10.0' require_relative '../node_modules/react-native-unimodules/cocoapods.rb' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' target 'my_mobileapp' do rn_maps_path = '../node_modules/react-native/maps' pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector" pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec" pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired" pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety" pod 'React', :path => '../node_modules/react-native/' pod 'React-Core', :path => '../node_modules/react-native/' pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules' pod 'React-Core/DevSupport', :path => '../node_modules/react-native/' pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS' pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation' pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob' pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image' pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS' pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network' pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings' pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text' pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration' pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/' pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact' pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi' pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor' pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector' pod 'ReactCommon/jscallinvoker', :path => "../node_modules/react-native/ReactCommon" pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon" pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga' pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' # react-native-maps dependencies pod 'react-native-google-maps', path: rn_maps_path pod 'GoogleMaps' pod 'Google-Maps-iOS-Utils' target 'my_mobileappTests' do inherit! :search_paths # Pods for testing end use_unimodules! use_native_modules! end post_install do |installer| ## Fix for XCode 12.5 find_and_replace("../node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm", "_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules", "_initializeModules:(NSArray<Class> *)modules") find_and_replace("../node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm", "RCTBridgeModuleNameForClass(module))", "RCTBridgeModuleNameForClass(Class(module)))") installer.pods_project.targets.each do |target| if target.name == 'react-native-google-maps' target.build_configurations.each do |config| config.build_settings['CLANG_ENABLE_MODULES'] = 'No' end end if target.name == "React" target.remove_from_project end if target.name == 'yoga' target.remove_from_project target.build_configurations.each do |config| config.build_settings['GCC_TREAT_WARNINGS_AS_ERRORS'] = 'NO' config.build_settings['GCC_WARN_64_TO_32_BIT_CONVERSION'] = 'NO' end end target.build_configurations.each do |config| config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET' end puts "Updating #{target.name}" end # https://github.com/microsoft/react-native-code-push/issues/1597 # uncomment this to do a new pod install locally - do not commit or it will not build on the server # work_dir = Dir.pwd # Dir.glob("Pods/Target Support Files/Pods-my_mobileapp/*.xcconfig") do |xc_config_filename| # xcconfig_path = "#{work_dir}/#{xc_config_filename}" # read from xcconfig to build_settings dictionary # build_settings = Hash[*File.read(xcconfig_path).lines.map{|x| x.split(/\s*=\s*/, 2)}.flatten] # modify OTHER_LDFLAGS to prevent certain libraries from (double) linking # build_settings['OTHER_LDFLAGS'] = build_settings['OTHER_LDFLAGS'].sub('-l"Base64"', '').sub('-l"SSZipArchive"', '').sub('-l"JWT"', '') # write build_settings dictionary to xcconfig # File.open(xcconfig_path, "w") { # |file| build_settings.each do |key,value| file.puts "#{key} = #{value}" end # } # end end def find_and_replace(dir, findstr, replacestr) Dir[dir].each do |name| text = File.read(name) replace = text.gsub(findstr,replacestr) if text != replace puts "Fix: " + name File.open(name, "w") { |file| file.puts replace } STDOUT.flush end end Dir[dir + '*/'].each(&method(:find_and_replace)) end
更新的Pod截图

内容的提问来源于stack exchange,提问作者DLateef
相关产品推荐
相关产品推荐

