CocoaPods 使用總結(jié)

CocoaPods簡(jiǎn)介

CocoaPods 是專(zhuān)門(mén)為 iOS 工程提供第三方依賴(lài)庫(kù)的管理工具调榄,通過(guò) CocoaPods,我們可以更方便地管理每個(gè)第三方庫(kù)的版本涣澡,而且不需要我們做太多的配置态贤,就可以直觀、集中和自動(dòng)化地管理我們項(xiàng)目的第三方庫(kù)梁剔。

CocoaPods 將所有依賴(lài)的庫(kù)都放在一個(gè)名為 Pods 的項(xiàng)目下,然后讓主項(xiàng)目依賴(lài) Pods 項(xiàng)目舞蔽。然后荣病,我們編碼工作都從主項(xiàng)目轉(zhuǎn)移到 Pods 項(xiàng)目。Pods 項(xiàng)目最終會(huì)編譯為一個(gè) libPod-項(xiàng)目名.a 靜態(tài)庫(kù)渗柿,主項(xiàng)目依賴(lài)于這個(gè)靜態(tài)庫(kù)个盆。

對(duì)于資源文件脖岛,CocoaPods 提供了一個(gè)名為 Pods-resources.shbash 腳本,該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行颊亮,將第三方庫(kù)的各種資源文件復(fù)制到目標(biāo)目錄中柴梆。CocoaPods 通過(guò)一個(gè)名為 Pods.xcconfig 的文件來(lái)在編譯時(shí)設(shè)置所有的依賴(lài)和參數(shù)。CocoaPods 是用 Ruby 寫(xiě)的终惑,并由若干個(gè) Ruby 包 (gems) 構(gòu)成的绍在。在解析整合過(guò)程中,最重要的幾個(gè) gems 分別是: CocoaPods/CocoaPods雹有、CocoaPods/CoreCocoaPods/Xcodeproj偿渡。

CocoaPod的核心組件

  • CocoaPods/CocoaPod
    這是一個(gè)面向用戶(hù)的組件,每當(dāng)執(zhí)行一個(gè) pod 命令時(shí)霸奕,這個(gè)組件都將被激活溜宽。該組件包括了所有使用 CocoaPods 涉及到的功能,并且還能通過(guò)調(diào)用所有其它的 gems 來(lái)執(zhí)行任務(wù)质帅。
  • CocoaPods/Core
    Core 組件提供支持與 CocoaPods 相關(guān)文件的處理适揉,文件主要是 Podfilepodspecs
  • Podfile
    Podfile 是一個(gè)文件临梗,用于定義項(xiàng)目所需要使用的第三方庫(kù)涡扼。該文件支持高度定制,你可以根據(jù)個(gè)人喜好對(duì)其做出定制盟庞。更多相關(guān)信息,請(qǐng)查閱 Podfile 指南汤善。
  • Podspec
    .podspec 也是一個(gè)文件什猖,該文件描述了一個(gè)庫(kù)是怎樣被添加到工程中的。它支持的功能有:列出源文件红淡、framework不狮、編譯選項(xiàng)和某個(gè)庫(kù)所需要的依賴(lài)等。
  • CocoaPods/Xcodeproj
    這個(gè) gem 組件負(fù)責(zé)所有工程文件的整合在旱。它能夠創(chuàng)建并修改 .xcodeproj.xcworkspace 文件摇零。它也可以作為單獨(dú)的一個(gè) gem 包使用。如果你想要寫(xiě)一個(gè)腳本來(lái)方便地修改工程文件桶蝎,那么可以使用這個(gè) gem驻仅。

私有庫(kù)開(kāi)發(fā)流程

一般公司都會(huì)搭建自己的 git 服務(wù)器,在實(shí)戰(zhàn)項(xiàng)目中登渣,經(jīng)常使用 Cocoapods 管理自己的私有庫(kù)噪服。

  • git 倉(cāng)庫(kù)至少需要兩個(gè),一個(gè)用于管理私有庫(kù)對(duì)應(yīng)版本的 podspec 文件胜茧,一個(gè)用于存放私有庫(kù)的源文件粘优。
  • 查看現(xiàn)有的 podspec 源地址:
cd ~/.cocoapods/repos

創(chuàng)建一個(gè)私有的 podspec 主要包括如下幾步:

  • 創(chuàng)建一個(gè)私有的 Spec Repo,用于管理私有庫(kù)對(duì)應(yīng)版本的 podspec 文件;
  • 創(chuàng)建 pod 私有庫(kù)所需要的項(xiàng)目工程文件雹顺,并上傳到私有庫(kù)丹墨;
  • 創(chuàng)建 pod 所對(duì)應(yīng)的 podspec 文件,并進(jìn)行驗(yàn)證/測(cè)試嬉愧;
  • 向私有的 Spec Repo 中提交 podspec贩挣;
  • 使用 pod 庫(kù);

創(chuàng)建一個(gè)私有的 Spec Repo

  • 在自己公司的 git 服務(wù)器上創(chuàng)建 SpecsRepo 倉(cāng)庫(kù)英染;
  • 將私有 SpecsRepo 關(guān)聯(lián)到本地揽惹;
pod repo add IMXSpecsRepo http://192.168.120.32/app/sisi-iOS/IMXSpecsRepo.git

查看 SpecsRepo 是否創(chuàng)建成功

cd ~/.cocoapods/repos

創(chuàng)建 pod 私有庫(kù)所需要的項(xiàng)目工程

命令行創(chuàng)建

pod lib create 倉(cāng)庫(kù)名字 --template-url=http://192.168.120.32/app/sisi-iOS/IMXPodTemplte

手動(dòng)創(chuàng)建

手動(dòng)創(chuàng)建 Xcode 工程項(xiàng)目,創(chuàng)建 podspec 文件

pod spec create XXXX.podspec

修改 podspec 文件

Pod::Spec.new do |s|
  s.name             = 'AKCBrowser'
  s.version          = '0.0.1'
  s.summary          = 'A short description of AKCBrowser.'

  # This description is used to generate tags and improve search results.
  #   * Think: What does it do? Why did you write it? What is the focus?
  #   * Try to keep it short, snappy and to the point.
  #   * Write the description between the DESC delimiters below.
  #   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
  TODO: Add long description of the pod here.
  DESC

  s.homepage         = 'http://192.168.120.32/app/akc-framework-ios/AKCBrowser.git'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'sunjinshuai' => 's_mike@163.com' }
  s.source           = { :git => 'http://192.168.120.32/app/akc-framework-ios/AKCBrowser.git', :tag => s.version.to_s }

  s.static_framework      = true
  s.requires_arc = true
  s.frameworks = 'UIKit', 'Foundation'
  s.ios.deployment_target = '8.0'
  s.xcconfig = {
    'GCC_PREPROCESSOR_DEFINITIONS' => 'MAS_SHORTHAND_GLOBALS=1'
  }
  s.resource_bundles = {
    'Browser' => ['AKCBrowser/Assets/Browser/*.*']
  }
  s.source_files = 'AKCBrowser/Classes/**/*'

  s.dependency 'SDWebImage','4.2.3'
  s.dependency 'YYImage'
  s.dependency 'AKCFoundation'
  s.dependency 'AFNetworking/Reachability'
  s.dependency 'SVProgressHUD'
  s.dependency 'AKCLog'

end

podspec 語(yǔ)法簡(jiǎn)介

s.name:私有庫(kù)的名稱(chēng)四康,`pod search`搜索的關(guān)鍵詞搪搏,注意這里一定要和`.podspec`的名稱(chēng)一樣,否則報(bào)錯(cuò)闪金。
s.version:私有庫(kù)的版本疯溺。
s.ios.deployment_target:支持的pod最低版本。
s.summary:私有庫(kù)簡(jiǎn)介哎垦。
s.description:私有庫(kù)詳細(xì)介紹囱嫩。
s.homepage:私有庫(kù)在GitHub上的地址。
s.license:開(kāi)源協(xié)議漏设。
s.author:作者墨闲。
s.social_media_url:社交網(wǎng)址,你的podspec發(fā)布成功后會(huì)@你
s.source:私有庫(kù)在GitHub上的地址和版本號(hào)郑口。
s.source_files:私有庫(kù)對(duì)外共享的.h和.m文件鸳碧。
s.requires_arc:是否支持ARC。

更多語(yǔ)法查看(http://guides.cocoapods.org/making/specs-and-specs-repo.html)

上傳項(xiàng)目工程的源文件

git add -A
git commit -m "first commit"
git remote add origin http://192.168.120.32/app/akc-framework-ios/AKCBrowser.git
git push -u origin master
git tag -m "first release" 0.0.1
git push --tags     #推送tag到遠(yuǎn)端倉(cāng)庫(kù)

驗(yàn)證 podspec 文件

pod lib lint --allow-warnings --verbose
pod lib lint --use-libraries --allow-warnings   // 使用靜態(tài)庫(kù)后的用法
pod lib lint --sources=http://192.168.120.32/app/sisi-iOS/IMXSpecsRepo.git

當(dāng)看到 AKCBrowser passed validation犬性。表示驗(yàn)證通過(guò)瞻离。

向 Spec Repo 中提交 podspec 文件

# 如果依賴(lài)其他私有源 同樣需要加上 --sources 參數(shù)
pod repo push IMXSpecsRepo AKCFoundation.podspec --allow-warnings
pod repo push IMXSpecsRepo AKCProtobuf.podspec --allow-warnings --use-libraries  // 使用靜態(tài)庫(kù)后的用法

pod repo push IMXSpecsRepo AKCFoundation.podspec --allow-warnings --sources='http://192.168.120.32/ddcang/iOSGiftBox/SpecsRepo.git'

多 target 時(shí) Podfile 該如何寫(xiě)

platform :ios, '8.0'

def commonPods #通用pods集
    pod 'AFNetworking', '~> 2.0'
    pod 'Masonry'
end

def appOnlyPods #app專(zhuān)用pods集
    pod 'MBProgressHUD'
end

def extensionPods #擴(kuò)展專(zhuān)用pods集
    pod 'GTSDKExtension'
end

target :TestCocoaPods do
    commonPods
    appOnlyPods

    target :TestCocoaPodsTests do
    inherit! :search_paths
    # Pods for testing
    end

    target :TestCocoaPodsUITests do
        inherit! :search_paths
        # Pods for testing
    end
end

target :SecondTarget do
    commonPods
end

如何忽略Pods警告

Podfile 中對(duì)應(yīng)的 target 或分組下加上關(guān)鍵字 inhibit_all_warnings即可。

如何直接引用第三方庫(kù)中的頭文件

在用 CocoaPods 集成第三方庫(kù)之后乒裆,默認(rèn)情況下套利,我們需要使用類(lèi)似 #import <XXX/YYY.h>的方式引入第三方庫(kù)的頭文件。

可以在 Build Settings -> User Header Search Paths 中添加 ${SRCROOT} 并設(shè)置成 recursive鹤耍,這樣我們就可以直接使用 #impot "YYY.h"這種方式了肉迫。

pod install 和 pod update 的選擇

pod install:

按照官方文檔所說(shuō),pod install在第一次檢索集成第三方以及每一次在 Podfile 中新增惰蜜、更改或刪除 pod 的時(shí)候使用昂拂。每一次執(zhí)行 pod install命令,它都會(huì)下載安裝新的 pod抛猖,并且會(huì)把每一個(gè)安裝的 pod 的版本信息寫(xiě)入 Podfile.lock 文件格侯。Podfile.lock 文件跟蹤每一個(gè)安裝的 pod 的版本并且上鎖鼻听。每一次執(zhí)行 pod install命令,只解決還沒(méi)有在 Podfile.lock 中列出的依賴(lài):對(duì)于已在 Podfile.lock 中列出的 pod联四,會(huì)下載指定的版本撑碴,不會(huì)檢查是否有新版本。對(duì)于沒(méi)有在 Podfile.lock 中列出的 pod朝墩,它會(huì)搜索并安裝 Podfile 中指定的版本醉拓。

pod update:

直接執(zhí)行 pod update命令會(huì)檢查安裝 Podfile 中列出的所有 pod 的最新版本。只有當(dāng)你想要更新 pod 庫(kù)的版本時(shí)才使用 pod update收苏;它不管 Podfile.lock是否存在亿卤,都會(huì)讀取 Podfile 文件的最新版本,下載好之后鹿霸,重新生成 Podfile.lock文件排吴。

兩者的區(qū)別:

  • pod install命令來(lái)安裝新的 pod,每次在 Podfile 中新增和刪除 pod 都使用 pod install命令懦鼠。

  • Podfile 中添加新的 pod 后應(yīng)該用 pod install命令钻哩,而不是 pod update命令。通過(guò) pod install命令安裝新的 pod 而不用擔(dān)心在同一進(jìn)程中修改已有的 pod肛冶。

  • pod update命令僅用在更新指定 pod 到指定版本或者更新所有 pod街氢。

如果想更新指定的 pod 倉(cāng)庫(kù),可以使用

pod update XXX –no-repo-update

如果想安裝新添加的庫(kù)

pod install –no-repo-update

當(dāng)需要在 CocoaPods 中刪除一個(gè)我們不要的庫(kù)時(shí) 可以在 Podfile 中直接刪除相關(guān)庫(kù)睦袖;

pod update --no-repo-update 會(huì)在刪除相關(guān)庫(kù)時(shí) 更新其他庫(kù)版本
pod update XXX --no-repo-update 只會(huì)刪除相關(guān)庫(kù) 和下方一致
pod install --no-repo-update 只會(huì)刪除相關(guān)庫(kù)

關(guān)于版本指定約束

一般我們?cè)谑褂?cocoapods 導(dǎo)入第三方庫(kù)前都會(huì)生成一個(gè) podfile 文件珊肃,文件中記錄著我們要導(dǎo)入的第三方庫(kù)以及對(duì)應(yīng)的版本信息,比如:

pod 'SDWebImage', '~> 4.3.2'

cocoapods 導(dǎo)入 SDWbImage馅笙,版本號(hào) 4.3.2 和版本號(hào)處于 4.3.2-4.4 之間的近范,不包括 4.4 和更高版本。

pod 'SDWebImage' --- 不指定版本延蟹,表示希望使用最新版本
pod 'SDWebImage', '4.3.2' --- 指定明確版本,表示只想要這個(gè)版本
邏輯關(guān)系
'> 0.1' --- 版本號(hào)大于0.1的
'>= 0.1' --- 版本0.1和版本號(hào)大于0.1的
'< 0.1' --- 版本號(hào)小于0.1的
'<= 0.1' --- 版本號(hào)0.1和版本號(hào)小于0.1的
最優(yōu)匹配
'~> 0.1.2' --- 版本0.1.2和版本號(hào)處于0.1.2-0.2之間的,不包括0.2和更高版本
'~> 0.1' --- 版本0.1和版本號(hào)處于0.1-1.0之間的,不包括1.0和更高版本
'~> 0' --- 版本0和更高叶堆,和沒(méi)設(shè)沒(méi)啥區(qū)

tag 改動(dòng)原則:

  • 增加 api阱飘,修改第三位;
  • 修改 api,修改第二位虱颗;
  • 大版本變更修改第一位;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沥匈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子忘渔,更是在濱河造成了極大的恐慌高帖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畦粮,死亡現(xiàn)場(chǎng)離奇詭異散址,居然都是意外死亡乖阵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)预麸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瞪浸,“玉大人,你說(shuō)我怎么就攤上這事吏祸《云眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵贡翘,是天一觀的道長(zhǎng)蹈矮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鸣驱,這世上最難降的妖魔是什么泛鸟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮丐巫,結(jié)果婚禮上谈况,老公的妹妹穿的比我還像新娘。我一直安慰自己递胧,他們只是感情好碑韵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缎脾,像睡著了一般祝闻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遗菠,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天联喘,我揣著相機(jī)與錄音,去河邊找鬼辙纬。 笑死豁遭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贺拣。 我是一名探鬼主播蓖谢,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼譬涡!你這毒婦竟也來(lái)了闪幽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涡匀,失蹤者是張志新(化名)和其女友劉穎盯腌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體陨瘩,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腕够,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年级乍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燕少。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卡者,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出客们,到底是詐尸還是另有隱情崇决,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布底挫,位于F島的核電站恒傻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏建邓。R本人自食惡果不足惜盈厘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望官边。 院中可真熱鬧沸手,春花似錦、人聲如沸注簿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诡渴。三九已至捐晶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妄辩,已是汗流浹背惑灵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眼耀,地道東北人英支。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哮伟,于是被迫代替她去往敵國(guó)和親潭辈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容