cocoapods 源代碼的編譯和調(diào)試方法 破解pod 緩存問題的嘗試

之前下載cocoapods的一個(gè)庫(kù),指定的pod版本一直下載不下來,每次花費(fèi)20分鐘龜速下載到10%就失敗了。于是就嘗試自己下載對(duì)應(yīng)的資源,然后放到cocoapods的緩存中

platform :ios, '8.0'
target 'RecognizeCard' do

pod 'OpenCV', '~>3.1.0.1'
pod 'TesseractOCRiOS', '4.0.0'
end
pod cache list

以AFNetworking為例子

AFNetworking:
  - Version: 1.3.3
    Type:    Release
    Spec:    /Users/mgsm/Library/Caches/CocoaPods/Pods/Specs/Release/AFNetworking/1.3.podspec.json
    Pod:     /Users/mgsm/Library/Caches/CocoaPods/Pods/Release/AFNetworking/1.3.3-12762
  - Version: 2.6.3
    Type:    Release
    Spec:    /Users/mgsm/Library/Caches/CocoaPods/Pods/Specs/Release/AFNetworking/2.6.podspec.json
    Pod:     /Users/mgsm/Library/Caches/CocoaPods/Pods/Release/AFNetworking/2.6.3-4e7e2

這兩個(gè)路徑搞定,貌似就有戲了
這些內(nèi)容都好說,這個(gè)2.6.3-4e7e2 后面的字符串4e7e2就有點(diǎn)麻煩了,既不是release的版本號(hào),猜不到具體的內(nèi)容

只好去github下載了cocopods的源碼,然后再來個(gè)完全日志的輸出

pod update --verbose --no-repo-update

一頓耐(苦)心(逼)的操作找到代碼的位置是

https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/downloader/request.rb
request.rb 中有個(gè) slug方法是處理該業(yè)務(wù)的,但是有兩種可能,而且參數(shù)傳遞過程比較復(fù)雜,不好操作,要是能調(diào)試就好了?

def slug(name: self.name, params: self.params, spec: self.spec)
       checksum = spec && spec.checksum && '-' << spec.checksum[0, 5]
       if released_pod?
         "Release/#{name}/#{spec.version}#{checksum}"
       else
         opts = params.to_a.sort_by(&:first).map { |k, v| "#{k}=#{v}" }.join('-')
         digest = Digest::MD5.hexdigest(opts)
         "External/#{name}/#{digest}#{checksum}"
       end
     end

調(diào)試cocoapods?
ruby代碼不了解啊,ide也沒有,而且build操作也不會(huì)
博主也嘗試了一下sublime3 + 插件的方式運(yùn)行cocoapods項(xiàng)目,但是太難放棄了。。。勞資只想手動(dòng)加個(gè)緩存,不想去踩坑

又想到了cocoapods的安裝方式,gem install ...
這么一查查到了 rubyGem項(xiàng)目https://guides.rubygems.org/

看到了如何編寫自己的gem項(xiàng)目
https://guides.rubygems.org/make-your-own-gem/

$ gem build hola.gemspec
Successfully built RubyGem
Name: hola
Version: 0.0.0
File: hola-0.0.0.gem

$ gem install ./hola-0.0.0.gem
Successfully installed hola-0.0.0
1 gem installed

根據(jù)這個(gè)套路,從github上下載了cocoapods的源碼
然后用 gem build, gem install的命令進(jìn)行了操作,安裝成功了
怎么證明這個(gè)這個(gè)gem是我本地的代碼編譯的呢?
于是就從pod cache list這個(gè)命令里面加上一個(gè)日志輸出

https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/command/cache/list.rb
增加了 UI.puts "yunfeiyang injection"

 def print_pod_cache_infos(pod_name, cache_descriptors)
    UI.puts "yunfeiyang injection"
    UI.puts "#{pod_name}:"
    cache_descriptors.each do |desc|
        if @short_output
            [:spec_file, :slug].each { |k| desc[k] = desc[k].relative_path_from(@cache.root) }
        end
        UI.puts("  - Version: #{desc[:version]}")
        UI.puts("    Type:    #{pod_type(desc)}")
        UI.puts("    Spec:    #{desc[:spec_file]}")
        UI.puts("    Pod:     #{desc[:slug]}")
    end
 end

再執(zhí)行 gem build, gem install
然后執(zhí)行 pod cache list命令

yunfeiyang injection
AFNetworking:
 - Version: 1.3.3
   Type:    Release
   Spec:    /Users/mgsm/Library/Caches/CocoaPods/Pods/Specs/Release/AFNetworking/1.3.podspec.json
   Pod:     /Users/mgsm/Library/Caches/CocoaPods/Pods/Release/AFNetworking/1.3.3-12762
 - Version: 2.6.3
   Type:    Release
   Spec:    /Users/mgsm/Library/Caches/CocoaPods/Pods/Specs/Release/AFNetworking/2.6.podspec.json
   Pod:     /Users/mgsm/Library/Caches/CocoaPods/Pods/Release/AFNetworking/2.6.3-4e7e2

可以看到我們手動(dòng)增加的代碼,在執(zhí)行pod命令的時(shí)候發(fā)揮了作用

進(jìn)一步了解spec.checksum 和緩存有關(guān)的問題
通過又一頓耐心的操作,在控制臺(tái)打印出來了OpenCV 3.0.1.0 完整的checksum
41c4250e2b06a394d6fbb634b5fa622cdd846018
這個(gè)值絕對(duì)是個(gè)MD5了

sandbox_specification.checksum == lockfile.checksum(pod_name)

在項(xiàng)目中一通亂找以后,查到了可以看后綴的地方,實(shí)際上在項(xiàng)目的podlock文件中是存在這個(gè)字符串的

PODS:
  - OpenCV (3.1.0.1)
  - TesseractOCRiOS (4.0.0)

DEPENDENCIES:
  - OpenCV (~> 3.1.0.1)
  - TesseractOCRiOS (= 4.0.0)

SPEC CHECKSUMS:
  OpenCV: 41c4250e2b06a394d6fbb634b5fa622cdd846018
  TesseractOCRiOS: 90638afbe43d082433f2e76b384c7901d23956df

PODFILE CHECKSUM: 7049fd5d9669af3594b254822586bffe9371912a

COCOAPODS: 1.1.1

到這里基本上完成了緩存相關(guān)套路的探索,將下載好的文件放到指定的目錄,嘗試一下

最后發(fā)現(xiàn)我的3.1.0.1 版本 3.1.0.podspec.json

總結(jié)一下,可以通過對(duì)cocoapods 進(jìn)行重新build 和install的方式來修改cocoapods的代碼,來驗(yàn)證自己的想法,要了解cocoapods的原理還是要閱讀ruby代碼

配置 3.1.0.1的podspec.json還不行,后來作弊去已經(jīng)下載成功的機(jī)子上看了一下,需要配置3.1.0.podspec.json
cocoapods探索之路先寫到這里,所以如果有哪位大佬知道更好的方法來調(diào)試cocoapods 這樣的ruby gem庫(kù),我還是很感激的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容