一、iOS和OSX中添加第三方依賴庫
- CocoaPods 和 Carthage 作為 iOS 和 OS X 下的第三方庫管理工具,通過 CocoaPods 和 Carthage 可以方便的為項目添加第三方依賴庫。方便管理其版本的同時,也大大的提高了開發(fā)效率。下文中僅以 Cocoapods 為主介紹其環(huán)境集成和使用。
1.1 CocoaPods介紹
- CocoaPods 作為一個提供中心倉庫的第三方庫管理工具,可以方便的添加第三方庫的依賴并自動完成對第三方庫的配置。利用 CocoaPods 還可以集成自己發(fā)布的開源庫和創(chuàng)建的私有庫。
- CocoaPods 添加第三方依賴庫時,會自動創(chuàng)建一個新的workspace,主項目添加的所有依賴庫都放在自動創(chuàng)建的Pods項目中,讓主項目依賴Pods項目。
1.2 Carthage介紹
- Carthage 是一個去中心化的第三方庫管理工具。相對于 CocoaPods 來說,Carthage 使用更加簡單。
- Carthage 管理第三方依賴庫時,不會過多的入侵主項目的項目結構,添加依賴完成的項目相對 CocoaPods 比較干凈。添加的依賴庫會自動編譯為Dynamic framework。
- 可以與通過 CocoaPods 添加依賴的項目無縫對接。
- Carthage iOS8+。
1.3 CocoaPods 和 Carthage 優(yōu)缺點
- CocoaPods
- 優(yōu)點:
- 第三方庫豐富
- 工具功能豐富、完善
- 缺點:
- 需要更新中心倉庫(這里說的倉庫,不是github上所有托管庫的代碼庫的集合,而是github上托管的所有開源倉庫的索引集合),并且每次更新需要連接中心倉庫比較耗時
- 發(fā)布第三方庫到 CocoaPods 操作繁瑣
- 對主工程項目結構入侵較多
- 優(yōu)點:
- Carthage
- 優(yōu)點:
- 去中心化,使用時只需要更新具體的庫
- 直接加載 framework 編譯耗時短
- 不改變主工程項目結構
- 缺點:
- 第三方庫有限
- 僅支持iOS8+
- 工具功能不完善
- 無法再主工程中直接查看第三方庫源碼
- 優(yōu)點:
二、CocoaPods環(huán)境集成和使用
2.1 配置 ruby 環(huán)境
- 通常ruby源默認為https://rubygems.org/,由于眾所周知的原因,我們需要將ruby源改為國內(nèi)的源站。
-
gem sources –l// 查看ruby源 -
gem sources --remove https://rubygems.org/// 刪除ruby源 -
gem sources -a https://gems.ruby-china.org/// 添加ruby源
-
- 注:國內(nèi)ruby源由于淘寶源(https://ruby.taobao.org/)已經(jīng)不再維護,推薦使用
https://gems.ruby-china.org/https://gems.ruby-china.com
2.2 安裝 CocoaPods
-
安裝 CocoaPods 之前,如果 gem 版本太老,需要升級gem:
- 更新gem
sudo gem update --system - 查看gem版本
gem -v
- 更新gem
-
安裝 CocoaPods
sudo gem install cocoapods// 安裝或更新pod setup// 在~/.cocoapods/repos中創(chuàng)建一個目錄用來保存spec-repos,并從https://github.com/CocoaPods/Specs拉取Specs到本地,如果~/.cocoapods/repos目錄已經(jīng)存在,則會將當前目錄下的倉庫更新到最新版本。-
報錯1:
- 對于執(zhí)行安裝過程中的報錯,這里如果報Operation not permitted - /usr/bin/xcodeproj。
- 解決方案:
sudo gem install -n /usr/local/bin cocoapodspod setup
-
報錯2:
- pod setup 失敗
- 解決方案1:刪除master重新下載
pod repo remove masterpod setup
- 解決方案2:
- 直接從github上clone或者下載一個Specs到本地,重命名為master,拷貝到~/.cocoapods/repos目錄下
- 再次執(zhí)行
pod setup驗證
-
更新 CocoaPods
sudo gem install cocoapods
-
安裝指定版本
sudo gem install cocoapods -v 1.5.2
-
安裝預發(fā)布版本(beta)
sudo gem install cocoapods --pre
-
卸載或者版本回退 CocoaPods
sudo gem uninstall cocoapods
-
版本查看
pod --version
備注:近期升級系統(tǒng) MacOs High Sierra,遇到cocoapods無法更新repo的問題,提示各種權限和無法更新的問題,初步確認問題在ruby環(huán)境,故需升級ruby,但通過
sudo gem update --system無法更新ruby,最終的解決辦法,安裝rvm,通過rvm安裝新版本ruby,再安裝cocoapods即可。
2.3 給項目添加 CocoaPods 庫依賴
方式1:執(zhí)行
$ pod init方式2:直接創(chuàng)建文件
1.在主項目根目錄創(chuàng)建一個Podfile文件(命名注意:Podfile)
-
2.編輯Podfile文件格式和內(nèi)容:<Podfile文件的編輯可以選擇CocoaPods App>
platform:ios, '8.0' // 指定要添加依賴的主工程的運行平臺,適配的最低版本 target 'YourApp' do // 指定要添加依賴的target pod 'AFNetworking', '3.0.1' // 添加需要依賴的庫,可以通過pod search來搜索github上托管的第三方庫 end注:編輯完成注意保存
-
說明:關于指定pod versions
-
pod 'AFNetworking'// 省略版本號,即總是希望使用最新的版本作為依賴 -
pod 'AFNetworking', '3.0.1'// 指定特定版本號,即總是使用指定的特定版本作為依賴 -
pod 'AFNetworking', '> 3.0.0'// 指定高于3.0.0的任意版本,即總是使用高于3.0.0的任意版本作為依賴 -
pod 'AFNetworking', '>= 3.0.0'// 指定3.0.0或者高于3.0.0的任意版本,即總是使用3.0.0或者高于3.0.0的任意版本作為依賴 -
pod 'AFNetworking', '< 3.0.0'// 指定任意低于3.0.0的版本,即總是使用低于3.0.0的版本作為依賴 -
pod 'AFNetworking', '<= 3.0.0'// 指定3.0.0版本和任意低于3.0.0的版本,即總是使用3.0.0版本或者低于3.0.0的版本作為依賴 -
pod 'AFNetworking', '~> 3.0.1'// 指定版本3.0.1及其之后版本中低于3.1.0(不包括3.1.0)的版本 -
pod 'AFNetworking', '~> 3.1'// 指定版本3.1及其之后版本中低于4.0(不包括4.0)的版本 -
pod 'AFNetworking', '~> 0'// 指定版本0及其之后版本中低于1.0的版本
以上關于版本指定,除了指定特定版本這種方式外,其他指定版本的方式都是在滿足當前約束條件下默認使用的約束條件下的最大版本作為依賴
-
-
除了以上指定版本之外,還可以指定pod的master分支作為依賴版本(指定具體版本的方式好處是指定的版本一般都是tag版本,是第三方庫作者測試通過的可發(fā)布的版本,而指定master作為依賴時,有可能其中的部分代碼還在測試和完善階段的作者沒有發(fā)布的源代碼,即tag之外的代碼,選擇master作為依賴版本要慎重。選擇master作為依賴一般用在團隊開發(fā)的私有庫的 開發(fā)模式 中,或者自己維護的開源庫 開發(fā)模式 中,開發(fā)完成后切換到tag版。)
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git'
-
3.通過
pod search來搜索需要依賴的庫pod search AFNetworking
4.從本地加載依賴庫
-
5.添加依賴到主工程
-
pod install// 下載Podfile中的所有依賴庫,并在./Pods路徑下創(chuàng)建一個Pods庫工程 -
pod update// 更新依賴庫,如果指定依賴庫可以更新具體的第三方依賴庫,否則更新所有需要更新的依賴庫。 - 注:二選一
-
-
補充
pod update 在執(zhí)行的時候每次都會先執(zhí)行pod repo update,比較耗時,所以一般選擇不更新本地倉庫使用
pod update --no-repo-update-
當github上托管的第三方庫有更新版本時,需要更新本地倉庫:
-
pod repo update// 不指定具體倉庫,會自動更新所有倉庫
或者
-
pod repo update master// 指定更新master
-
同時給多個target添加依賴庫的,例如TestTarget / AppExtensionTarget,只需要在Podfile文件中添加多個target.
platform:ios, '8.0' target 'YourApp' do // add lib end target 'YourTestTarget' do // add lib end
2.4 解除項目 CocoaPods 依賴
- 刪除本地文件:
- podfile
- podfile.lock
- pods文件夾
- 刪除工程文件:
- xcworkspace
- 刪除項目中的frameworks文件夾下面,pods.xcconfig和libpods.a文件
- 進入target,在build phases中,刪除copy pods resources/Embed pods frameworks/check pods manifest.lock三項
- 刪除工程中對第三方庫的引用
三、發(fā)布項目到CocoaPods
- 很多時候,我們會自己造輪子,如果想托管到github作為第三方庫在 CocoaPods 中使用,就需要發(fā)布項目到 CocoaPods
- 在組件化等項目架構的使用方式中,會需要用到不方便開源的私有庫,如果想通過 CocoaPods 方便的集成和管理,就需要通過 CocoaPods 創(chuàng)建私有庫
3.1 發(fā)布開源庫到 CocoaPods
- 發(fā)布開源庫到 CocoaPods 不止一種方式,這里通過Pod trunk的方式發(fā)布開源庫到 CocoaPods
說明:使用pod trunk 發(fā)布項目到cocoapods需要cocoapods版本高于0.33
1.第三方庫代碼
- 編寫要開源的第三方庫的代碼,完成測試和bug修復。
2.github創(chuàng)建倉庫
- 創(chuàng)建一個和項目名同名的github倉庫。
3.clone github上的倉庫到本地
- clone 新創(chuàng)建的倉庫到本地。clone的項目一般會包含LICENSE和README.md文件
4.Xcode創(chuàng)建項目
- 將編寫完成的開源庫代碼文件以文件夾的形式(文件夾一般以開源庫命名)放在clone路徑中。
- 開源庫一般提供一個示例工程,在colne路徑中,創(chuàng)建一個新的xcode項目,一般以demo或者example的方式。并在demo或者example項目的根目錄中引用編寫完成的第三方開源庫文件(注:由于開源庫已經(jīng)在當前路徑中了,所以xcode項目引用的時候不要勾選copy it if need)。
- 編寫README.md
5.創(chuàng)建podspec 文件
$ cd clone根目錄
$ pod spec create hellohud
- 打開生成的podspec文件,此處為hellohud.podspec文件
- podspec編輯參考
- 注:不要用系統(tǒng)的編輯器打開,因為如果直接用系統(tǒng)的編輯器打開的話編輯過程中會對符號自動轉(zhuǎn)換編碼,而導致podspec文件驗證通不過。
Pod::Spec.new do |s|
s.name = "hellohud"
s.version = "0.0.1"
s.summary = "A state bar hud for iOS on window"
s.homepage = "https://github.com/username/HelloWindowHud"
s.license = "MIT"
s.author = { "username" => "username@163.com" }
s.source = { :git => "https://github.com/username/HelloWindowHud.git", :tag => s.version }
s.source_files = "HelloWindowHud/"
s.requires_arc = true
s.platform = :ios, "7.0"
end
使用#注釋掉不需要的選項
-
注:podspec中的內(nèi)容填寫有比較嚴格審查制度,如果規(guī)則錯誤會導致podspec文件無法使用。
- name 第三方庫的名稱
- version 第三方庫的版本(tag)
- summary 第三方庫的摘要
- homepage 第三方庫的首頁
- license 第三方庫使用的license
- author 第三方庫的作者
- source 第三方庫的git版本庫
- source__files 第三方庫的的source_file文件位置
- requires_arc 是否要求arc
- platform 第三方庫支持的平臺
- 除了上述基本信息外,還可以指定當前庫需要依賴的其他庫,如果當前庫依賴的庫為第三方庫,需要是已經(jīng)發(fā)布的第三方庫
-
注:
- 1.每個第三方庫支持的平臺不同,所以如果不是支持全平臺的第三方庫,在platform部分需要做platform說明。
- 2.source_files 要找對位置,這個極為重要。一般情況下,clone路徑下面會包含如下文件:
- LICENSE
- README.md
- DEMO/EXAMPLE
- 第三方庫
這種情況,source_files就是 'github上的倉庫名/'
注:以上操作可用命令完成
$ pod lib create Proj_name
6.commit項目到github
- 將已經(jīng)添加了.podspec文件的項目commit。
7.給項目打一個tag
$ cd clone路徑
$ git tag -a '0.0.1' -m 'tag release 0.01'
$ git push --tags
$ git tag // 查看所有的tag
$ git tag -d 0.0.1 // 刪除對應的tag
$ git push origin :0.0.1 //遠程倉庫刪除tag
8.驗證podspec文件是否符合要求
$ pod spec lint HelloWindowHud.podspec // 聯(lián)網(wǎng)
$ pod lib lint // 不聯(lián)網(wǎng)
- 報錯:
-
echo "2.3" > .swift-version.- 解決:直接運行
$ echo "2.3" > .swift-version
- 解決:直接運行
-
9.注冊pod trunk
/**
* @param email 用戶郵箱
* @param username 用戶名
* @param description 設備描述
*/
$ pod trunk register email 'username' --description='device description'
// pod trunk register emailemail@163.com hellohud
查看賬戶信息
$ pod trunk me
10.podspec驗證沒有報錯,則發(fā)布
$ pod trunk push HelloWindowHud.podspec
- 報錯:
- 對于1.2.0版本的 CocoaPods 會導致無法發(fā)布podspec而報錯
- 解決:升級 CocoaPods 1.2.1
參考CocoaPods issue6697
- 解決:升級 CocoaPods 1.2.1
- 對于1.2.0版本的 CocoaPods 會導致無法發(fā)布podspec而報錯
11.第一次發(fā)布需要去認領podspec
- 新項目第一發(fā)布需要認領。
- 認領時,輸入cocoapods的username 、 email 以及認領的第三方庫名字即可。
- 認領成功的同時,即表示發(fā)布成功。
更新pod 搜索自己的第三方庫即可
$ pod repo update
$ pod search CodePush
- 注:在做搜索之前最好清一下cocoapods的緩存,否則會搜不到最新發(fā)布的庫
$ rm ~/Library/Caches/CocoaPods/search_index.json- 最后執(zhí)行
pod search
- [挖坑填坑:上述操作中5、6、7順序不能換]
3.2 利用 CocoaPods 創(chuàng)建私有庫
1.創(chuàng)建私有庫git倉庫(托管私有庫源碼) & 創(chuàng)建私有spec倉庫(和CocoaPods的podspec倉庫相同)
2.將私有 spec 倉庫添加到 CocoaPods
$ pod repo add [spec倉庫名] [私有spec倉庫地址]- 查看clone到本地的私有spec倉庫
~/.cocoapods/repos
3.創(chuàng)建私有庫及編輯podspec文件和校驗,參考 CocoaPods 發(fā)布開源庫中的操作 1 - 9 完全相同
-
注意:
- 做spec文件校驗的時候,由于我們要創(chuàng)建的是私有庫,除了開啟訪問權限的成員外,任何人無法直接訪問,這種情況會有警告
- WARN | url: The URL () is not reachable.,避免警告的操作 pod spec lint CodeLog.podspec --private
或者
pod spec lint CodeLog.podspec --allow-warnings
- 做spec文件校驗的時候,由于我們要創(chuàng)建的是私有庫,除了開啟訪問權限的成員外,任何人無法直接訪問,這種情況會有警告
4.將私有庫的pospec文件提交到私有 spec 倉庫
cd 私有代碼庫clone路徑// 目的是可以拿到其中的.podspec文件$ pod repo push [spec倉庫名] [私有庫.podspec文件]// 將.podspec文件提交到私有spec倉庫, 當遇到有警告而導致的驗證失敗時,可以后面加--allow-warnings參數(shù)避免警告提交完成,執(zhí)行pod search驗證即可。
5.集成私有庫
- 如果 Podfile 中不指定 source 的地址,則默認github的specs地址,但私有庫的spec地址為自己創(chuàng)建的私有 spec 地址,所以包含私有庫的 Podfile 文件要指定私有庫podspec文件的私有 spec 倉庫地址。如果指定 source 的地址并且主工程同時包含開源庫和私有庫,則需要同時指定私有spec地址和CocoaPods的spec地址,這樣在添加依賴庫的時候會同時從私有 specs 地址和 CocoaPods 的 specs 地址添加。
source 'https://github.com/CocoaPods/Specs.git'source 'http://git.oschina.net/username/CodeSpec.git'
source 'https://github.com/CocoaPods/Specs.git'
source 'http://git.oschina.net/username/CodeSpec.git'
platform:ios, '8.0'
target 'demo' do
// 私有庫
// github托管的開源庫
end
備注:
- 私有庫引用私有庫,驗證podspec,需加上私有庫的spec地址
pod lib lint --sources='https://github.com/CocoaPods/Specs.git,私有spec倉庫地址' // 本地驗證
pod spec lint --sources='https://github.com/CocoaPods/Specs.git,私有spec倉庫地址' // 遠程驗證,也可以加上--allow-warnings去掉警告
- 利用podSpec文件將庫文件分為不同的虛擬文件夾,方便對功能或者類文件進行針對性的分類
s.subspec 'ClassA' do |classa|
classa.source_files = 'tt/Classes/ClassA/*'
end
分類后的虛擬文件夾為ClassA,其文件來源在路徑tt/Classes/ClassA/*中
-
私有庫更新:
- 對于不需要新增tag的情況,需刪除原git倉庫中的tag,然后創(chuàng)建相同的tag上傳,這種方式,在私有庫更新完使用時,需要清空cocoapods緩存
pod repo update 私有spec倉庫名// 更新私有倉庫spec
pod cache list// 查看cocoapods 緩存
pod cache clean 私有庫名字// 清除對應私有庫的緩存
Podfile中,去掉對私有庫的依賴,然后pod update
Podfile中,添加對私有庫的依賴,然后pod update - 對于新增tag的情況,直接新增tag即可
pod repo push [spec倉庫名] [私有庫.spec]
- 對于不需要新增tag的情況,需刪除原git倉庫中的tag,然后創(chuàng)建相同的tag上傳,這種方式,在私有庫更新完使用時,需要清空cocoapods緩存
-
【報錯】[!] An unexpected version directory
Classeswas encountered for the/Users/name/.cocoapods/repos/gitee-yourname-test/testPod in thegitee-yourname-testrepository.- 解決方式:進入/Users/name/.cocoapods/repos/gitee-yourname-test,刪除gitee-yourname-test文件夾就可以了