前言經(jīng)常使用CocoaPods來(lái)管理iOS項(xiàng)目中的第三方庫(kù),,但是我們要使用CocoaPods來(lái)管理第三方庫(kù),,前提是要寫好Podfile文件,通過(guò)這個(gè)文件來(lái)配置第三方庫(kù)與項(xiàng)目之間的依賴,、版本等信息,。 但是,我相信很少有人完整地學(xué)習(xí)過(guò)Podfile的語(yǔ)法規(guī)則,,包括筆者在寫本篇文章之前,。今天,請(qǐng)大家與筆者一起來(lái)完整地學(xué)習(xí)Podfile官方教程,。 之前一直想寫來(lái)著,,因?yàn)榘üP者在內(nèi)并沒(méi)有深入學(xué)習(xí)過(guò)它的使用,。如果對(duì)之不夠了解,如何能做到善用之,。因此,,下面一起來(lái)探討探討吧! 什么是Podfile官方只有一句話說(shuō)明什么是Podfile:The Podfile is a specification that describes the dependencies of the targets of one or more Xcode projects. 大概意思是:Podfile文件是一種規(guī)則描述,,用于描述一或多個(gè)Xcode工程的targets之間的依賴,。 Podfile可以很簡(jiǎn)單:
也可以很復(fù)雜:
這里只是拋磚引玉,繼續(xù)往下看,,如何一點(diǎn)點(diǎn)地掌握Podfile的語(yǔ)法規(guī)則,。 Podfile全局配置目前根據(jù)官方文檔說(shuō)明,Podfile全局配置只有一個(gè)命令:
官方說(shuō)明它的作用是:Specifies the installation method to be used when CocoaPods installs this Podfile.(大概意思是:指定CocoaPods安裝Podfile時(shí)所使用的安裝方法) 例如:
目前支持的key有:
這個(gè)沒(méi)有見(jiàn)過(guò)任何工程里邊有人使用過(guò),,相信99%的人兒都是使用默認(rèn)的全局配置,。對(duì)于這幾個(gè)key,官方也沒(méi)有明確說(shuō)明其功能,! 在我們?nèi)粘i_(kāi)發(fā)中,,我們可能永遠(yuǎn)不需要使用到此配置命令,因此大家不用太關(guān)注它,! Dependencies(依賴)CocoaPods就是用于管理第三方依賴的,。我們通過(guò)Podfile文件配置來(lái)指定工程中的每個(gè)target之間與第三方之間的依賴。 有以下三個(gè)命令來(lái)管理依賴:
Pod命令此命令用于指定工程的依賴,。我們通過(guò)Pod命令指定所依賴的第三方及第三方庫(kù)的版本范圍,。 永遠(yuǎn)使用最新版本
當(dāng)我們永遠(yuǎn)使用遠(yuǎn)程倉(cāng)庫(kù)中的最新版本時(shí),我們只需要指定倉(cāng)庫(kù)名即可,。當(dāng)有新的版本發(fā)布時(shí),,執(zhí)行pod update命令,會(huì)更新至最新的版本,。 因?yàn)榘姹局g可能會(huì)存在很大的差異,,因此我們不應(yīng)該采用這種方式,而是指定版本范圍或者指定特定版本,。 使用固定版本
當(dāng)我們不希望版本更新,,而是固定使用指定的版本時(shí),我們應(yīng)該這么寫法,。當(dāng)遠(yuǎn)程有新的版本發(fā)布時(shí),,pod是不會(huì)去更新新版本的。由于版本變化可能較大,,因此有時(shí)候我們希望這么做的,。 指定版本范圍
當(dāng)我們不要求固定版本號(hào),,而是指定某個(gè)范圍時(shí),我們會(huì)像上面這么寫法,。我相信大家在工程中見(jiàn)到最多的就是這種寫法了吧,。但是,我相信很多朋友并不知道這么寫法的意思是什么,。 它的意思是:HYBUnicodeReadable的版本可以是1.1.0到2.0.0,,但是不包括2.0.0。 使用這種寫法是很有用的,,因此小版本的升級(jí)一般是fix bug,,當(dāng)有bug被fix時(shí),,我們確實(shí)應(yīng)該更新,。從1.9.9升級(jí)到2.0.0時(shí),不會(huì)去更新到2.0.0版本,。我們認(rèn)為從2.0.0是一個(gè)大版本,,大版本的發(fā)布,通常不是fix bug,,而是增加功能或者改動(dòng)較大,。 那么有哪些符號(hào)可以指定范圍呢:
使用本地庫(kù)
如果我們的庫(kù)是在本地的,,那么我們可以通過(guò)這樣的命令來(lái)指定,。由于是引用目錄,因此外部直接修改目錄中的內(nèi)容,,CocoaPods也會(huì)更新到最新的,,所以也挺不錯(cuò)的! 通過(guò)倉(cāng)庫(kù)的podspec引入Sometimes you may want to use the bleeding edge version of a Pod. Or a specific revision. If this is the case, you can specify that with your pod declaration. 當(dāng)我們需要使用庫(kù)的混合邊緣版本,,或者指定的修訂版本,,我們可以通過(guò)指定像下面這樣的聲明。 使用倉(cāng)庫(kù)的master(主干):
不是使用master,,而是使用指定的分支:
使用指定的tag(標(biāo)簽,,發(fā)布庫(kù)的版本時(shí),,通常版本號(hào)與tag號(hào)是一致的):
使用指定的提交版本:
官方明確說(shuō)明要求podspec在根目錄下: The podspec file is expected to be in the root of the repository, if this library does not have a podspec file in its repository yet, you will have to use one of the approaches outlined in the sections below. 也就是說(shuō)與工程同級(jí)!比如AFNetworking中的podspec文件與庫(kù)目錄是同級(jí)的,,都在根目錄下,! 從外部podspec引入
如上,當(dāng)我們發(fā)布到CocoaPods時(shí),,如果沒(méi)有podspec不是在根目錄下,,而是在外部,可以通過(guò)’:podspec’命令來(lái)指定外部鏈接,。 podspecUse just the dependencies of a Pod defined in the given podspec file. If no arguments are passed the first podspec in the root of the Podfile is used. It is intended to be used by the project of a library. Note: this does not include the sources derived from the podspec just the CocoaPods infrastructure. 大概意思是:使用給定的podspec所指定的pod依賴,。如果沒(méi)有指定參數(shù),根目錄下的podspec會(huì)被使用,。 正常情況下,,我們并不需要指定,一般所開(kāi)源出來(lái)的庫(kù)的podspec都是在根目錄下,,所以可放心地使用,,不用考慮太多。 例如:
targetDefines a CocoaPods target and scopes dependencies defined within the given block. A target should correspond to an Xcode target. By default the target includes the dependencies defined outside of the block, unless instructed not to inherit! them. 大概意思是:在給定的塊內(nèi)定義pod的target(Xcode工程中的target)和指定依賴的范圍,。一個(gè)target應(yīng)該與Xcode工程的target有關(guān)聯(lián),。默認(rèn)情況下,target會(huì)包含定義在塊外的依賴,,除非指定不使用inherit!來(lái)繼承(說(shuō)的是嵌套的塊里的繼承問(wèn)題) 例子:
注意:Inheriting only search paths,。也就是說(shuō)inherit! :search_paths這是固定的寫法,。 Target configuration這里的配置會(huì)使用和控制工程的生成。 platform
如果沒(méi)有指定版本,,官方默認(rèn)值說(shuō)明如下: CocoaPods provides a default deployment target if one is not specified. The current default values are 4.3 for iOS, 10.6 for OS X, 9.0 for tvOS and 2.0 for watchOS. 也就是說(shuō),,若不指定平臺(tái)版本,各平臺(tái)默認(rèn)值如下:
project默認(rèn)情況下是沒(méi)有指定的,當(dāng)沒(méi)有指定時(shí),,會(huì)使用Podfile目錄下與target同名的工程:
一般情況下,,我們不指定project,直接使用:
inhibit_all_warnings!inhibit_all_warnings!命令是不顯示所引用的庫(kù)中的警告信息,。我們可以指定全局不顯示警告信息,,也可以指定某一個(gè)庫(kù)不顯示警告信息:
use_frameworks!通過(guò)指定use_frameworks!要求生成的是framework而不是靜態(tài)庫(kù)。 workspace默認(rèn)情況下,,我們不需要指定,,直接使用與Podfile所在目錄的工程名一樣就可以了。如果要指定另外的名稱,,而不是使用工程的名稱,,可以這樣指定:
sourcesource是指定pod的來(lái)源。如果不指定source,,默認(rèn)是使用CocoaPods官方的source,。通常我們沒(méi)有必要添加。
HooksHooks可以叫它為勾子吧,,與swizzling特性差不多,,就是在某些操作之前,先勾起,,而且讓它執(zhí)行我們特定的操作,。 pluginSpecifies the plugins that should be used during installation. Use this method to specify a plugin that should be used during installation, along with the options that should be passed to the plugin when it is invoked. 例如,指定在安裝期間使用cocoapods-keys和slather這兩個(gè)插件:
pre_installThis hook allows you to make any changes to the Pods after they have been downloaded but before they are installed. 當(dāng)我們下載完成,,但是還沒(méi)有安裝之時(shí),,會(huì)勾起來(lái),然后可以通過(guò)pre_install指定要做的事,,做完后才進(jìn)入安裝階段,。 比如:在下載完成但未安裝之前,我們就可以指定在干些什么:
post_install既然有pre_install命令,,自然會(huì)想到還有一個(gè)與之對(duì)應(yīng)的命令,。 This hook allows you to make any last changes to the generated Xcode project before it is written to disk, or any other tasks you might want to perform. 當(dāng)我們安裝完成,但是生成的工程還沒(méi)有寫入磁盤之時(shí),,我們可以指定要執(zhí)行的操作,。 比如,我們可以在寫入磁盤之前,,修改一些工程的配置:
def我們還可以通過(guò)def命令來(lái)聲明一個(gè)pod集:
然后,,我們就可以在需要引入的target處引入之:
這么寫的好處是:如果有多個(gè)target,而不同target之間并不全包含,那么可以通過(guò)這種方式來(lái)分開(kāi)引入,。 逗視項(xiàng)目的Podfile下面是逗視項(xiàng)目的Podfile,,這是經(jīng)過(guò)筆者整理的:
最后如果文中有任何的紕漏,歡迎大家指出,。分享無(wú)止境,,希望能夠幫助大家解疑! 參考【官方文檔說(shuō)明】 |
|