CocoaPods之Podfile\Podfile.lock
什么是Podfile ?
CocoaPods是用ruby實現的,因此Podfile文件的語法就是ruby的語法。
podfile是一個說明文件,用以描述管理一個或者多個Xcode project的target的依賴庫。這個文件應該且必須被命名為Podfile。
Podfile可以非常簡單,下面的例子增加了Alamofire依賴庫到單個target:
下面是一個更復雜的例子,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' dopod 'GoogleAnalytics', '~> 3.1'# Has its own copy of OCMock # and has access to GoogleAnalytics via the app # that hosts the test targettarget 'MyAppTests' do inherit! :search_paths pod 'OCMock', '~> 2.0.1' end endpost_install do |installer|installer.pods_project.targets.each do |target| puts target.name end end如果你希望多個target共享同一個pods,那么可以用關鍵字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 + ShowWebAuthtarget 'ShowsiOS' do pod 'ShowWebAuth' end# Has its own copy of ShowsKit + ShowTVAuth target 'ShowsTV' do pod 'ShowTVAuth' end endPodfile中自帶一個隱藏的、默認的abstract target,所以你也可以用如下的方式達到上面例子的同樣效果:
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版本
當開始一個項目,你可能會想要使用最新版本的pod依賴庫。 如果是這種情況,只需忽略版本要求。
pod 'SSZipArchive'稍后在項目您可能想要使用特定版本的pod依賴庫,在這種情況下,您可以指定版本號。
pod 'Objection', '0.9'除了沒有版本,或特定的一個,也可以使用邏輯運算符:
- '> 0.1' 高于0.1的任何版本
- '>= 0.1' 版本0.1或更高版本
- '< 0.1' 低于0.1的任何版本
- '<= 0.1' 版本0.1或更低的版本
除了邏輯運算符,還有一種運算符:
- '~> 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更高的版本,這基本上和不指定版本號的效果是一樣的。
使用本地文件夾內的依賴庫
如果你想建立一個本地依賴庫和項目之間的關系,即項目依賴本地文件夾的某個依賴庫,可以用關鍵字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依賴庫鏈接進pod項目。這意味著我們對這個本地文件夾的編輯與修改將會被pod直接更新。
source 'URL' : 指定鏡像倉庫的源
platform : ios, '6.0' : 指定所支持系統和最低版本
inhibit_all_warnings! :屏蔽所有warning
workspace '項目空間名': 指定項目空間名
xcodeproj '工程文件名':指定xcodeproj工程文件名
~ > : 從指定版本到倒數第二位版本號升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的版本,寫這個限制和什么都不寫是一個效果,都表示使用最新版本CocoaPods pod install/pod update更新慢的問題
/默認執行pod install 或者 pod update命令,會更新遠程cocopodsde spec庫。所以導致命令執行的比較慢,我們可以采用以下命令來提高更新速度,不更新CocoaPods的spec倉庫直接install/update。
pod update --verbose --no-repo-update
pod install --verbose --no-repo-update
Podfile和Target
Podfile本質上是用來描述Xcode工程中的targets用的。如果我們不顯式指定Podfile對應的target,CocoaPods會創建一個名稱為default的隱式target,會和我們工程中的第一個target相對應。換句話說,如果在Podfile中沒有指定target,那么只有工程里的第一個target能夠使用Podfile中描述的Pods依賴庫。
項目存在多Target情況
項目存在多個Target的時候,需要配置Podfile文件來支持新增加的Target,否則只支持項目默認建立時生成的Target:
a.多個Target使用相同的pods依賴庫
a、默認新建的項目只有一個target,但是我們可以給項目天阿基額外的target。如果項目中存在多個target,且兩個Target所依賴的的第三方庫完全相同,則可以使用
link_with關鍵字,將Podfile寫成如下方式:
或
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,然后執行pod undate 或pod install,你會發現以下的錯誤:
Snip20161204_1.png
意思是link_with關鍵字已經過期,現在不在支持,我們需要用target blocks來代替link_with。查看官方文檔,如下:
Snip20161204_3.png
所以,我們可以通過abstract_target和target繼承的方式代替link_with.
b.多個的Target需要不同的依賴庫
如果不同的target使用不同的依賴庫,則可以:
platform :ios target :'Test' do pod 'Reachability' pod 'SBJson' pod 'AFNetworking' end target :'Second' do pod 'OpenUDID' endinhibit_all_warnings!的作用
用于屏蔽cocoapods庫里面的所有警告。
Snip20161204_2.png
這個特性也能在子target里面定義,如果你想屏蔽某pod里面的警告也是可以的:
pod 'SSZipArchive', :inhibit_warnings => true
use_frameworks!的作用
在pods中用frameworks替代靜態庫。
另,一般開發swift項目時,我們會在podfile中添加這一句。
podspec文件
后綴名為podspec(cocoapods specification)的文件是cocoapods的說明文件,該文件為Pods依賴庫的描述文件,每個Pods依賴庫必須有且僅有那么一個描述文件。該文件包括依賴庫的名字、版本、描述、license、author、source、platform等信息。
什么是Podfile.lock?
這是 CocoaPods 創建的最重要的文件之一。它記錄了需要被安裝的 pod 的每個已安裝的版本。如果你想知道已安裝的 pod 是哪個版本,可以查看這個文件。推薦將 Podfile.lock 文件加入到版本控制中,這有助于整個團隊的一致性。Objc中國
Podfile.lock文件最大得用處在于多人開發。當團隊中的某個人執行完pod install命令后,生成的Podfile.lock文件就記錄下了當時最新Pods依賴庫的版本,這時團隊中的其它人check下來這份包含Podfile.lock文件的工程以后,再去執行pod install命令時,獲取下來的Pods依賴庫的版本就和最開始用戶獲取到的版本一致。如果沒有Podfile.lock文件,后續所有用戶執行pod install命令都會獲取最新版本的依賴庫,這就有可能造成同一個團隊使用的依賴庫版本不一致,這對團隊協作來說絕對是個災難!在這種情況下,如果團隊想使用當前最新版本的依賴庫,有兩種方案:
- 1.更改Podfile,使其指向最新版本的依賴庫;
- 2.執行pod update命令;
當執行pod install 命令時,首先會根據Podfile文件指定的內容,安裝依賴庫,如果有Podfile.lock文件而且對應的Podfile文件未被修改,則會根據Podfile.lock文件指定的版本安裝。
每次更新了Podfile文件時,都需要重新執行pod install命令,以便重新安裝Pods依賴庫。
當執行pod update命令時,如果Podfile中指定的依賴庫版本不是寫死的,當對應的依賴庫有了更新,無論有沒有Podfile.lock文件,都會去獲取Podfile文件描述的允許獲取到的最新依賴庫版本。
文/VV木公子(簡書作者)
PS:如非特別說明,所有文章均為原創作品,著作權歸作者所有,轉載請聯系作者獲得授權,并注明出處,所有打賞均歸本人所有!
如果您是iOS開發者,或者對本篇文章感興趣,請關注本人,后續會更新更多相關文章!敬請期待!
參考鏈接:
Podfile語法參考(譯)
Cocoapods的Podfile常見語法總結
CocoaPods詳解之----使用篇
CocoaPods詳解之----進階篇
CocoaPods詳解之----制作篇
CocoaPods安裝和使用教程以及一些常見問題
如何制作自己的Pod庫
The Podfile(英)
Podfile語法參考(譯)
(實驗)Podfile的target與link_with
Podfile Syntax Reference(英)
Podfile Syntax Reference(英)
轉載于:https://my.oschina.net/u/3579120/blog/1533320
總結
以上是生活随笔為你收集整理的CocoaPods之Podfile\Podfile.lock的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看拉扎维《模拟CMOS集成电路设计》的一
- 下一篇: Ansible+Redfish+Idra