Cocoapods-Pod仓库dependency反向依赖查询
背景
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
使用方式二【下载源码】
- 下载源码
- 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
