前期準備
1 安裝 cocoapods
先安裝好 cocoapods
團隊可統(tǒng)一使用1.5.3版本劲弦。
如果下載 master
索引庫 速度很慢嘉栓,可以直接從同事那里復制過來(我們已經(jīng)做了第三方庫私有庫化梆暮,master
的索引庫也可以不下載)
2 安裝 cocoapods - svn
插件
cocoapods
默認的 spec repo
科贬,是基于 git
的衷敌,可創(chuàng)建基于 git
管理的私有庫 spec repo
大莫。而我們使用的是 svn
蛉腌,所以還需要安裝 cocoapods - svn
插件
終端輸入 sudo gem install cocoapods-repo-svn
3 添加私有庫索引
在終端里輸入(在任意文件下目錄下)pod repo-svn add my-svn-repo [http://svn-repo-url](http://svn-repo-url/)
比如添加我們的XX索引庫就是 pod repo-svn add XXSpecs xxx
如果提示沒有權(quán)限就看下,在 svn
能不能看到這個路徑只厘。如果沒有就申請下烙丛。
如果遇到有權(quán)限但是私有庫索引還是無法下載,可能是終端中還未輸入賬號密碼羔味,svo co xxx
會提示你輸入密碼的
輸入defaults write com.apple.finder AppleShowAllFiles YES
打開隱藏文件
重啟 finder
后可以看到效果
這個時候你會發(fā)現(xiàn)文件夾路徑 你的用戶名/cocoapods/repos
下多了一個 XXSpecs
河咽。
這個就是我們私有庫的索引,我們之所以能在podfile寫上版本號就能找到對應的代碼地址和文件組織結(jié)構(gòu)方式赋元,就是因為索引庫里存放了版本號對應的 podspec
(podspec
待會具體分析忘蟹,我們自己要寫)
接下來就可以創(chuàng)建自己的私有庫了
1 私有庫標準模板還是裸奔飒房?
開始具體操作流程前先理解一下庫是如何被 cocoapods
找到的。其實必要的只有一個文件那就是 podspec
媚值,他包含了所有必要和不必要的信息狠毯。
而像 cocoapods master
索引庫里數(shù)以萬計的索引查找,作者自己寫了 Molinillo
算法褥芒,提高效率嚼松。
在做一些私有庫的時候,如果不需要單獨跑起來的锰扶,比如基礎庫等献酗,就沒必要選擇創(chuàng)建一個 私有庫標準模板。
一個 classes
文件夾存放 類文件坷牛,一個 assets
文件夾存放 資源即可 再加一個 podsepc
即可凌摄。
業(yè)務組件必須創(chuàng)建標準模板!(方便驗證和單獨Debug漓帅,后期殼工程拆的好的話,似乎也沒必要)
2創(chuàng)建標準模板步驟
1 cd
到想要存放的目錄下 執(zhí)行 pod lib create XXEGOImageLoading
(庫的名字) 這一步會下載標準模板(如果遇到網(wǎng)絡卡主痴怨,就復制一個吧忙干,正常情況應該是分分鐘)
顯示6個問題:
1. 在哪個平臺上使用(iOS)
2. 你想使用哪種語言(ObjC)
3. 是否需要一個Demo應用(Yes)
4. 選擇一個測試框架(None)
5. 是否基于View測試(No)
6. 類的前綴(XX)
回答完6個問題他會自動執(zhí)行pod install命令創(chuàng)建項目并生成依賴,項目結(jié)構(gòu)如下:
XXEGOImageLoading
├── Example #demo APP
│ ├── XXEGOImageLoading
│ ├── XXEGOImageLoading.xcodeproj
│ ├── XXEGOImageLoading.xcworkspace
│ ├── Podfile #demo APP 的依賴描述文件
│ ├── Podfile.lock
│ ├── Pods #demo APP 的依賴文件
│ └── Tests
├── LICENSE #開源協(xié)議 默認MIT
├── XXEGOImageLoading #組件的目錄
│ ├── Assets #資源文件
│ └── Classes #類文件
├── XXEGOImageLoading.podspec #第三步要創(chuàng)建的podspec文件
2 編輯 podspec
編輯 podspec
前先說明一下各個參數(shù)的意義
Pod::Spec.new do |s|
#名稱
s.name = "XXXXX"
#版本號
s.version = "0.1.0"
#簡短介紹
s.summary = "Just Testing."
#詳細介紹
s.description = <<-DESC
XXXXX description
DESC
#主頁,這里要填寫可以訪問到的地址浪藻,不然驗證不通過
s.homepage = "http://www.baidu.com"
#截圖
# s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2"
#開源協(xié)議
s.license = 'MIT'
#作者信息
s.author = { 'feiyuchao' => 'xxx' }
s.source = { :svn => 'XXX)', :tag => s.version.to_s }
#多媒體介紹地址
# s.social_media_url = 'https://twitter.com/<twitter_username>'
#支持的平臺及版本
s.platform = :ios, '8.0'
#是否使用ARC捐迫,如果指定具體文件,則具體的問題使用ARC
s.requires_arc = true
#代碼源文件地址爱葵,**/*表示Classes目錄及其子目錄下所有文件施戴,如果有多個目錄下則用逗號分開,如果需要在項目中分組顯示萌丈,這里也要做相應的設置
s.source_files = 'XXEGOImageLoading/Classes/**/*'
#資源文件地址
s.resource_bundles = {
'XXEGOImageLoading' => ['XXEGOImageLoading/Assets/*.{storyboard,xib,xcassets,json,imageset,png}'] 這里不加 png 加**等的話就是尋找所有文件
}
#公開頭文件地址
s.public_header_files = 'XXEGOImageLoading/Classes/**/*.h'
#該pod依賴的系統(tǒng)framework赞哗,多個用逗號隔開
s.frameworks = 'UIKit','CoreGraphics'
#該pod依賴的系統(tǒng)library,多個用逗號隔開
s.libraries = 'iconv','sqlite3','stdc++','z'
#第三方.a文件
s.vendored_libraries = 'XXEGOImageLoading/Classes/ThirdParty/*.{a}'
#第三方frameworks文件
s.vendored_frameworks = ['XXEGOImageLoading/Classes/xx.framework',
'XXEGOImageLoading/Classes/xxx.framework']
#依賴關系辆雾,該項目所依賴的其他庫肪笋,如果有多個需要填寫多個s.dependency
s.dependency 'AFNetworking', '~> 2.3'
end
3 推送索引
1 關聯(lián)到具體的svn
地址。在 git
里 是git remote add origin xxx svn
我一般是先建倉庫度迂,再下載下來藤乙。svn 倉庫創(chuàng)建的時候需要分文件夾branch tags trunk
2 推送成功之后打好 tag
,tag
要保證和podfile
里的 tag
一致
3 再回到本地惭墓,cd
到 文件夾 包含 podsepc
的目錄下坛梁,執(zhí)行以下命令:$ pod repo-svn push XXSpecs xxx.podspec --allow-warnings --sources=xxx--use-libraries --verbose
sources
是表示需要尋找的依賴從哪里尋找,如果沒有依賴腊凶,pod repo-svn push XXSpecs xxx.podspec
即可
這一步如果執(zhí)行完畢沒有 Error划咐,那么可以進入~/.cocoapods/repos/XXSpecs
中拴念,可以看到xxx
組件了,并且內(nèi)部有一個 0.1.0
文件夾尖殃,內(nèi)部有一個xxx.podspec
文件丈莺。
有問題的話,請確認本地是否已添加 XXSpecs
私有庫送丰,并且你在該私有庫下?lián)碛凶銐虻臋?quán)限
如果私有庫里面引用靜態(tài)庫會導致驗證是無法通過的缔俄,報錯 include of non-modular header inside framework module ··· [-Werror,-Wnon-modular-include-in-framework-module]
,加上--use-libraries
器躏。
如果驗證失敗俐载,請查找 - error
或者 - note
查看失敗信息,進行相應更改登失。
如果你是第一次初始化項目遏佣,應該是沒有 Error 的,畢竟你的組件中啥都沒有揽浙。
空的私有庫創(chuàng)建結(jié)束之后如何組織文件
標準的私有庫如下
所需要做的工作就是在相應的Pods/Developemnt Pods/
組件 /Classes
下編碼状婶,
就是向Development Pods
文件夾中添加庫文件和資源,
將編寫的組件相關的class
放入xxx/Classes
中馅巷、資源圖片文件放入xxx/Assets
中膛虫,
并配置podspec
文件,然后進入Example
文件夾執(zhí)行pod install
命令钓猬,
再打開項目工程可以看到稍刀,剛剛添加的組件已經(jīng)在Pods
子工程下Development Pods/xxx
中了。
如果遇到.a mrc
或者framework
的可以參考對 podspec
的解析
其他的問題會有2個
1 資源文件如何被添加敞曹,如何被獲取账月。
1 spec.resources = ["Images/*.png", "Sounds/*"]
可以看到很多第三方庫都是這么寫,我做私有庫本地化的時候也是這么寫的澳迫。但是不建議局齿。 這些資源文件在 build
時會被直接拷貝到 client target
的 mainBundle
里。帶來了一個問題纲刀,
那就是 client target
的資源和各種pod
所帶來的資源都在同一bundle
的同一層目錄下项炼,很容易產(chǎn)生命名沖突。
例如示绊,我的 app
里有張按鈕圖片叫 “button.png"
锭部,而你的 pod
里也有張圖片叫 "button.png"
,拷貝資源時面褐,我很擔心 pod
里的文件會不會把我 app
里的同名文件給覆蓋掉拌禾?即使沒覆蓋掉,程序運行時到底用哪張展哭?很顯然湃窍,我們不希望上述事情發(fā)生闻蛀。
2 s.resource_bundles = { 'xxx' => ['xxx/Assets/**/*'] }
最好是這么寫
這種方法利用 framework
的命名空間,有效防止了資源沖突您市。pod
會把添加的資源文件編譯成 bundle
觉痛,使用方法是先拿到最外面的 bundle
,然后再去找下面指定名字 的 bundle
對象茵休,再搜索具體資源薪棒,其中需要注意的方法[NSBundle bundleForClass:<#ClassFromPodspec#>]
返回某個 class
對應的 bundle
對象。具體的:
具體可以參考這篇文章 鏈接
2 拆庫的發(fā)現(xiàn)有的文件不在自己的模塊里榕莺,在其他模塊里俐芯。這個時候嚴格來講應該是找人一起評估下,這個共有的文件是否需要下沉到下一層钉鸯,依賴他吧史。
或者直接復制一個文件,改一下前綴名唠雕∶秤可以自己把握。一般建議商量一下岩睁,由負責基礎組件的同事去下沉莽使。
實際開發(fā)中可能會出現(xiàn)負責基礎組件的同事在忙其他業(yè)務開發(fā),不能及時幫忙拆庫笙僚。
子pods
一般業(yè)務組件用不到。暫時不寫了灵再。
私有庫開發(fā)流程如何開發(fā)才能高效
私有庫的版本控制肯定是用 tag
來做的肋层。和 master
的做法一樣,版本號和實際代碼分開翎迁,版本號有專門的一個庫栋猖,就是我們的索引庫 XXSpecs
。
但是實際開發(fā)中汪榔,測試提一個bug
蒲拉,我們就要去更新一個tag
嗎,工作量很大(推代碼 - 打tag
- 推索引)痴腌。
cocoapods
肯定早就想到了雌团,解決了我們的困境。
pods
有 三種寫法士聪,第一種和第二種一樣锦援,我們可以直接在developpods
修改代碼。
第三種寫定具體的版本號剥悟,一般上線前 才去打死 tag
號灵寺。最后一定要用 版本號代替第一種和第二種曼库,不然私有庫就沒有意義,也無法做好版本控制略板。
其他開發(fā)流程和 之前git flow
流一樣操作毁枯。
pod 'XXErrorLayer', :path => '/Users/feiyuchao/Desktop/XXErrorLayer/trunk' 指向本地,只要文件里有 podspec 即可叮称,出現(xiàn)在 developpods 里种玛。
pod 'XXErrorLayer', :svn => xxx') 指向遠程,其他和第一種一樣
pod 'XXErrorLayer'颅拦, "1.0.0" 出現(xiàn)在鎖住的 pods 里蒂誉。
添加第三方庫的策略
原則上不要隨意添加私有庫,尤其一個功能不要添加多個庫距帅。
如果我們用的是git 直接fork 一下右锨,修改一下podspec即可。 我們現(xiàn)在可能需要自己編寫spec碌秸,和組織文件绍移,再推到我們的 svn 地址上。
不知道有沒有更好的方案讥电,重復操作的事情腳本化(不會寫)
有些踩過的坑
1 如果在更新工程pod
后蹂窖,發(fā)現(xiàn) 組件版本 和 最新發(fā)布 的組件版本 一致,但是代碼貌似不是最新的代碼恩敌,那么可能是由于 cocoaPods
的本地緩存導致的問題瞬测,可以執(zhí)行如下代碼清除緩存:
pod cache clean --all
2 頭文件<xxx/xxx>
無法找到。但是“” 能找到纠炮,那是因為沒有分子pods
3 驗證無法通過怎么辦月趟? 如果明明是沒有問題的,但是各種客觀原因無法推上去恢口,可以采取野路子孝宗,索引庫也是一個庫,直接手動推送你的podsepc
上去即可
4 .a文件找不到耕肩。由于我們的svn
自動忽略了.a
文件因妇,改一下忽略文件即可
5 如果 run
主工程的時候提示鏈接錯誤, 有可能是主工程存在著你私有庫的文件猿诸,還沒有刪除
6 如果 pod install
提示索引找不到該私有庫婚被,可能是別的同事推了索引庫新的版本,但是你還沒更新梳虽,執(zhí)行 pod repo-svn update
如果不行摔寨,你也可以自己手動加的
7 如果推的時候提示- ERROR | [iOS] unknown: Encountered an unknown error (/usr/bin/xcrun simctl list -j devices
,可能是 xcode
路徑不正確
sudo xcode-select -s /Applications/xcode.app
搞定 后面是你的xcode
路徑 有可能 xcode
不在程序里怖辆,我的就是在桌面
還能做些什么
1 不知道 svn
能不能分讀寫權(quán)限是复, 原則上 每個庫的實際負責人員也有寫的權(quán)利删顶。 比如我想修改一下別人負責的庫,應該提PR
淑廊,而不是直接papapa
改了
2 Pods
文件 加入忽略文件逗余,因為clone
下來之后 會有一些問題。 需要刪除 pods
重新pod install
3 理想的平滑二進制化
4 更好結(jié)合CI
5 更好的路由方案
6 資源命名規(guī)范化 看到有的圖片就叫show@2x
..容易覆蓋