在我剛開始學習iOS開始時,一些優秀的開源框架的README.md中總有一句pod NAME
。當時不知道這句話是用來作什麼的。ios
在工做以後,每每一個項目會用到多個框架。把它們挨個Add Files
,而後根據框架的README.md
來添加相關的系統依賴和設置正確的編譯參數。這樣作當然是能夠的,可是卻無緣無故地增長了工做量,並且太容易出錯了。 git
因此,我開始學習使用CocoaPods
來作依賴管理。github
1月20日:在一些問題的解決方法
中添加問題3;框架
CocoaPods是iOS和Mac項目的依賴管理工具。項目所須要的依賴都被寫入叫作Podfile
的文件中。CocoaPods會將它們集成到咱們的項目中,而且幫咱們設置好系統依賴以及編譯參數。工具
CocoaPods是基於Ruby的。OS X是自帶Ruby的。因此不須要再次安裝Ruby。學習
$ [sudo] gem install [-n /usr/local/bin] cocoapods
說明:這裏的命令格式受Ruby的版本以及OS X版本的影響。若是你的Ruby是2.3.0,那麼直接執行gem install就能夠了。 ui
若是須要更新CocoaPods,執行$ [sudo] gem install cocoapods --pre
。若是第一次安裝使用了sudo
,那麼在執行安裝操做時須要再次使用sudo,不然會提示Permission denied
。spa
在使用以前,確保你須要的庫在Specs repository或者cocoapods.org上能夠查詢到。debug
建立一個新的Xcode項目。code
打開終端,執行$ cd your project direction
,進入到你的項目目錄下。
$ touch Podfile
,建立一個Podfile文件。
打開Podfile
,在第一行寫下platform :ios, '8.0'
,指定平臺以及所支持的版本。
在單獨一行用pod 'libraryName'
,指定須要導入的依賴。
在終端中執行$ pod install
,就會爲項目導入執行的依賴。
CocoaPods提供$ pod init
,能夠爲咱們建立具備模板的Podfile
文件。在$ pod install
執行完成以後,會生成一個projectName.xcworkspace
文件,以後使用這個文件來打開項目。
第一次爲項目添加依賴或者每一次修改Podfile
後使用pod install
。
每次pod install
被執行,都會下載和安裝新的pods。被安裝的pods的版本都會寫入到Podfile.lock
文件中。這個文件會一直跟蹤已安裝的每個pods的版本號,而且鎖定這些版本號。
當你執行pod install
,它只會解決那些沒有在Podfile.lock
文件中列出來的pods的依賴。
對於Podfile.lock
中列出的pods,只會下載Podfile.lock
明確記錄的版本,而不會去查看是否有新的版本。
對於沒有在Podfile.lock
中列出的pods,會去匹配Podfile
文件中描述的版本,如pod 'AFNetworking', '~> 3.0'
。
在執行pod update
以前,能夠執行pod outdated
來查看有哪些pods有新的版本。
當你執行pod update PODNAME
時,CocoaPods會嘗試發現PODNAME
的可更新的版本,而不會去關注Podfile.lock
中的版本。它會把依賴更新到最新的版本。
當執行pod update
,而不帶指定的PODNAME
時,CocoaPods就會將全部列在Podfile
中的依賴更新到最新版本。
當pods被更新時,相應地,Podfile.lock
中的pods的版本號也會更新。
這個文件在多人合做同一個項目時能夠發揮關鍵做用。它能夠保證每一個成員的pods的版本都是統一的。每一次修改Podfile.lock
後,你必需要commit & push它到Repo。
固然,你能夠把pod install
以後生成的Pods
文件夾放入到Repo中,來管理依賴版本。
在Swift下,配置重寫的問題。在執行pod install
時,會遇到下面的提示。
大概的意思就是說,當前的Target想要重寫EMBEDDED_CONTENT_CONTAINS_SWIFT
參數。提示下面給出了兩個解決方法.
一種是使用$(inherited)
flag。在Target -> Build Settings -> Other Linker Flags下,添加上$(inherited)
。
另外一種是移除target -> Build Settings中EMBEDDED_CONTENT_CONTAINS_SWIFT
參數的設置。
出現這個問題的緣由是Xcode已有的EMBEDDED_CONTENT_CONTAINS_SWIFT
參數設置和Pods/Targets Support Files/Pods-CocoaPodsDemo
目錄下Pods-CocoaPodsDemo.debug.xcconfig
,Pods-CocoaPodsDemo.release.xcconfig
這兩個文件中對這個參數的設置不一樣致使的。因此把這兩個參數修改一致,問題就解決了。
對於這個問題,我以爲是CocoaPods在修改咱們已經設置過的編譯參數以前給出的提示,以防強制修改而帶來的沒法挽回的損失出現。
在pod install
時,遇到以下提示。
字面上的意思就是這些依賴沒有被任何一個target使用。
這個問題可能出如今使用老版本的podfile文件時出現。如今新的podfile文件都會使用target NAME do
來講明在哪一個target中使用依賴。好比這樣:
target 'CocoaPodsDemo' do pod 'baiduMap', '~> 2.8' pod 'SwiftyJSON', '~> 2.3' end
只要指定好使用依賴的target,問題就能夠解決了。
在工程編譯的時候,提示library not find for -lPods
。
我遇到這個問題的緣由是,項目本來的PodFile
沒有明確指明target
,因此生成了libPods.a
的靜態庫文件。
因爲某些緣由,我從新拉取項目分支,再次使用pod install
,會出現我在問題2
中描述的提示。我用了target
以後,會生成一個libPods-NAME.a
格式的靜態庫文件,而後會被添加到項目中。
這時,問題出現了,本來的libPods.a
文件並無從Linker Frameworks and Libraries
編譯項中移除,可是個人新分支下的項目中沒有這個文件,因此會出現library not find for -lPods
的編譯錯誤。
把libPods.a文件從Linker Frameworks and Libraries
編譯項中移除就能夠解決問題了。