Flutter插件Podspec如何分别配置Debug和Release模式的vendored_framework
解决方案1:通过xcconfig按构建模式指定framework搜索路径(更简洁)
利用CocoaPods支持为不同构建配置单独设置xcconfig属性的特性,无需拆分subspec,直接指定对应模式下的framework搜索路径即可:
Pod::Spec.new do |s| s.name = 'plugin' # 其余常规配置(version、summary、platform、source_files等)保持原有写法不变 s.xcconfig = { 'OTHER_LDFLAGS' => '-framework foo', # 分别配置真机+模拟器下Debug、Release的framework搜索路径 'FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*][config=Debug]' => '$(PODS_TARGET_SRCROOT)/debug', 'FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*][config=Release]' => '$(PODS_TARGET_SRCROOT)/release', 'FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*][config=Debug]' => '$(PODS_TARGET_SRCROOT)/debug', 'FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*][config=Release]' => '$(PODS_TARGET_SRCROOT)/release' } # 此处仅声明framework名称即可,不需要带路径 s.vendored_frameworks = 'foo.framework' end
该方案会在Debug构建时自动从debug目录查找foo.framework,Release构建时从release目录查找,不存在冲突问题。
解决方案2:修正subspec写法避免循环依赖
你之前的循环依赖是因为根spec直接依赖自身的子spec,同时根spec自身包含编译配置,导致递归依赖。只需要把所有公共配置拆分到独立的core子spec即可解决:
Pod::Spec.new do |s| s.name = 'plugin' s.version = '1.0.0' # 替换为你的插件版本号 s.summary = '你的插件描述' s.platform = :ios, '11.0' # 替换为你的最低支持版本 s.default_subspecs = :none # 公共配置全部放在core子spec中 s.subspec 'core' do |core| core.source_files = 'Classes/**/*' # 替换为你的插件源码路径 core.public_header_files = 'Classes/**/*.h' core.xcconfig = { 'OTHER_LDFLAGS' => '-framework foo' } # 其余所有公共配置(比如依赖、资源文件等)都放在此处 end s.subspec 'debug' do |debug| debug.dependency 'plugin/core' debug.vendored_frameworks = 'debug/foo.framework' end s.subspec 'release' do |release| release.dependency 'plugin/core' release.vendored_frameworks = 'release/foo.framework' end # 根spec仅按配置依赖对应子spec,本身不包含任何编译相关配置,避免循环 s.dependency 'plugin/debug', :configurations => ['Debug'] s.dependency 'plugin/release', :configurations => ['Release'] end
验证步骤
修改完成后执行以下操作确保生效:
- 执行
flutter clean清理项目缓存 - 重新执行
flutter pub get - 进入iOS目录执行
pod install - 分别切换Debug、Release模式编译项目,检查构建日志中链接的foo.framework路径是否对应
内容的提问来源于stack exchange,提问作者vaind
相关产品推荐
相关产品推荐

