天天看點

Cocoapods-Pod倉庫dependency反向依賴查詢

背景

iOS開發工作中經常會用到 Cocoapods ,Cocoapods的使用主要分兩種情況

  1. 簡單的用它來快速的內建開源庫,比如 AFNetwork、SDWebImage等
  2. 建立私有Repo,将複用程度較高的底層代碼做成 pod 庫,釋出到私有Repo中,進而實作元件化

問題

随着時間的推移,公司内部的 pod 庫越來越多,庫與庫之間的依賴關系也就越來越複雜,對庫的管理就變得越來越繁瑣

有時候我們需要知道依賴了某個Pod庫的倉庫清單,比如,打算淘汰某個 pod 倉庫,就需要知道依賴該 pod 倉庫的庫都有哪些

查找反向依賴辦法

周遊目前 repo 倉庫中所有的 podspec 檔案,檢視各個倉庫最新版本的 podspec 檔案中的 dependency 清單,進而篩選出一個清單。

解決步驟

本人寫了一個 gem ,直接使用這個 gem 就可以了

使用方式一【使用gem】

  1. 安裝 gem

    gem install reversepoddependency

  2. 執行如下指令得到結果
specbackwarddependency 本地repo路徑 pod名稱
//例如:specbackwarddependency ~/.cocoapods/repos/master AFNetworking
           

使用方式二【下載下傳源碼】

  1. 下載下傳源碼gem源碼連結
  2. cd進入目錄
  3. 安裝 ruby 2.2.x 或者 2.3.x
  4. 安裝gem

    gem install bundle

  5. 執行

    bundle install

  6. 執行查詢指令
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