以前使用Cocoapods時候就是簡單的創(chuàng)建Podfile榕堰,然后執(zhí)行pod install就完事。最近臨近過年了空閑時間比較多就琢磨把項目中復(fù)用比較多的代碼抽取出來然后用Cocoapods管理,算是邁開項目組件化的第一步。途中遇到若干坑,這里就總結(jié)下方便自己日后查看犹芹。
這里先給出簡單使用私有庫的教程鏈接:
Cocoapods 應(yīng)用第二部分-私有庫相關(guān)
1.pod lib lint 和 pod spec lint 命令的區(qū)別
pod lib lint是只從本地驗證你的pod能否通過驗證
pod spec lint是從本地和遠程驗證你的pod能否通過驗證
我一般都是直接使用pod spec lint去驗證pod有沒有問題
2.私有pod的驗證
使用pod spec lint去驗證私有庫能否通過驗證時應(yīng)該,應(yīng)該要添加--sources選項鞠绰,不然會出現(xiàn)找不到repo的錯誤
pod spec lint --sources='私有倉庫repo地址,https://github.com/CocoaPods/Specs'
3.subspec
為了讓自己的Pod被導入時顯示出良好的文件層劃分腰埂,subspec是必須的。
若subspec要依賴其它的subspec蜈膨,則subspec的dependency后面接的不是目錄路徑屿笼,而是specA/specB這種spec關(guān)系
4.私有庫引用私有庫的問題
在私有庫引用了私有庫的情況下牺荠,在驗證和推送私有庫的情況下都要加上所有的資源地址,不然pod會默認從官方repo查詢驴一。
pod spec lint --sources='私有倉庫repo地址,https://github.com/CocoaPods/Specs'
pod repo push 本地repo名 podspec名 --sources='私有倉庫repo地址,https://github.com/CocoaPods/Specs'
5.引用自己或第三方的framework或.a文件時
在podsepc中應(yīng)該這樣寫:
s.ios.vendored_frameworks = "xxx/**/*.framework"
s.ios.vendored_libraries = "xxx/**/*.a”
5.便捷地開發(fā)本地私有庫
Cocoapods就提供了一個開發(fā)模式,其實操作起來也是非常簡單的事情休雌,就是將所謂的引用路徑修改成本地路徑即可。就是講Podfile中的pod '庫名', :path => '本地路徑'即可蛔趴。這樣在通常的修改代碼中是不需要執(zhí)行pod update的挑辆,但是對于如果修改了目錄結(jié)構(gòu)(添加、刪除或者移動文件文件)或者是修改了Podspec文件的配置的話孝情,最好是運行一下pod update的命令。普通修改代碼的情況下就不需要運行pod update命令和打tag了洒嗤。
pod 'iOS-Test', :path => '../iOS-Test’
6.私有庫中添加資源(圖片箫荡、音視頻等)
方法共有三種:
- 第一種
spec.resources = ["Images/*.png", "Sounds/*"]
但是這些資源會在打包的時候直接拷貝的app的Bundle中,這樣說不定會和其它資源產(chǎn)生命名沖突
- 第二種
spec.resource = "Resources/MYLibrary.bundle"
把資源都放在bundle中渔隶,然后打包時候這個bundle會直接拷貝進app的mainBundle中羔挡。使用的時候在mainBundle中查找這個bundle然后再搜索具體資源
NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"JZShare" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
- 第三種
spec.resource_bundles = {
'MyLibrary' => ['Resources/*.png'],
'OtherResources' => ['OtherResources/*.png']
}
這種方法利用 framework 的命名空間,有效防止了資源沖突间唉。
使用方法是先拿到最外面的 bundle绞灼,然后再去找下面指定名字 的 bundle 對象,再搜索具體資源
NSBundle *bundle = [NSBundle bundleForClass:[MYSomeClass class]];
NSURL *bundleURL = [bundle URLForResource:@"MyLibrary" withExtension:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];
UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
7.如果私有庫添加了靜態(tài)庫或者dependency用了靜態(tài)庫
那么執(zhí)行pod lib lint還有pod spec lint時候需要加上—user-libraries選項
否則會出現(xiàn)'The 'Pods' target has transitive dependencies錯誤
8.如果私有庫只引用其他庫的subspec
只需要依賴想依賴的subspec呈野,不用管主spec(因為依賴subspec必然要依賴主spec)
9.私有庫已經(jīng)通過驗證并傳到私有repo也能通過pod search低矮,但是就是pod install失敗。
這時候只要執(zhí)行pod update 然后去喝杯水就好了被冒。军掂。。(前提是你把官方源換成國內(nèi)的昨悼,不然從github上更新官方repo的速度你懂的蝗锥。 更換官方源)