CocoaPods之Podfile\Podfile.lock

什么是Podfile ?

CocoaPods是用ruby實(shí)現(xiàn)的矛洞,因此Podfile文件的語法就是ruby的語法微姊。
podfile是一個(gè)說明文件,用以描述管理一個(gè)或者多個(gè)Xcode project的target的依賴庫分预。這個(gè)文件應(yīng)該且必須被命名為Podfile兢交。
Podfile可以非常簡單,下面的例子增加了Alamofire依賴庫到單個(gè)target:

target 'MyApp' do 
    use_frameworks! 
    pod 'Alamofire', '~> 3.0'
end

下面是一個(gè)更復(fù)雜的例子,Podfile鏈接了app和它的測試bundle:

source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/Artsy/Specs.git'

platform :ios, '9.0'
inhibit_all_warnings!

target 'MyApp' do
    pod 'GoogleAnalytics', '~> 3.1'
    # Has its own copy of OCMock 
    # and has access to GoogleAnalytics via the app 
    # that hosts the test target

    target 'MyAppTests' do 
        inherit! :search_paths 
        pod 'OCMock', '~> 2.0.1' 
    end
end

post_install do |installer|
    installer.pods_project.targets.each do |target| 
        puts target.name 
    end
end

如果你希望多個(gè)target共享同一個(gè)pods笼痹,那么可以用關(guān)鍵字abstract_target

# There are no targets called "Shows" in any Xcode projects
abstract_target 'Shows' do 
    pod 'ShowsKit' 
    pod 'Fabric'

    # Has its own copy of ShowsKit + ShowWebAuth
    target 'ShowsiOS' do 
        pod 'ShowWebAuth' 
    end

    # Has its own copy of ShowsKit + ShowTVAuth 
    target 'ShowsTV' do 
        pod 'ShowTVAuth' 
    end
end

Podfile中自帶一個(gè)隱藏的配喳、默認(rèn)的abstract target,所以你也可以用如下的方式達(dá)到上面例子的同樣效果:

pod 'ShowsKit'
pod 'Fabric'

# Has its own copy of ShowsKit + ShowWebAuth
target 'ShowsiOS' do 
    pod 'ShowWebAuth'
end

# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV' do 
    pod 'ShowTVAuth'
end

指定pod版本

當(dāng)開始一個(gè)項(xiàng)目,你可能會想要使用最新版本的pod依賴庫凳干。 如果是這種情況,只需忽略版本要求晴裹。

pod 'SSZipArchive'

稍后在項(xiàng)目您可能想要使用特定版本的pod依賴庫,在這種情況下,您可以指定版本號。

pod 'Objection', '0.9'

除了沒有版本,或特定的一個(gè),也可以使用邏輯運(yùn)算符:

  • '> 0.1' 高于0.1的任何版本
  • '>= 0.1' 版本0.1或更高版本
  • '< 0.1' 低于0.1的任何版本
  • '<= 0.1' 版本0.1或更低的版本

除了邏輯運(yùn)算符救赐,還有一種運(yùn)算符:

  • '~> 0.1.2' 版本0.1.2和0.2版本之間的任意版本,不包括0.2和比0.2更高的版本
  • '~> 0.1' 版本0.1和版本1.0之間的任意版本,不包括1.0和比1.0更高的版本
  • '~> 0' 版本0或比版本0更高的版本,這基本上和不指定版本號的效果是一樣的涧团。

使用本地文件夾內(nèi)的依賴庫

如果你想建立一個(gè)本地依賴庫和項(xiàng)目之間的關(guān)系,即項(xiàng)目依賴本地文件夾的某個(gè)依賴庫,可以用關(guān)鍵字path

pod 'Alamofire', :path => '~/Documents/Alamofire'

使用podspec更新依賴庫

使用倉庫的master分支:

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git'

使用倉庫中其他的分支:

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git'

使用指定tag的分支:

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '3.1.1'

或者使用指定commit號的版本:

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :commit => '0f506b1c45'

使用path將把本地文件夾作為pod依賴庫的源泌绣,并且將會直接從給定的文件夾中把pod依賴庫鏈接進(jìn)pod項(xiàng)目钮追。這意味著我們對這個(gè)本地文件夾的編輯與修改將會被pod直接更新。

source 'URL' : 指定鏡像倉庫的源
platform : ios, '6.0' : 指定所支持系統(tǒng)和最低版本
inhibit_all_warnings! :屏蔽所有warning
workspace '項(xiàng)目空間名': 指定項(xiàng)目空間名
xcodeproj '工程文件名':指定xcodeproj工程文件名

~ > : 從指定版本到倒數(shù)第二位版本號升1為止阿迈,比如 '~> 1.2.1'是指 1.2.1 <= 版本 < 1.3.0元媚。'~>1.2'是指1.2<= 版本 < 2.0

舉例

pod 'AFNetworking'      //不顯式指定依賴庫版本,表示每次都獲取最新版本  
pod 'AFNetworking', '2.0'     //只使用2.0版本  
pod 'AFNetworking', '> 2.0'     //使用高于2.0的版本  
pod 'AFNetworking', '>= 2.0'     //使用大于或等于2.0的版本  
pod 'AFNetworking', '< 2.0'     //使用小于2.0的版本  
pod 'AFNetworking', '<= 2.0'     //使用小于或等于2.0的版本  
pod 'AFNetworking', '~> 0.1.2'     //使用大于等于0.1.2但小于0.2的版本  
pod 'AFNetworking', '~>0.1'     //使用大于等于0.1但小于1.0的版本  
pod 'AFNetworking', '~>0'     //高于0的版本苗沧,寫這個(gè)限制和什么都不寫是一個(gè)效果刊棕,都表示使用最新版本  

CocoaPods pod install/pod update更新慢的問題

/默認(rèn)執(zhí)行pod install 或者 pod update命令,會更新遠(yuǎn)程cocopodsde spec庫待逞。所以導(dǎo)致命令執(zhí)行的比較慢甥角,我們可以采用以下命令來提高更新速度,不更新CocoaPods的spec倉庫直接install/update飒焦。
pod update --verbose --no-repo-update
pod install --verbose --no-repo-update

Podfile和Target

Podfile本質(zhì)上是用來描述Xcode工程中的targets用的蜈膨。如果我們不顯式指定Podfile對應(yīng)的target,CocoaPods會創(chuàng)建一個(gè)名稱為default的隱式target牺荠,會和我們工程中的第一個(gè)target相對應(yīng)翁巍。換句話說,如果在Podfile中沒有指定target休雌,那么只有工程里的第一個(gè)target能夠使用Podfile中描述的Pods依賴庫灶壶。

項(xiàng)目存在多Target情況

項(xiàng)目存在多個(gè)Target的時(shí)候,需要配置Podfile文件來支持新增加的Target杈曲,否則只支持項(xiàng)目默認(rèn)建立時(shí)生成的Target:

a.多個(gè)Target使用相同的pods依賴庫

a驰凛、默認(rèn)新建的項(xiàng)目只有一個(gè)target,但是我們可以給項(xiàng)目天阿基額外的target担扑。如果項(xiàng)目中存在多個(gè)target恰响,且兩個(gè)Target所依賴的的第三方庫完全相同,則可以使用
link_with關(guān)鍵字,將Podfile寫成如下方式:

link_with 'CocoaPodsTest', 'Second'  
platform :ios  
platform :ios, ‘9.0’    
pod 'AFNetworking', '~> 2.0'  

link_with 'CocoaPodsTest', 'Second'  
platform :ios    
pod 'Reachability',  '~> 3.0.0'    
pod 'SBJson', '~> 4.0.0'    
    
platform :ios, '7.0'    
pod 'AFNetworking', '~> 2.0'   

如果你按照上面的寫法編輯Podfile涌献,然后執(zhí)行pod undate 或pod install胚宦,你會發(fā)現(xiàn)以下的錯(cuò)誤:

Snip20161204_1.png

意思是link_with關(guān)鍵字已經(jīng)過期,現(xiàn)在不在支持燕垃,我們需要用target blocks來代替link_with枢劝。查看官方文檔,如下:
Snip20161204_3.png

所以卜壕,我們可以通過abstract_target和target繼承的方式代替link_with.

b.多個(gè)的Target需要不同的依賴庫

如果不同的target使用不同的依賴庫您旁,則可以:

platform :ios  
target :'Test' do  
pod 'Reachability'  
pod 'SBJson'     
pod 'AFNetworking'   
end    
    
target :'Second' do  
pod 'OpenUDID'   
end  

inhibit_all_warnings!的作用

用于屏蔽cocoapods庫里面的所有警告。


Snip20161204_2.png

這個(gè)特性也能在子target里面定義轴捎,如果你想屏蔽某pod里面的警告也是可以的:

pod 'SSZipArchive', :inhibit_warnings => true

use_frameworks!的作用

在pods中用frameworks替代靜態(tài)庫鹤盒。
另蚕脏,一般開發(fā)swift項(xiàng)目時(shí),我們會在podfile中添加這一句昨悼。

podspec文件

后綴名為podspec(cocoapods specification)的文件是cocoapods的說明文件蝗锥,該文件為Pods依賴庫的描述文件,每個(gè)Pods依賴庫必須有且僅有那么一個(gè)描述文件率触。該文件包括依賴庫的名字终议、版本、描述葱蝗、license穴张、author、source两曼、platform等信息皂甘。

什么是Podfile.lock?

這是 CocoaPods 創(chuàng)建的最重要的文件之一悼凑。它記錄了需要被安裝的 pod 的每個(gè)已安裝的版本偿枕。如果你想知道已安裝的 pod 是哪個(gè)版本,可以查看這個(gè)文件户辫。推薦將 Podfile.lock 文件加入到版本控制中渐夸,這有助于整個(gè)團(tuán)隊(duì)的一致性。Objc中國
Podfile.lock文件最大得用處在于多人開發(fā)渔欢。當(dāng)團(tuán)隊(duì)中的某個(gè)人執(zhí)行完pod install命令后墓塌,生成的Podfile.lock文件就記錄下了當(dāng)時(shí)最新Pods依賴庫的版本,這時(shí)團(tuán)隊(duì)中的其它人check下來這份包含Podfile.lock文件的工程以后奥额,再去執(zhí)行pod install命令時(shí)苫幢,獲取下來的Pods依賴庫的版本就和最開始用戶獲取到的版本一致。如果沒有Podfile.lock文件垫挨,后續(xù)所有用戶執(zhí)行pod install命令都會獲取最新版本的依賴庫韩肝,這就有可能造成同一個(gè)團(tuán)隊(duì)使用的依賴庫版本不一致,這對團(tuán)隊(duì)協(xié)作來說絕對是個(gè)災(zāi)難九榔!在這種情況下伞梯,如果團(tuán)隊(duì)想使用當(dāng)前最新版本的依賴庫,有兩種方案:

  • 1.更改Podfile帚屉,使其指向最新版本的依賴庫;
  • 2.執(zhí)行pod update命令漾峡;

當(dāng)執(zhí)行pod install 命令時(shí)攻旦,首先會根據(jù)Podfile文件指定的內(nèi)容,安裝依賴庫生逸,如果有Podfile.lock文件而且對應(yīng)的Podfile文件未被修改牢屋,則會根據(jù)Podfile.lock文件指定的版本安裝且预。
每次更新了Podfile文件時(shí),都需要重新執(zhí)行pod install命令烙无,以便重新安裝Pods依賴庫锋谐。
當(dāng)執(zhí)行pod update命令時(shí),如果Podfile中指定的依賴庫版本不是寫死的截酷,當(dāng)對應(yīng)的依賴庫有了更新涮拗,無論有沒有Podfile.lock文件,都會去獲取Podfile文件描述的允許獲取到的最新依賴庫版本迂苛。

文/VV木公子(簡書作者)
PS:如非特別說明三热,所有文章均為原創(chuàng)作品,著作權(quán)歸作者所有三幻,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)就漾,并注明出處,所有打賞均歸本人所有念搬!

如果您是iOS開發(fā)者抑堡,或者對本篇文章感興趣,請關(guān)注本人朗徊,后續(xù)會更新更多相關(guān)文章首妖!敬請期待!

如果有技術(shù)問題荣倾,歡迎加入QQ群進(jìn)行交流悯搔,群聊號碼:194236752。

參考鏈接:
Podfile語法參考(譯)
Cocoapods的Podfile常見語法總結(jié)
CocoaPods詳解之----使用篇
CocoaPods詳解之----進(jìn)階篇
CocoaPods詳解之----制作篇
CocoaPods安裝和使用教程以及一些常見問題
如何制作自己的Pod庫
The Podfile(英)
Podfile語法參考(譯)
(實(shí)驗(yàn))Podfile的target與link_with
Podfile Syntax Reference(英)
Podfile Syntax Reference(英)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舌仍,一起剝皮案震驚了整個(gè)濱河市妒貌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铸豁,老刑警劉巖灌曙,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異节芥,居然都是意外死亡在刺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門头镊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚣驼,“玉大人,你說我怎么就攤上這事相艇∮毙樱” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵坛芽,是天一觀的道長留储。 經(jīng)常有香客問我翼抠,道長,這世上最難降的妖魔是什么获讳? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任阴颖,我火速辦了婚禮,結(jié)果婚禮上丐膝,老公的妹妹穿的比我還像新娘量愧。我一直安慰自己,他們只是感情好尤误,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布侠畔。 她就那樣靜靜地躺著,像睡著了一般损晤。 火紅的嫁衣襯著肌膚如雪软棺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天尤勋,我揣著相機(jī)與錄音喘落,去河邊找鬼。 笑死最冰,一個(gè)胖子當(dāng)著我的面吹牛瘦棋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播暖哨,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼赌朋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了篇裁?” 一聲冷哼從身側(cè)響起沛慢,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎达布,沒想到半個(gè)月后团甲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黍聂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年躺苦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片产还。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匹厘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脐区,到底是詐尸還是另有隱情愈诚,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站扰路,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倔叼。R本人自食惡果不足惜汗唱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丈攒。 院中可真熱鬧哩罪,春花似錦、人聲如沸巡验。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽显设。三九已至框弛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捕捂,已是汗流浹背瑟枫。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留指攒,地道東北人慷妙。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像允悦,于是被迫代替她去往敵國和親膝擂。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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

  • 項(xiàng)目組件化隙弛、平臺化是技術(shù)公司的共同目標(biāo)架馋,越來越多的技術(shù)公司推崇使用pod管理第三方庫以及私有組件,一方面使項(xiàng)目架構(gòu)...
    swu_luo閱讀 21,470評論 0 39
  • CocoaPods 是開發(fā) OS X 和 iOS 應(yīng)用程序的一個(gè)第三方庫的依賴管理工具驶鹉。利用 CocoaPods绩蜻,...
    寶山瀟灑哥閱讀 4,021評論 0 1
  • 一. CocoaPods的介紹 什么是CocoaPods?CocoaPods是一個(gè)負(fù)責(zé)管理iOS項(xiàng)目中第三方開源庫...
    輝712閱讀 3,913評論 0 7
  • 什么是cocoapods CocoaPods是一個(gè)用來幫助我們管理第三方依賴庫的工具室埋。它可以解決庫與庫之間的依賴關(guān)...
    VV木公子閱讀 7,059評論 0 7
  • 這是一篇關(guān)于策略的文章办绝。 序 攻與守 來自得到app《何帆大局觀》專欄精選--“7節(jié)極簡地緣政治課”第六章 我們先...
    朧一閱讀 729評論 0 1