Cocoapods猎荠,讓iOS開發(fā)更簡單(一):走近Cocoapods

前段時間結合自己平時的學習研究做了一個有關pods的內部分享伊磺,接下來會把相關資料以文字的形式分享出來,預估是一個pods系列酒奶,希望能較為全面的將其相關知識點與實踐運用呈現出來蚁孔,也希望和大家多多交流。話不多說惋嚎,那我們就即刻出發(fā)吧杠氢!

pod系列文章
Cocoapods,讓iOS開發(fā)更簡單(一):走近Cocoapods
Cocoapods另伍,讓iOS開發(fā)更簡單(二):創(chuàng)建私有庫
Cocoapods鼻百,讓iOS開發(fā)更簡單(三):實踐經驗匯總
一文帶你快速分清靜態(tài)庫-動態(tài)庫-Framework

是什么

  • CocoaPods是OS和iOS平臺上的一個第三方依賴庫管理工具,通過它我們可以更加高效的依賴并管理被稱為“Pods”的庫摆尝。

  • 在iOS開發(fā)中愕宋,現在的Cocoapods已經是事實上的添加第三方庫的標準方式了。

  • 它擁有超過49,000個第三方庫结榄,超過3,000,000個app都在使用CocoaPods做依賴管理,CocoaPods可以幫助你優(yōu)雅的擴展你的項目囤捻。

為什么使用它

在iOS開發(fā)項目中臼朗,經常會使用第三方庫,手動引入流程復雜,并且?guī)熘g存在依賴關系视哑,手動管理較繁瑣绣否。但采用CocoaPods,安裝和升級都只是一句命令的事情挡毅,讓開發(fā)者可專注于業(yè)務本身蒜撮。

  • 方便:方便查找、依賴跪呈、管理和更新第三方庫段磨,同時方便了工程調試和階段性開發(fā);

  • 規(guī)范:庫的使用及創(chuàng)建都要符合標準耗绿;

  • 直觀:對于庫的創(chuàng)建和使用都清晰明了的按格式有標注苹支;

  • 集中:庫及項目中都有指定的文件進行相應的管理;

  • 自動化:在引入第三方庫時可以做到自動為項目完成各種各樣的配置误阻,包括配置編譯階段债蜜、連接器選項、甚至是ARC環(huán)境下的-fno-objc-arc配置等究反;

它是怎么起作用的

CocoaPods是用 Ruby 寫的寻定,并由若干個 Ruby 包 (gems) 構成的。核心組件gems 分別是: CocoaPods/CocoaPods精耐、CocoaPods/Core和 CocoaPods/Xcodeproj狼速。

  • CocoaPods/CocoaPod
    這是一個面向用戶的組件,每當執(zhí)行一個 pod 命令時黍氮,這個組件都將被激活唐含。該組件包括了所有使用 CocoaPods 涉及到的功能,并且還能通過調用所有其它的 gems 來執(zhí)行任務沫浆。

  • CocoaPods/Core
    Core 組件提供支持與 CocoaPods 相關文件的處理捷枯,文件主要是 podfile 和 podspec。

  • CocoaPods/Xcodeproj
    這個 gem 組件負責所有工程文件的整合专执。它能夠創(chuàng)建并修改 .xcodeproj 和 .xcworkspace 文件淮捆。

基于以上核心組件,實現:

  • 自動化配置:通過一個名為 Pods.xcconfig 的文件來在編譯時設置所有的依賴和參數本股。
  • 管理資源文件:CocoaPods 提供了一個名為 Pods-resources.sh 的 bash 腳本攀痊,該腳本在每次項目編譯的時候都會執(zhí)行,將第三方庫的各種資源文件復制到目標目錄中拄显。
  • 依賴管理:CocoaPods將所有依賴的庫都放在一個名為Pods的項目下苟径,然后讓主項目依賴Pods項目,Pods項目最終會編譯為一個libPod-項目名.a靜態(tài)庫(Pods_xxx.framework)躬审,主項目依賴于該庫棘街。

Spec Repo

Spec Repo是所有的Pods的一個索引蟆盐,可以理解為是一個容器。對于公有的Spec Repo遭殉,所有公開的Pods都通過這個庫進行索引石挂,其實際是GitHub上的一個Git倉庫。當開發(fā)者使用了CocoaPods后會被clone到本地的~/.cocoapods/repos目錄下险污,可以進入到這個目錄看到master文件夾就是這個官方的Spec Repo痹愚,目錄的結構為:

├── Specs
    └── [SPEC_NAME]
        └── [VERSION]
            └── [SPEC_NAME].podspec

如何用

安裝Cocoapods環(huán)境

CocaPods的安裝在ruby環(huán)境上通過Gem 安裝,具體安裝步驟不贅述蛔糯。

//安裝CocoaPods
sudo gem install cocoapods
#sudo gem install -n /usr/local/bin cocoapods

pod setup

podSpec文件

podSpec文件可以理解為一個庫的信息簡介和說明書拯腮,支持列出源文件、framework渤闷、編譯選項和某個庫所需要的依賴等疾瓮。
podspec文件是一個Ruby的文件,示例:

Pod::Spec.new do |s|
  s.name             = "PodTestLibrary"    #名稱
  s.version          = "0.1.0"             #版本號
  s.summary          = "Just Testing."     #簡短介紹飒箭,下面是詳細介紹
  s.description      = <<-DESC
                       Testing Private Podspec.
                       DESC
  s.homepage         = "https://github.com/hello/PodTestLibrary"         
  #主頁,這里要填寫可以訪問到的地址狼电,不然驗證不通過
  s.license          = 'MIT'              #開源協(xié)議
  s.author           = { "hello" => "hello@good.com" }            #作者信息
  s.source           = { :git => "https://github.com/hello/PodTestLibrary.git", :tag => "0.0.1" }      
  #項目地址,支持HTTP和HTTPS弦蹂,最好使用HTTPS

  s.platform     = :ios, '7.0'            #支持的平臺及最低版本

  s.source_files = 'Pod/Classes/**/*'     
  #代碼源文件地址肩碟,如果有多個目錄下則用逗號分開,目錄指定了pod install下載的內容
  s.resource_bundles = {
    'PodTestLibrary' => ['Pod/Assets/*.png']
  }                                       #資源文件地址

  s.public_header_files = 'Pod/Classes/**/*.h'   #公開頭文件地址
  s.frameworks = 'UIKit'                  #所需的framework凸椿,多個用逗號隔開
  s.dependency 'AFNetworking', '~> 2.3'   
  #依賴關系削祈,該項目所依賴的其他庫,如果有多個需要填寫多個s.dependency
end

subspec

subspec模板:

s.subspec '子模塊名稱' do |別名脑漫,不能和子模塊名稱相同髓抑,比如ss|

ss.source_files = ''

end

subspec示例:

Pod::Spec.new do |s|
  s.name             = "PodTestLibrary"
  s.version          = "1.0.0"
  s.summary          = "Just Testing."
  s.description      = <<-DESC
                       Testing Private Podspec.
                       * Markdown format.
                       DESC
  s.homepage         = "https://github.com/hello/PodTestLibrary"
  s.license          = 'MIT'
  s.author           = { "hello" => "hello@good.com" }
  s.source           = { :git => "https://github.com/hello/PodTestLibrary.git", :tag => "1.0.0" }

  s.platform     = :ios, '7.0'

  #s.source_files = 'Pod/Classes/**/*'
  #s.resource_bundles = {
  #  'PodTestLibrary' => ['Pod/Assets/*.png']
  #}
  #s.public_header_files = 'Pod/Classes/**/*.h'

  s.subspec 'NetWorkEngine' do |networkEngine|
      networkEngine.source_files = 'Pod/Classes/NetworkEngine/**/*'
      networkEngine.public_header_files = 'Pod/Classes/NetworkEngine/**/*.h'
      networkEngine.dependency 'AFNetworking', '~> 2.3'
  end

  s.subspec 'CommonTools' do |commonTools|
      commonTools.source_files = 'Pod/Classes/CommonTools/**/*'
      commonTools.public_header_files = 'Pod/Classes/CommonTools/**/*.h'
      commonTools.dependency 'OpenUDID', '~> 1.0.0'
      commonTools.dependency 'NetWorkEngine'
  end

  s.frameworks = 'UIKit'
end

原項目整體的依賴dependency、源文件source_files优幸、頭文件public_header_files和資源文件resource等都移動到了各自的subspec中吨拍,每個subspec之間也可以有相互的依賴關系,比如CommonTools就依賴于NetWorkEngine网杆。

在podSpec中建立subspec羹饰,有以下作用:

  • pod依賴文件劃分在不同的目錄結構下;
  • 實現按需依賴碳却;

Podfile文件

Podfile 文件用于定義項目所需要使用的第三方庫以及項目的基本配置队秩。舉例如下:

source 'https://github.com/CocoaPods/Specs.git'  # 官方庫源
source 'https://gitlab.corp.ttt.com:hello/PodTestSpec.git'   # 私有庫源


platform :ios, '7.0'

pod 'PodTestLibrary/NetWorkEngine', '1.0.0'  #依賴某一個部分

pod 'PodTestLibrary', '1.0.0'   #使用整個庫

管理依賴庫版本號

  • 不指定任何版本號,舉例為:
pod 'AFNetworking'
  • 指定固定的版本號昼浦,舉例:
pod 'AFNetworking', '1.0' // 版本號指定為1.0

還有一些靈活的依賴用法馍资,會在同系列后續(xù)文章專門板塊中介紹,敬請關注关噪。

Podfile.lock文件

Podfile.lock文件跟蹤最后一次更新pods以保存所有第三方庫的版本號鸟蟹。


podLock文件.png

Pods目錄

保存通過pod install 或 pod update下載下來的第三方庫的代碼物舒。

xxx.xcworkspace文件

接入CocoaPods后重新生成的一個工作空間,打開該文件進行開發(fā)戏锹。

常用命令

常用命令有:

pod --help:可以查看pod可以使用的命令;
pod repo list: 查看本地spec倉庫列表火诸;
pod init:項目pod初始化锦针,創(chuàng)建默認的Podfile文件;
pod install:安裝pods庫置蜀;
pod install --no-repo-update:安裝框架奈搜,不更新本地索引,不會升級本地代碼庫盯荤;
pod update:升級馋吗、添加、刪除框架秋秤;
pod update --no-repo-update:更新框架宏粤,不更新本地索引,可安裝框架或刪除不用的框架灼卢,但不會升級安裝已安裝的框架绍哎;
pod list:列出項目中所有依賴的庫;
pod repo update:從遠程倉庫更新本地spec repo倉庫鞋真;

哪些地方可以用

依賴公共庫

pod 'AFNetworking', '~> 0.1.5'

依賴私有庫

pod 'PodTestLibrary', '~> 0.1.0'

如果我們同時使用了公有庫和私有庫崇堰,我們只需要在Podfile的頭部同時把公有庫和私有庫的source加上即可。

創(chuàng)建私有庫

下面會在本系列中專門出一個創(chuàng)建私有庫的文章涩咖,大家敬請期待吧海诲。

創(chuàng)建公有庫

如果要添加到Cocoapods的官方庫了,可以使用trunk工具檩互,具體可以查看官方文檔
在 guides.cocoapods里面有一個 Getting setup with Trunk特幔,注冊 trunk,它的作用是能夠讓我們把本地的 spec 文件上傳到 gitHub的遠程索引庫盾似,發(fā)布自己的代碼到Cocoapods供廣大開發(fā)者使用敬辣。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市零院,隨后出現的幾起案子溉跃,更是在濱河造成了極大的恐慌,老刑警劉巖告抄,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撰茎,死亡現場離奇詭異,居然都是意外死亡打洼,警方通過查閱死者的電腦和手機龄糊,發(fā)現死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門逆粹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炫惩,你說我怎么就攤上這事僻弹。” “怎么了他嚷?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵蹋绽,是天一觀的道長。 經常有香客問我筋蓖,道長卸耘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任粘咖,我火速辦了婚禮蚣抗,結果婚禮上,老公的妹妹穿的比我還像新娘瓮下。我一直安慰自己翰铡,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布唱捣。 她就那樣靜靜地躺著两蟀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪震缭。 梳的紋絲不亂的頭發(fā)上赂毯,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音拣宰,去河邊找鬼党涕。 笑死,一個胖子當著我的面吹牛巡社,可吹牛的內容都是我干的膛堤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晌该,長吁一口氣:“原來是場噩夢啊……” “哼肥荔!你這毒婦竟也來了?” 一聲冷哼從身側響起朝群,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤燕耿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姜胖,有當地人在樹林里發(fā)現了一具尸體誉帅,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了蚜锨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片档插。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖亚再,靈堂內的尸體忽然破棺而出郭膛,到底是詐尸還是另有隱情,我是刑警寧澤氛悬,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布饲鄙,位于F島的核電站,受9級特大地震影響圆雁,放射性物質發(fā)生泄漏。R本人自食惡果不足惜帆谍,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一伪朽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汛蝙,春花似錦烈涮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至西土,卻和暖如春讶舰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背需了。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工跳昼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肋乍。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓鹅颊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親墓造。 傳聞我的和親對象是個殘疾皇子堪伍,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容