這是相關的第二部分 第一部分請參見 http://www.cocoachina.com/ios/20150906/13323.html
我們在這裡,使用的是 第一部分使用pod lib create YohunlUtilsPod 創建的framework工程來說明.其創建過程在此就不重復了,當然你也可以下載我已經創建好的demo https://github.com/yohunl/YohunlUtilsPod
PS:既然是私有庫,那麼我們基本上不會使用github的,相信大家公司都有相應的git平台.不管使用什麼git平台提供的服務,操作方式都是一樣的
一:建立自己私有的spec倉庫
打開隱藏目錄,可以使用終端命令 defaults write com.apple.finder AppleShowAllFiles -bool TRUE;killall Finder (關閉隱藏的終端命令 defaults delete com.apple.finder AppleShowAllFiles;killall Finder)
打開隱藏目錄.cocoapods(這個目錄在你的個人目錄下,比如我電腦上是 /Users/yohunl/.cocoapods)
大家請注意上圖, .cocoapods下的文件夾 repos,這裡的repo是repository倉庫的縮寫.repos下存放的是倉庫的集合.這裡的master就是cocoapods官方建立的倉庫,也就是我們所謂的公共庫
specs目錄下存放的就是所有的提交到cocoapods的開源庫的podspec文件的集合.
其結構如下:
其組成方式是
specName —— 版本version —— specName.podspec
(master庫裡的現在是 specName.podspec.json,這個.json文件就是 podspec文件加了一個後綴而已,至於為什麼官方庫要這麼做,我也沒查到理由.可以采用命令pod ipc spec來將spec文件轉換成json.)
當然了,你可能很奇怪這個文件夾是怎麼來的,這個文件夾是當你安裝了cocoapods後,第一次pod install的時候,cocoapods自己通過命令 pod setup 來建立的(這個pod setup命令是不需要你手動執行的).不過如果你想重建這個官方repos倉庫集合的話,可以自己執行
pod repo remove master pod setup
此兩句是重建pod的repo文件夾
言歸正傳
這個是官方的參考 建立私有repo的文檔 http://guides.cocoapods.org/making/private-cocoapods.html
我們在github上建立一個空的倉庫,命名為yohunlSpecs,這個倉庫是用來存放我們自己的所有的私有庫的specs文件的,就如同官方的 https://github.com/CocoaPods/Specs 是用來存放所有官方的specs文件一樣
建立一個本地的私有repos
官方參考的私有
http://guides.cocoapods.org/making/private-cocoapods.html Private Pods 寫的很詳細,並且還給出了示例
$ pod repo add REPO_NAME SOURCE_URL
其中的 REPO_NAME是我們要添加的私有repo的名稱,後面的是其地址,注意這個只是創建而已,也就是只是在~/.cocoapods/repos 目錄下 目錄下添加了一個文件夾而已,但是,並沒有在其中添加 spec文件
在終端執行命令 pod repo add yohunlSpecs [email protected]:yohunl/yohunlSpecs.git 或者 pod repo add yohunlSpecs https://github.com/yohunl/yohunlSpecs.git ,很多文章說,這裡最好是采用http模式的git地址,不過我試了,兩者都是可以的,執行命令後
在.cocoapods目錄下
看到沒,這裡出現了一個我們自己的私有倉庫 yohunlSpecs,這是一個空的倉庫
二:添加我們在教程一中創建的工程 YohunlUtilsPod的spec文件到上面創建的yohunlSpec庫中去
(PS:由於這個yohunlUtilsPod是采用pod lib create 創建的,本身已經建立了podspec文件了.當然,如果你的工程是已經建立好了的,可以采用命令 pod spec create specName來創建,官方創建spec文件的文檔http://guides.cocoapods.org/making/specs-and-specs-repo.html,如果帶有子庫的化,podspec文件將會變得有些復雜, 可以參考 http://www.cocoachina.com/ios/20150228/11206.html).
打開工程 的spec文件
根據需要修改對應的項.這個文件本質上是一個ruby格式的文件. 修改完畢後,執行 pod spec lint或者pod lib lint修改完,此命令用來驗證這個spec是不是合格的
進入工程目錄 使用命令 pod spec lint,你會得到 [!] 2 out of 2 specs failed validation.,這個錯很奇怪,不用管它!其它錯誤不能不管哦,要根據提示修改,直到沒有其它錯誤為止!
采用命令 pod lib lint來驗證就是正確的.
https://guides.cocoapods.org/terminal/commands.html#commands pod的命令
查了一下這兩個命令之間的區別
pod spec lint —用來驗證本地使用pod spec create添加的podspec文件(但是,這個命令常常會出現 2 out of 2 specs failed validation.此類的錯誤,故推薦大家都使用 pod lib lint)
pod lib lint 這個是檢驗由pod lib create創建的lib工程的spec的合法性(經過檢驗,這個命令是也是可以適用於第一種情況的.)
經過命令的檢驗,我們的YohunlUtilsPod.podspec符合規范了.由於cocoapods的repo是基於git的tag的,所以我們需要給工程YohunlUtilsPod添加一個tag.注意,這裡添加的tag需要和podspec文件中描述的一致,不然以後別人引用的時候,cocoapods就不知道該下載什麼代碼了.
給工程添加一個tag,可以用第三方工具,也可以采用命令行(xcode本身不支持設置tag).,此處我采用的是我熟悉的工具tower,你們也可以使用自己熟悉的工具或者命令行
如果用命令行的話
$ git tag '1.0.0' $ git push --tags $ git push origin master
創建一個tag 1.0.0(和podspec文件中描述的一致),push到github.進入github,可以看到,添加成功了.此處衍生一下,這裡一般是類似1.0.2的版本號。版本號的規范參考 http://semver.org/lang/zh-CN/ 我們以後建立的工程的版本號最好都是符合規范的!
執行命令 pod repo push yohunlSpecs YohunlUtilsPod.podspec [在YohunlUtilsPod.podspec所在的目錄下哦]
執行完成後,可以看到.cocoapods發生了變化了
可以看到,我們的podspec文件已經添加到了yohunlSpecs這個repo下了,並且已經按照格式建立好了
執行pod search YohunlUtilsPod
可以看到,已經建立好了.
三:測試其是否可用
建立一個普通的工程命名為TestPodFrameworkDemo,在目錄下添加podfile文件,添加pod 'YohunlUtilsPod'
$ pod init 建立podfile文件
修改文件podfile內容為下
target 'TestPodFrameworkDemo' do pod 'YohunlUtilsPod' end target 'TestPodFrameworkDemoTests' do end
執行
$ pod install
這個時候,得到提示
尼瑪!!!!不科學啊,命名pod search有,為什麼執行的時候就沒有了????什麼情況????
其實是這樣的,如果你不指定的話,pod install只會在master下搜索有沒有,而我們的spec文件在yohunlSpecs下面,當然找不到了!
解決方式
在podfile文件最上方添加
source 'https://github.com/yohunl/yohunlSpecs.git' #我們自己的私有spec倉庫的地址 source 'https://github.com/CocoaPods/Specs.git' #官方倉庫的地址
默認情況下,如果你不添加source的話,系統會默認使用 https://github.com/CocoaPods/Specs.git 官方源,但是當你添加了source後,系統就不再自動搜索 官方源,所以這兩句都必須添加!!!!!
例如 當你的文件中 包含有 source 'https://github.com/yohunl/NetworkLibSpec.git',那麼記得也要添加默認的官方的 source 'https://github.com/CocoaPods/Specs.git' 要不然,則其它基於官方的都不能pod了
例如:
platform :ios, '7.0' target 'NetworkLibTest' do pod 'NetworkLib' pod 'SDWebImage' #pod 'NetworkLib', :path => '../NetworkLib' #pod 'NetworkLib', :path => '~/code/Cocoapods/podTest/PodTestLibrary' end target 'NetworkLibTestTests' do end
沒有包含 source 'https://github.com/CocoaPods/Specs.git'的話,則會出現
lingyohunldeMBP:NetworkLibTest yohunl$ pod install Updating local specs repositories Cloning spec repo `yohunl` from `https://github.com/yohunl/NetworkLibSpec.git` Analyzing dependencies [!] Unable to find a specification for `SDWebImage`
再次執行 pod install,成功
以後,誰想使用我們這個私有庫,需要做的是
在podfile文件中添加
source'https://github.com/yohunl/yohunlSpecs.git' source'https://github.com/CocoaPods/Specs.git'
還有
pod 'YohunlUtilsPod'
題外話:
1.怎麼查看本地有多少個repos呢?
命令 pod repo可以知道本地有幾個repo!!
SZ-lingdaiping:TestPodFrameworkDemo yohunl$ pod repo
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/yohunl/.cocoapods/repos/master
1 repo
剛剛從中可以看出,其不僅列出了本地共有多少個repo,還包括每個repo的地址
2.對於一個repo下有很多個podspec,例如master下有成百上千個,那麼我們怎麼統一驗證他們是否都符合規范呢?
例如我們可以用命令進入~/.cocoapods/repos/yohunlPodSpecs下執行的pod repo lint .(有一個點的)是驗證這個repo下所有的
/Users/yohunl/.cocoapods/repos/yohunl
SZ-lingdaiping:yohunl yohunl$ pod repo lint .
Linting spec repo `yohunl`
.
Analyzed 1 podspecs files.
All the specs passed validation.
3.cocoapods的常用命令
pod list 列出所有可用的第三方庫
pod search query 搜包含query的第三方庫 注意:這兩個命令只搜存在於本地 /Users/yohunl/.cocoapods/ 下的文件
如果搜索網絡的,可以先更新本地 pod repo update master,然後再搜索
pod lib create frameworkName 創建一個framework工程
pod lib lint 驗證一個podspec文件是否有錯誤
podinstall --no-repo-update錯誤 這裡的參數—no-repo-update,是告訴cocoapods不要更新repo.有麼有感覺每次pod install都很慢,那是因為每一次都會先更新本地的repo,加上此參數,就跳過了這個過程,將會很快
pod init 可以建立一個空的podfile
建立pod的spec文件 pod spec create spec名字 http://www.theonlylars.com/blog/2013/01/20/cocoapods-creating-a-pod-spec/
pod install 命令時會引發許多操作。要想深入了解這個命令執行的詳細內容,可以在這個命令後面加上 --verbose
4.其它使用我們建立的framework的方式
當我們添加
source 'https://github.com/yohunl/yohunlSpecs.git' source'https://github.com/CocoaPods/Specs.git'
並且執行pod install後
進入.cocoapods文件夾,可以看到 又多了一個repo:yohunl!!!
這說明什麼問題呢?
這說明我麼之前的
pod repo add yohunlSpecs [email protected]:yohunl/yohunlSpecs.git
pod repo push yohunlSpecs YohunlUtilsPod.podspec
這兩句話只是為了給 https://github.com/yohunl/yohunlSpecs 中添加spec文件啊.當添加完成後,其實我們可以刪除添加到本地的repo了
刪除repo的命令
pod repo remove yohunlSpecs [pod repo remove repo名稱]
我們刪除我們添加的私有庫 [哈哈,其實你都顯示了隱藏目錄了,也可以直接進去直接刪除文件夾的!]
pod repo remove yohunl
pod repo remove yohunlSpecs
刪除後,可以看到
你再執行pod install
發現 系統會自己根據
source 'https://github.com/yohunl/yohunlSpecs.git' source'https://github.com/CocoaPods/Specs.git'
去下載對應的repos
如果不加入repos(也就是不添加podspec文件到系統的.cocopods文件夾下).能不能使用cocoapods呢?也是可以的
target 'TestPodFrameworkDemo' do pod 'YohunlUtilsPod' , :path => '/Users/yohunl/YohunlUtilsPod' end target 'TestPodFrameworkDemoTests' do end
當我們下載了一個含有podspec文件的代碼後,如果想使用它,可以直接通過pod的path指定路徑 (以前還可以使用 :local,不過現在已經被:path取代了)..cocopods文件夾下的 注意:此處:path後面的路徑是指podspec文件所在目錄的路徑
執行 pod install
也是可以的
不過這種方式添加的,cocoapods會放在 Development Pods文件夾下
下面這種方式也是可以的 ,並不需要將podspec加入到私有倉庫
#source 'https://github.com/yohunl/yohunlSpecs.git' #source 'https://github.com/CocoaPods/Specs.git' target 'TestPodFrameworkDemo' do #pod 'YohunlUtilsPod' , :path => '/Users/yohunl/YohunlUtilsPod' pod 'YohunlUtilsPod',:git => 'https://github.com/yohunl/YohunlUtilsPod.git' end target 'TestPodFrameworkDemoTests' do end
還有以下的方式
#pod 'YohunlUtilsPod' , :path => '/Users/yohunl/YohunlUtilsPod' #可以 #pod 'YohunlUtilsPod',:git => 'https://github.com/yohunl/YohunlUtilsPod.git' #可以 #pod 'YohunlUtilsPod',:podspec => '/Users/yohunl/YohunlUtilsPod/YohunlUtilsPod.podspec' #指定podspec文件,可以 #pod 'YohunlUtilsPod',:podspec => 'https://github.com/yohunl/YohunlUtilsPod/blob/master/YohunlUtilsPod.podspec' #經過測試,這種方式不行 #pod 'YohunlUtilsPod',:podspec => 'https://github.com/yohunl/YohunlUtilsPod.git/YohunlUtilsPod/YohunlUtilsPod.podspec' #測試不行,提示找不到podspec文件
如果你能夠確定你的podspec文件是正確可用的話,完全可以直接向https://github.com/yohunl/yohunlSpecs添加podspec文件(當然要符合格式要求哦)
5.打包framework的第三方插件命令
cocoapods的插件cocoapods-packager來完成類庫的打包,安裝命令sudo gem install cocoapods-packager 它的好處是,需要特別強調的是,該插件通過對引用的三方庫進行重命名很好的解決了類庫命名沖突的問題
參考文檔
http://www.cnblogs.com/brycezhang/p/4117180.html 使用CocoaPods開發並打包靜態庫
http://www.iwangke.me/2013/04/18/advanced-cocoapods/#jtss-tsina
http://www.iwangke.me/2013/04/18/advanced-cocoapods/
http://eric-gao.iteye.com/blog/2128283 提交framework到cocoapods官方去
http://www.cocoachina.com/ios/20150508/11785.html 建立私有庫
http://blog.sigmapoint.pl/automatic-build-of-static-library-for-ios-for-many-architectures/
此三篇文章中有些已經不適用於新版的xcode和cocoapods了
http://blog.sigmapoint.pl/developing-static-library-for-ios-with-cocoapods/?
http://blog.sigmapoint.pl/avoiding-dependency-collisions-in-ios-static-library-managed-by-cocoapods/
http://blog.sigmapoint.pl/automatic-build-of-static-library-for-ios-for-many-architectures/