背景
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" => "[email protected]" }
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