CocoaPods是OS X和iOS下的一個第三方開源類庫管理工具吻谋,通過CocoaPods工具我們可以為項目添加依賴庫(這些類庫必須是CocoaPods本身所支持的)逗栽,并且可以輕松管理其版本鲁猩。它是目前iOS開發(fā)中使用最廣泛的開源庫管理工具蚪缀,如果我們內部協(xié)作的組件化能夠使用這種方式管理的話砰蠢,那將是很便利的磅网。
在通過Cocoapods建立內部私有庫之前婆咸,我們需要再熟悉下Cocoapods的工作流程竹捉,我們創(chuàng)建內部私有庫時也會依照這個流程來。
本文目錄
一尚骄、Cocoapods的工作流程
二块差、建立Cocoapods私有庫
三、使用私有庫
四、問題總結
Cocoapods工作流程
工作流程如圖所示:
遠程索引庫:
這里存放了各個框架的描述文件憨闰,托管在github上:
CocoaPods/Specs
本地索引庫:
在安裝cocoapods時状蜗,執(zhí)行的pod setup
就是講遠程索引克隆到本地,本地索引的目錄為:
~/.cocoapods/repos/master
本地索引和遠程索引的目錄一致鹉动,結構如下:
每個庫的每個版本都對應一個json格式的描述文件:
{
"name": "YYImage",
"summary": "Image framework for iOS to display/encode/decode animated WebP, APNG, GIF, and more.",
"version": "1.0",
"license": {
"type": "MIT",
"file": "LICENSE"
},
"authors": {
"ibireme": "ibireme@gmail.com"
},
"social_media_url": "http://blog.ibireme.com",
"homepage": "https://github.com/ibireme/YYImage",
"platforms": {
"ios": "6.0"
},
"source": {
"git": "https://github.com/ibireme/YYImage.git",
"tag": "1.0"
},
"requires_arc": true,
"default_subspecs": "Core",
"subspecs": [
{
"name": "Core",
"source_files": "YYImage/*.{h,m}",
"public_header_files": "YYImage/*.{h}",
"libraries": "z",
"frameworks": [
"UIKit",
"CoreFoundation",
"QuartzCore",
"AssetsLibrary",
"ImageIO",
"Accelerate",
"MobileCoreServices"
]
},
{
"name": "WebP",
"dependencies": {
"YYImage/Core": [
]
},
"ios": {
"vendored_frameworks": "Vendor/WebP.framework"
}
}
]
}
本地索引文件
當執(zhí)行pod search命令時轧坎,如果本地索引不存在,就會創(chuàng)建出來:
$ pod search afn
Creating search index for spec repo 'master'..
本地索引文件路徑為:
~/Library/Cache/Cocoapods/Pods
遠程框架庫
以YYImage為例泽示,它的遠程框架庫就是json文件中的source:
https://github.com/ibireme/YYImage.git
所以再用文字總結下Cocoapods工作流程大概就是
1缸血、本地安裝cocoapods,建立本地索引庫和遠程索引庫的映射
2械筛、本地項目pod install
3捎泻、查找本地索引文件,然后找到各個庫對應版本的json文件
4埋哟、通過json文件source字段找到引用庫的git地址
5笆豁、把庫文件拉到本地項目
建立Cocoapods私有庫(framework)
建議采用framework的形式創(chuàng)建私有庫,這可以很好的在開發(fā)階段檢查出庫的不兼容或者文件權限出現的問題赤赊,Swift編寫的代碼通過Cocoapods生成的都是framework闯狱。
0、準備工作:
如何建立遠程索引庫
首先我們需要建立一個內部的遠程索引庫抛计,類似Cocoapods/Spec
的功能哄孤,之后添加的庫文件索引文件都會存放到這里:https://zhangferry@bitbucket.org/sealcn/sealrepo.git
建立本地和遠程索引倉庫的關聯:
pod repo add SealRepo https://zhangferry@bitbucket.org/sealcn/sealrepo.git
執(zhí)行pod repo
可以看到我們有了兩個索引倉庫,可以去在這個目錄~/.cocoapods/repos
看到我們剛建立的SealRepo爷辱。
如何組織文件結構
我們可以看下Alamofire的文件組織結構:
我們看到這幾個文件:
-
Source
用于存放Framework源文件, -
Example
用于放Demo項目 -
docs
和Documentation
放說明文檔朦肘,這個是可選的饭弓, -
Tests
測試文件也是可選。
我們制作私有庫時會仿照這個格式媒抠。
一弟断、制作framework
因為是Swift的工程,接口的開放直接通過open趴生、public等關鍵字指定阀趴,所以工程中的ABTest.h頭文件可以刪除,加入我們自己的庫文件苍匆。
注意:在寫公有庫文件時刘急,對外界開放的屬性,方法需要帶上
public
或者open
關鍵字浸踩。
二叔汁、添加Example工程
通過Xcode菜單欄File->New->Target...
添加一個Example工程。
引入第三方庫
如果無第三庫引用可以跳過這一步。
注意:引入Podfile文件据块,需要framework和Example兩個target都添加上码邻。
測試項目
需要先編譯framework,沒有問題之后另假,導入到Demo項目里
import ABTest
運行Dome像屋,測試開發(fā)功能有沒有問題。
push項目到遠程庫
如果已經關聯過遠程私有倉庫边篮,這一步可以跳過己莺。
在遠程配置一個git地址,然后將本地項目關聯到遠程私有倉庫:
git remote add origin 倉庫地址
如過是首次關聯遠程倉庫苟耻,在push之前我們一般需要先拉去遠程分支
git pull origin master
如果提示:
There is no tracking information for the current branch.
那是因為本地庫和遠程庫沒有建立聯系篇恒,git認為這兩個倉庫可能不是同一個,如果我們確認對應庫沒問題凶杖,可以使用:
$ git pull origin master --allow-unrelated-histories
將遠程庫文件強制拉到本地倉庫胁艰。
之后再執(zhí)行push命令將項目推到遠程倉庫。
git push -u origin master
三智蝠、Cocoapods配置文件
1腾么、添加.swift-version
.swift-version文件用來告訴cocoapods當前文件swift的版本,用命令行建立:
$ echo "3.0" > .swift-version
2杈湾、添加LICENSE
每個使用cocoapods添加的庫都需要準守開源協(xié)議解虱,一般是MIT
協(xié)議,因為bitbucket沒法自動生成漆撞,我們可以手動生成這個同名文件殴泰,然后把協(xié)議內容復制進去:
MIT License
Copyright (c) [year] [fullname]
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
3、創(chuàng)建庫描述文件
可以通過命令行生成描述文件:
$ pod spec create ABTest
然后我們編輯ABTest.podspec文件浮驳,可以仿照下面的寫法
Pod::Spec.new do |s|
s.name = "ABTest"
s.version = "0.0.1"
s.summary = "ABTest with Firebase"
s.description = "This is a ABTest Framworks on swift"
s.homepage = "https://bitbucket.org/sealcn/remoteabtest/src/master/"
s.license = { :type => "MIT", :file => "LICENSE" }
s.author = { "zhangferry" => "zhangfei@dailyinnovation.biz" }
# ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.platform = :ios, "8.0"
# ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.source = { :git => "https://zhangferry@bitbucket.org/sealcn/remoteabtest.git", :tag => s.version }
s.source_files = "Source", "Source/*.swift"
# ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
# s.resource = "icon.png"
# s.resources = "Resources/*.png"
# ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.requires_arc = true
s.static_framework = true
s.dependency "Firebase/Core"
s.dependency "Firebase/RemoteConfig"
#s.ios.vendored_frameworks = "ABTest.framework"
s.xcconfig = { 'SWIFT_INCLUDE_PATHS' => '$(PODS_ROOT)/Firebase/CoreOnly/Sources' }
end
此時我們的文件目錄看起來應該大概是這個樣子:
4悍汛、驗證本地podspec
文件
pod lib lint
該命令用于檢查podspec文件書寫是否正確,如果有error需要解決至会,warning可以不用管(可能會遇到較多問題离咐,需耐心解決0。0)奉件。解決之后再次運行檢查命令宵蛀,當命令行顯示:
-> ABTest (0.0.1)
ABTest passed validation.
說明我們本地配置成功了,到這里本地的第一個版本就算完成了县貌!
然后我們需要將本次修改提交打上tag术陶,提交到遠程倉庫。
git add .
git commit -m "build v0.0.1"
git tag 0.0.1
git push --tags
5煤痕、驗證遠程索引文件
上傳代碼成功之后瞳别,我們需要再次驗證它跟遠程倉庫(ABTest遠程庫和.podspec)是否匹配正確征候,執(zhí)行:
pod spec lint
當出現:
ABTest.podspec passed validation
時,說明我們遠程倉庫匹配正確祟敛。
6疤坝、提交podspec文件到SpecsRepo
$ pod repo push SealRepo ABTest.podspec
這個命令會包含pod spec lint
命令,驗證通過之后馆铁,會添加.podspec文件到本地索引庫:
和遠程索引庫:
使用私有庫
引用私有庫
我們可以像使用其他庫文件一樣在Podfile文件中添加使用私有庫了跑揉,引入方法有兩種:
1、全局添加
在Podfile文件最上面添加一行:
source 'https://zhangferry@bitbucket.org/sealcn/sealrepo.git'
注意:如果私有倉庫和cocoapods倉庫出現同名庫埠巨,會出現不可預期的情況(隨機拉下來公有庫或者私有庫文件)历谍。這時我們需要使用單獨添加的方式。
2辣垒、單獨添加
pod 'ABTest', :git => 'https://zhangferry@bitbucket.org/sealcn/remoteabtest.git'
使用時通過import方法導入庫就可以了望侈。
更新私有庫
當我們需要升級私有庫,添加或者修改方法時勋桶,只需要:
1脱衙、修改.podspec
文件中s.version
的版本號
2、提交本地修改至遠程例驹,打上對應tag
3捐韩、使用項目的工程執(zhí)行pod update
可能遇到的問題
1、pod search 查不到本地庫
這個可能是cocoadpods本身問題鹃锈,pod install安裝沒有問題
2荤胁、更新了版本,但是pod update沒有找到
我們可以采用如下形式屎债,手動指定版本號:
pod 'ABTest', :git => 'https://zhangferry@bitbucket.org/sealcn/remoteabtest.git', :tag => '0.0.4'
3仅政、提示The 'Pods-App' target has transitive dependencies that include static binaries
這是因為引入的庫被編譯成了靜態(tài)庫,我們可以在.podspec
文件中加入:
s.static_framework = true
4盆驹、引入的第三方庫圆丹,在pod lint
時提示找不到
可以手動指定pod目錄,將firsebase替換成你的庫文件路徑:
s.xcconfig = { 'SWIFT_INCLUDE_PATHS' => '$(PODS_ROOT)/Firebase/CoreOnly/Sources' }
5召娜、提示source_files對應文件為空
每次pod lint
時都是根據版本號進行查找的运褪,可以檢查下當前修改跟版本號是否對應惊楼。