如何将导入的Cocoapod框架标记为废弃且不破坏原有功能?
方案一:Swift全局扩展标记(零侵入Pod源码,优先推荐)
无需修改SwiftObserver的源码,也不用调整Pod配置,直接在你的项目公共依赖模块的任意Swift文件中,对SwiftObserver的公开类型、方法添加带弃用标记的扩展即可:
// 标记整个类/结构体/协议为弃用,所有调用该类型的位置都会触发警告 @available(*, deprecated, message: "请迁移到Combine框架,逐步停止使用SwiftObserver") extension Observer {} @available(*, deprecated, message: "请迁移到Combine框架,逐步停止使用SwiftObserver") extension Observable {} // 也可精准标记特定方法,仅在调用对应方法时触发警告 extension Observable { @available(*, deprecated, message: "请使用Combine的sink/receive方法替代") func addObserver(_ observer: Any, for event: Selector) {} }
该标记仅作用于你的项目代码对SwiftObserver的调用,不会触发SwiftObserver内部的编译警告,也完全不影响原有功能运行,Pod update拉取上游版本不受任何影响。如果是多模块项目,将该扩展放到所有依赖SwiftObserver的公共基础模块中,即可实现全项目范围的调用警告。
方案二:Podfile post_install钩子自动注入标记
如果不想在业务代码中添加额外扩展,可以通过Podfile的安装后钩子,在每次pod install/pod update时自动给SwiftObserver的源码注入弃用标记:
post_install do |installer| installer.pods_project.targets.each do |target| # 匹配SwiftObserver对应的编译目标 next unless target.name == 'SwiftObserver' target.build_configurations.each do |config| # 遍历所有Swift源码文件批量插入弃用标记 target.source_files.each do |file| next unless file.path.end_with?('.swift') content = File.read(file.path) # 避免重复插入标记 unless content.include?('@available(*, deprecated, message: "请迁移到Combine') # 匹配公开类型定义,在头部插入弃用标记 modified_content = content.gsub(/^(public\s+)(class|struct|enum|protocol)/) do |match| "@available(*, deprecated, message: \"请迁移到Combine框架,停止使用SwiftObserver\")\n#{$1}#{$2}" end File.write(file.path, modified_content) end end end end end
该方案无需修改业务代码,所有注入逻辑在Pod安装阶段自动完成,每次拉取SwiftObserver的新版本都会自动重新注入标记,不影响上游版本更新。如果SwiftObserver后续源码结构出现大改,只需调整正则匹配规则即可适配。
内容的提问来源于stack exchange,提问作者Marco Boerner
相关产品推荐
相关产品推荐

