之前下載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ù),我還是很感激的