背景
iOS开发工作中经常会用到 Cocoapods ,Cocoapods的使用主要分两种情况
- 简单的用它来快速的集成开源库,比如 AFNetwork、SDWebImage等
- 创建私有Repo,将复用程度较高的底层代码做成 pod 库,发布到私有Repo中,从而实现组件化
问题
随着时间的推移,公司内部的 pod 库越来越多,库与库之间的依赖关系也就越来越复杂,对库的管理就变得越来越繁琐
有时候我们需要知道依赖了某个Pod库的仓库列表,比如,打算淘汰某个 pod 仓库,就需要知道依赖该 pod 仓库的库都有哪些
查找反向依赖办法
遍历当前 repo 仓库中所有的 podspec 文件,查看各个仓库最新版本的 podspec 文件中的 dependency 列表,从而筛选出一个列表。
解决步骤
本人写了一个 gem ,直接使用这个 gem 就可以了
使用方式一【使用gem】
- 安装 gem
gem install reversepoddependency
- 执行如下命令得到结果
specbackwarddependency 本地repo路径 pod名称
//例如:specbackwarddependency ~/.cocoapods/repos/master AFNetworking
使用方式二【下载源码】
- 下载源码gem源码链接
- cd进入目录
- 安装 ruby 2.2.x 或者 2.3.x
- 安装gem
gem install bundle
- 执行
bundle install
- 执行查询指令
specbackwarddependency 本地repo路径 pod名称
//例如:specbackwarddependency ~/.cocoapods/repos/master AFNetworking
补充
最近工作中用到这个工具,发现有些 podspec 比较特殊(比如ZebraCocos2dx)在遍历的过程中会抛出如下异常,解决办法是直接将 ZebraCocos2dx 这个文件夹删除后重试成功了,算是暂时没有去刨根问题找原因,而是绕道
/Users/xxx/.rvm/gems/ruby-2.6.5/gems/cocoapods-core-1.10.1/lib/cocoapods-core/specification.rb:835:in `rescue in _eval_podspec': (Pod::DSLError)
[!] Invalid `ZebraCocos2dx.podspec` file: uninitialized constant Pod::Sandbox.
去看了一下这个 podspec 的内容确实有些特殊
cloned = Marshal.load(Marshal.dump(Pod::Sandbox::FileAccessor::GLOB_PATTERNS))
Pod::Sandbox::FileAccessor::HEADER_EXTENSIONS = (%w(.inl .msg) + Pod::Sandbox::FileAccessor::HEADER_EXTENSIONS)
puts Pod::Sandbox::FileAccessor::HEADER_EXTENSIONS
s = Pod::Sandbox::FileAccessor::GLOB_PATTERNS[:public_header_files]
s = s[0...s.length-1]+',.inl,.msg'+s[s.length-1]
cloned[:public_header_files] = s
puts Pod::Sandbox::FileAccessor::GLOB_PATTERNS = cloned
Pod::Spec.new do |s|
s.name = 'ZebraCocos2dx'
s.version = '0.0.5'
s.summary = 'ZebraCocos2dx'
s.description = <<-DESC
Cocos动画引擎SDK.
DESC
s.homepage = 'https://wiki.bytedance.com'
s.license = 'MIT'
s.author = { "lizx03" => "lizx03@fenbi.com" }
s.source = { :git => "ssh://gerrit.zhenguanyu.com:29418/zebra-cocos2d-x", :tag => s.version }
s.ios.deployment_target = '8.0'
s.header_dir = 'cocos2d-x/cocos/,cocos2d-x/extensions/,cocos2d-x/external/'
s.header_mappings_dir = 'cocos2d-x/'
s.source_files = 'cocos2d-x/extensions/**/*.{h,inl}', 'cocos2d-x/cocos/**/*.{h,inl,hpp}'
# s.resource = 'Resources/ZebraCocos2dx.bundle'
s.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/ZebraCocos2dx/cocos" "${PODS_ROOT}/Headers/Public/ZebraCocos2dx/external/spidermonkey/include/ios" "$(PODS_ROOT)/Headers/Public/ZebraCocos2dx/cocos/editor-support/"' }
# s.resources = ['main.js','scence0.js', 'project.json','res','script','src']
s.libraries = 'stdc++', 'sqlite3', 'iconv','z'
s.frameworks = 'OpenAL', 'CoreMotion', 'QuartzCore', 'GameController', 'AVFoundation', 'AudioToolbox', 'MediaPlayer'
# s.vendored_libraries = 'zebra-cocos2d-x/cocos2d-x/libcocos2d.a','zebra-cocos2d-x/cocos2d-x/libluacocos2d.a'
end