Podfile 是什么?
Podfile 是一個說明文件,他描述了一個或多個 Xcode 工程中的 targets 的依賴。該文件應該簡單的命名為 Podfile。本篇指導中的所有示例,都是基于 CocoaPods 1.0 版本的。
一個 Podfile 可以是非常簡單的,一下將 Alamofire 添加到了一個單獨的 target 中:
target 'MyApp' do
use_frameworks!
pod 'Alamofire', '~> 3.0'
end
注:由于 CocoaPods 是基于 ruby 開發的,這兒的這段代碼,實際上是 ruby 語言中的 ‘閉包’。至于,ruby 語言不是這個系列的主題,之后會有新的系列介紹我學習,使用 ruby 的情況。
一下是一個比較復雜的 Podfile 鏈接了一個 app 和 他的測試包(test 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
譯者注:
1、source 'https://github.com/CocoaPods/Specs.git' 和 source 'https://github.com/Artsy/Specs.git' 這兩行是表示 specs 文件的位置(url)。CocoaPods 其實是維護了一個 Specs 的索引,所有的 CocoaPods 中的 pod 中的 Spec 都包含在這個索引中,而 pod 中的源代碼并沒有包含在這個索引里。當你在自己的電腦上安裝 CocoaPods 的時候,這份索引就復制到了你的電腦上。當你在命令行中運行 pod search xxx 的時候,實際上就是在這個索引中尋找 pod。pod install 的時候,實際上是根據 Podfile 提供要安裝的 pod 名,版本;Podfile.lock 提供版本限定,然后找到相應的 spec ,通過 spec 中的描述,來進行安裝的。
2、可以建立自己的 spec 索引。
3、post_install 是在 pod install ,安裝完 pod 之后,執行的一段代碼。這里執行的,是將安裝的所有的 pod 打印名稱。這實際上是一個 hook,你可以根據自己的需要自定義行為。
如果你想要將同樣的 pod ,給多個 targets 分享,請使用一個 abstract_target (抽象的 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 的根部,隱含了 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
將 CocoaPods 從 0.x 遷移到 1.0 版本:
這有個博客,解釋了底層的改變(http://blog.cocoapods.org/CocoaPods-1.0/)
指定 pod 版本:
當你開始開始做一個工程的時候,你理所當然的想要使用一個 pod 最新的版本。如果是這樣的場景,你只要簡單的省略掉版本要求(version requirements)就行:
pod 'SSZipArchive'
一段時間后,你可能想要將一個 pod 鎖定在一個指定的版本上。這時,你可以指定該 pod 的版本號:
pod 'Objection', '0.9'
除開不指定版本,或者指定一個版本,你也可以使用邏輯操作符:
'> 0.1' —— 任何大于 0.1 的版本,不包括 0.1
'>= 0.1' —— 任何大于 0.1 的版本,包括 0.1
'< 0.1' —— 任何小于 0.1 的版本,不包括 0.1
'<= 0.1' —— 任何小于 0.1 的版本,包括 0.1
在邏輯操作符之外,CocoaPods 還有一個開放式操作符 ~>:
'~> 0.1.2' —— 從 0.1.2 到 0.2 的版本,不包括 0.2 和 高于0.2 的版本 (也就是 0.1.2 <= version < 0.2)
'~> 0.1' —— 從 0.1 到 1.0 的版本,不包括 1.0 和 高于 1.0 的版本 (也就是 0.1 <= version < 1.0)
'~> 0' —— 大于 0 的所有版本,這么寫的話,和沒寫這句話等效
從本地文件中使用文件:
如果你想要連同客戶端工程開發一個 pod ,你可以使用 :path
pod 'Alamofire', :path => '~/Documents/Alamofire'
通過使用這個選項,CocoaPods 將會認定你所提供的文件夾是 pod 的根目錄,并將這個文件夾中的文件直接鏈接到 Pods 工程中。這意味著,你對 pod 的編輯在之后的歷次 CocoaPods 安裝(CocoaPods installations)中都是持續不變的(因為,此時這個 pod 引用的是你指定的文件夾中的文件,這些文件變了,pod 才會變)。這個引用文件夾,可以是你最喜歡的 SCM 的一份檢出,或者甚至是當前倉庫的一個 git 子模塊。
注意,這個 pod 的 podspec 文件需要包含在你指定的文件夾內。
從一份位于 library 倉庫根源的 podspec:
有時,你可能想要使用一個 pod 的尖端版本(bleeding edge version),一個指定的修改或者你自己擁有的 fork。如果是這樣的情況,你可以通過你的 pod declaration 來指定。
使用 repo 的 master 分支:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git'
使用 repo 的一個不同的分支:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'dev'
使用 repo 的一個 tag:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '3.1.1'
或者指定一個提交:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :commit => '0f506b1c45'
很重要的一點是,這意味著,某一個 pod 所指定的版本,要滿足所有 Pod 中的其他 pod 對于該 pod 的依賴。
podspec 文件,需要放在 repo 的根目錄下。