使用CocoaPods來作iOS項目依賴管理

在我剛開始學習iOS開始時,一些優秀的開源框架的README.md中總有一句pod NAME。當時不知道這句話是用來作什麼的。ios

在工做以後,每每一個項目會用到多個框架。把它們挨個Add Files,而後根據框架的README.md來添加相關的系統依賴和設置正確的編譯參數。這樣作當然是能夠的,可是卻無緣無故地增長了工做量,並且太容易出錯了。 git

因此,我開始學習使用CocoaPods來作依賴管理。github

文章更新

1月20日:在一些問題的解決方法中添加問題3;框架

什麼是CocoaPods

CocoaPods是iOS和Mac項目的依賴管理工具。項目所須要的依賴都被寫入叫作Podfile的文件中。CocoaPods會將它們集成到咱們的項目中,而且幫咱們設置好系統依賴以及編譯參數。工具

安裝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 deniedspa

使用CocoaPods

在使用以前,確保你須要的庫在Specs repository或者cocoapods.org上能夠查詢到。debug

在新的項目中使用CocoaPods

  1. 建立一個新的Xcode項目。code

  2. 打開終端,執行$ cd your project direction,進入到你的項目目錄下。

  3. $ touch Podfile,建立一個Podfile文件。

  4. 打開Podfile,在第一行寫下platform :ios, '8.0',指定平臺以及所支持的版本。

  5. 在單獨一行用pod 'libraryName',指定須要導入的依賴。

  6. 在終端中執行$ pod install,就會爲項目導入執行的依賴。

CocoaPods提供$ pod init,能夠爲咱們建立具備模板的Podfile文件。在$ pod install執行完成以後,會生成一個projectName.xcworkspace文件,以後使用這個文件來打開項目。

關於pod install 和 pod update

pod install

第一次爲項目添加依賴或者每一次修改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 update以前,能夠執行pod outdated來查看有哪些pods有新的版本。

當你執行pod update PODNAME時,CocoaPods會嘗試發現PODNAME的可更新的版本,而不會去關注Podfile.lock中的版本。它會把依賴更新到最新的版本。

當執行pod update,而不帶指定的PODNAME時,CocoaPods就會將全部列在Podfile中的依賴更新到最新版本。

當pods被更新時,相應地,Podfile.lock中的pods的版本號也會更新。

Podfile.lock

這個文件在多人合做同一個項目時能夠發揮關鍵做用。它能夠保證每一個成員的pods的版本都是統一的。每一次修改Podfile.lock後,你必需要commit & push它到Repo。

固然,你能夠把pod install以後生成的Pods文件夾放入到Repo中,來管理依賴版本。

一些問題的解決方法

問題1

在Swift下,配置重寫的問題。在執行pod install時,會遇到下面的提示。

image

大概的意思就是說,當前的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.xcconfigPods-CocoaPodsDemo.release.xcconfig這兩個文件中對這個參數的設置不一樣致使的。因此把這兩個參數修改一致,問題就解決了。

對於這個問題,我以爲是CocoaPods在修改咱們已經設置過的編譯參數以前給出的提示,以防強制修改而帶來的沒法挽回的損失出現。

問題2

pod install時,遇到以下提示。

image

字面上的意思就是這些依賴沒有被任何一個target使用。

這個問題可能出如今使用老版本的podfile文件時出現。如今新的podfile文件都會使用target NAME do來講明在哪一個target中使用依賴。好比這樣:

target 'CocoaPodsDemo' do
    pod 'baiduMap', '~> 2.8'
    pod 'SwiftyJSON', '~> 2.3'
end

只要指定好使用依賴的target,問題就能夠解決了。

問題3

在工程編譯的時候,提示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編譯項中移除就能夠解決問題了。

相關文章
相關標籤/搜索