一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

ObjC 中國

 睜開眼就變帥 2016-08-22

CocoaPods 是開發(fā) OS X 和 iOS 應(yīng)用程序的一個第三方庫的依賴管理工具。利用 CocoaPods,可以定義自己的依賴關(guān)系 (稱作 pods),并且隨著時間的變化,以及在整個開發(fā)環(huán)境中對第三方庫的版本管理非常方便。

CocoaPods 背后的理念主要體現(xiàn)在兩個方面。首先,在工程中引入第三方代碼會涉及到許多內(nèi)容。針對 Objective-C 初級開發(fā)者來說,工程文件的配置會讓人很沮喪。在配置 build phases 和 linker flags 過程中,會引起許多人為因素的錯誤。CocoaPods 簡化了這一切,它能夠自動配置編譯選項。

其次,通過 CocoaPods,可以很方便的查找到新的第三方庫。當(dāng)然,這并不是說你可以簡單的將別人提供的庫拿來拼湊成一個應(yīng)用程序。它的真正作用是讓你能夠找到真正好用的庫,以此來縮短我們的開發(fā)周期和提升軟件的質(zhì)量。

本文中,我們將通過分析 pod 安裝 (pod install) 的過程,一步一步揭示 CocoaPods 背后的技術(shù)。

核心組件

CocoaPods是用 Ruby 寫的,并由若干個 Ruby 包 (gems) 構(gòu)成的。在解析整合過程中,最重要的幾個 gems 分別是: CocoaPods/CocoaPods, CocoaPods/Core, 和 CocoaPods/Xcodeproj (是的,CocoaPods 是一個依賴管理工具 -- 利用依賴管理進(jìn)行構(gòu)建的!)。

編者注 CocoaPods 是一個 objc 的依賴管理工具,而其本身是利用 ruby 的依賴管理 gem 進(jìn)行構(gòu)建的

CocoaPods/CocoaPod

這是是一個面向用戶的組件,每當(dāng)執(zhí)行一個 pod 命令時,這個組件都將被激活。該組件包括了所有使用 CocoaPods 涉及到的功能,并且還能通過調(diào)用所有其它的 gems 來執(zhí)行任務(wù)。

CocoaPods/Core

Core 組件提供支持與 CocoaPods 相關(guān)文件的處理,文件主要是 Podfile 和 podspecs。

Podfile

Podfile 是一個文件,用于定義項目所需要使用的第三方庫。該文件支持高度定制,你可以根據(jù)個人喜好對其做出定制。更多相關(guān)信息,請查閱 Podfile 指南。

Podspec

.podspec 也是一個文件,該文件描述了一個庫是怎樣被添加到工程中的。它支持的功能有:列出源文件、framework、編譯選項和某個庫所需要的依賴等。

CocoaPods/Xcodeproj

這個 gem 組件負(fù)責(zé)所有工程文件的整合。它能夠?qū)?chuàng)建并修改 .xcodeproj.xcworkspace 文件。它也可以作為單獨(dú)的一個 gem 包使用。如果你想要寫一個腳本來方便的修改工程文件,那么可以使用這個 gem。

運(yùn)行 pod install 命令

當(dāng)運(yùn)行 pod install 命令時會引發(fā)許多操作。要想深入了解這個命令執(zhí)行的詳細(xì)內(nèi)容,可以在這個命令后面加上 --verbose?,F(xiàn)在運(yùn)行這個命令 pod install --verbose,可以看到類似如下的內(nèi)容:

$ pod install --verbose

Analyzing dependencies

Updating spec repositories
Updating spec repo `master`
  $ /usr/bin/git pull
  Already up-to-date.


Finding Podfile changes
  - AFNetworking
  - HockeySDK

Resolving dependencies of `Podfile`
Resolving dependencies for target `Pods' (iOS 6.0)
  - AFNetworking (= 1.2.1)
  - SDWebImage (= 3.2)
    - SDWebImage/Core

Comparing resolved specification to the sandbox manifest
  - AFNetworking
  - HockeySDK

Downloading dependencies

-> Using AFNetworking (1.2.1)

-> Using HockeySDK (3.0.0)
  - Running pre install hooks
    - HockeySDK

Generating Pods project
  - Creating Pods project
  - Adding source files to Pods project
  - Adding frameworks to Pods project
  - Adding libraries to Pods project
  - Adding resources to Pods project
  - Linking headers
  - Installing libraries
    - Installing target `Pods-AFNetworking` iOS 6.0
      - Adding Build files
      - Adding resource bundles to Pods project
      - Generating public xcconfig file at `Pods/Pods-AFNetworking.xcconfig`
      - Generating private xcconfig file at `Pods/Pods-AFNetworking-Private.xcconfig`
      - Generating prefix header at `Pods/Pods-AFNetworking-prefix.pch`
      - Generating dummy source file at `Pods/Pods-AFNetworking-dummy.m`
    - Installing target `Pods-HockeySDK` iOS 6.0
      - Adding Build files
      - Adding resource bundles to Pods project
      - Generating public xcconfig file at `Pods/Pods-HockeySDK.xcconfig`
      - Generating private xcconfig file at `Pods/Pods-HockeySDK-Private.xcconfig`
      - Generating prefix header at `Pods/Pods-HockeySDK-prefix.pch`
      - Generating dummy source file at `Pods/Pods-HockeySDK-dummy.m`
    - Installing target `Pods` iOS 6.0
      - Generating xcconfig file at `Pods/Pods.xcconfig`
      - Generating target environment header at `Pods/Pods-environment.h`
      - Generating copy resources script at `Pods/Pods-resources.sh`
      - Generating acknowledgements at `Pods/Pods-acknowledgements.plist`
      - Generating acknowledgements at `Pods/Pods-acknowledgements.markdown`
      - Generating dummy source file at `Pods/Pods-dummy.m`
  - Running post install hooks
  - Writing Xcode project file to `Pods/Pods.xcodeproj`
  - Writing Lockfile in `Podfile.lock`
  - Writing Manifest in `Pods/Manifest.lock`

Integrating client project

可以上到,整個過程執(zhí)行了很多操作,不過把它們分解之后,再看看,會發(fā)現(xiàn)它們都很簡單。讓我們逐步來分析一下。

讀取 Podfile 文件

你是否對 Podfile 的語法格式感到奇怪過,那是因為這是用 Ruby 語言寫的。相較而言,這要比現(xiàn)有的其他格式更加簡單好用一些。

在安裝期間,第一步是要弄清楚顯示或隱式的聲明了哪些第三方庫。在加載 podspecs 過程中,CocoaPods 就建立了包括版本信息在內(nèi)的所有的第三方庫的列表。Podspecs 被存儲在本地路徑 ~/.cocoapods 中。

版本控制和沖突

CocoaPods 使用語義版本控制 - Semantic Versioning 命名約定來解決對版本的依賴。由于沖突解決系統(tǒng)建立在非重大變更的補(bǔ)丁版本之間,這使得解決依賴關(guān)系變得容易很多。例如,兩個不同的 pods 依賴于 CocoaLumberjack 的兩個版本,假設(shè)一個依賴于 2.3.1,另一個依賴于 2.3.3,此時沖突解決系統(tǒng)可以使用最新的版本 2.3.3,因為這個可以向后與 2.3.1 兼容。

但這并不總是有效。有許多第三方庫并不使用這樣的約定,這讓解決方案變得非常復(fù)雜。

當(dāng)然,總會有一些沖突需要手動解決。如果一個庫依賴于 CocoaLumberjack 的 1.2.5,另外一個庫則依賴于 2.3.1,那么只有最終用戶通過明確指定使用某個版本來解決沖突。

加載源文件

CocoaPods 執(zhí)行的下一步是加載源碼。每個 .podspec 文件都包含一個源代碼的索引,這些索引一般包裹一個 git 地址和 git tag。它們以 commit SHAs 的方式存儲在 ~/Library/Caches/CocoaPods 中。這個路徑中文件的創(chuàng)建是由 Core gem 負(fù)責(zé)的。

CocoaPods 將依照 Podfile、.podspec 和緩存文件的信息將源文件下載到 Pods 目錄中。

生成 Pods.xcodeproj

每次 pod install 執(zhí)行,如果檢測到改動時,CocoaPods 會利用 Xcodeproj gem 組件對 Pods.xcodeproj 進(jìn)行更新。如果該文件不存在,則用默認(rèn)配置生成。否則,會將已有的配置項加載至內(nèi)存中。

安裝第三方庫

當(dāng) CocoaPods 往工程中添加一個第三方庫時,不僅僅是添加代碼這么簡單,還會添加很多內(nèi)容。由于每個第三方庫有不同的 target,因此對于每個庫,都會有幾個文件需要添加,每個 target 都需要:

  • 一個包含編譯選項的 .xcconfig 文件
  • 一個同時包含編譯設(shè)置和 CocoaPods 默認(rèn)配置的私有 .xcconfig 文件
  • 一個編譯所必須的 prefix.pch 文件
  • 另一個編譯必須的文件 dummy.m

一旦每個 pod 的 target 完成了上面的內(nèi)容,整個 Pods target 就會被創(chuàng)建。這增加了相同文件的同時,還增加了另外幾個文件。如果源碼中包含有資源 bundle,將這個 bundle 添加至程序 target 的指令將被添加到 Pods-Resources.sh 文件中。還有一個名為 Pods-environment.h 的文件,文件中包含了一些宏,這些宏可以用來檢查某個組件是否來自 pod。最后,將生成兩個認(rèn)可文件,一個是 plist,另一個是 markdown,這兩個文件用于給最終用戶查閱相關(guān)許可信息。

寫入至磁盤

直到現(xiàn)在,許多工作都是在內(nèi)存中進(jìn)行的。為了讓這些成果能被重復(fù)利用,我們需要將所有的結(jié)果保存到一個文件中。所以 Pods.xcodeproj 文件被寫入磁盤,另外兩個非常重要的文件:Podfile.lockManifest.lock 都將被寫入磁盤。

Podfile.lock

這是 CocoaPods 創(chuàng)建的最重要的文件之一。它記錄了需要被安裝的 pod 的每個已安裝的版本。如果你想知道已安裝的 pod 是哪個版本,可以查看這個文件。推薦將 Podfile.lock 文件加入到版本控制中,這有助于整個團(tuán)隊的一致性。

Manifest.lock

這是每次運(yùn)行 pod install 命令時創(chuàng)建的 Podfile.lock 文件的副本。如果你遇見過這樣的錯誤 沙盒文件與 Podfile.lock 文件不同步 (The sandbox is not in sync with the Podfile.lock),這是因為 Manifest.lock 文件和 Podfile.lock 文件不一致所引起。由于 Pods 所在的目錄并不總在版本控制之下,這樣可以保證開發(fā)者運(yùn)行 app 之前都能更新他們的 pods,否則 app 可能會 crash,或者在一些不太明顯的地方編譯失敗。

xcproj

如果你已經(jīng)依照我們的建議在系統(tǒng)上安裝了 xcproj,它會對 Pods.xcodeproj 文件執(zhí)行一下 touch 以將其轉(zhuǎn)換成為舊的 ASCII plist 格式的文件。為什么要這么做呢?雖然在很久以前就不被其它軟件支持了,但是 Xcode 仍然依賴于這種格式。如果沒有 xcproj,你的 Pods.xcodeproj 文件將會以 XML 格式的 plist 文件存儲,當(dāng)你用 Xcode 打開它時,它會被改寫,并造成大量的文件改動。

結(jié)果

運(yùn)行 pod install 命令的最終結(jié)果是許多文件被添加到你的工程和系統(tǒng)中。這個過程通常只需要幾秒鐘。當(dāng)然沒有 Cocoapods 這些事也都可以完成。只不過所花的時間就不僅僅是幾秒而已了。

補(bǔ)充:持續(xù)集成

CocoaPods 和持續(xù)集成在一起非常融洽。雖然持續(xù)集成很大程度上取決于你的項目配置,但 Cocoapods 依然能很容易地對項目進(jìn)行編譯。

Pods 文件夾的版本控制

如果 Pods 文件夾和里面的所有內(nèi)容都在版本控制之中,那么你不需要做什么特別的工作,就能夠持續(xù)集成。我們只需要給 .xcworkspace 選擇一個正確的 scheme 即可。

不受版本控制的 Pods 文件夾

如果你的 Pods 文件夾不受版本控制,那么你需要做一些額外的步驟來保證持續(xù)集成的順利進(jìn)行。最起碼,Podfile 文件要放入版本控制之中。另外強(qiáng)烈建議將生成的 .xcworkspacePodfile.lock 文件納入版本控制,這樣不僅簡單方便,也能保證所使用 Pod 的版本是正確的。

一旦配置完畢,在持續(xù)集成中運(yùn)行 CocoaPods 的關(guān)鍵就是確保每次編譯之前都執(zhí)行了 pod install 命令。在大多數(shù)系統(tǒng)中,例如 Jenkins 或 Travis,只需要定義一個編譯步驟即可 (實際上,Travis 會自動執(zhí)行 pod install 命令)。對于 Xcode Bots,在書寫這篇文章時我們還沒能找到非常流暢的方式,不過我們正朝著解決方案努力,一旦成功,我們將會立即分享。

結(jié)束語

CocoaPods 簡化了 Objective-C 的開發(fā)流程,我們的目標(biāo)是讓第三方庫更容易被發(fā)現(xiàn)和添加。了解 CocoaPods 的原理能讓你做出更好的應(yīng)用程序。我們沿著 CocoaPods 的整個執(zhí)行過程,從載入 specs 文件和源代碼、創(chuàng)建 .xcodeproj 文件和所有組件,到將所有文件寫入磁盤。所以接下來,我們運(yùn)行 pod install --verbose,靜靜觀察 CocoaPods 的魔力如何顯現(xiàn)。


原文: CocoaPods Under The Hood

譯文 第6期 深入理解 CocoaPods

精細(xì)校對 @BeyondVincent

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日本黄色录像韩国黄色录像| av国产熟妇露脸在线观看| a久久天堂国产毛片精品| 日韩欧美国产高清在线| 91欧美日韩精品在线| 空之色水之色在线播放| 暴力性生活在线免费视频| 男人和女人干逼的视频| 九七人妻一区二区三区| 日本免费一区二区三女| 午夜激情视频一区二区| 日本高清中文精品在线不卡| 欧美精品在线播放一区二区| 亚洲天堂精品一区二区| 丝袜人妻夜夜爽一区二区三区| 日本熟妇五十一区二区三区| 中文字幕亚洲精品在线播放| 日韩欧美高清国内精品| 国产精品免费自拍视频| 久草视频这里只是精品| 九九热这里只有精品哦| 欧美精品亚洲精品日韩精品| 色哟哟国产精品免费视频| 黄色美女日本的美女日人| 丰满人妻一二区二区三区av| 色播五月激情五月婷婷| 日韩精品中文字幕亚洲| 国产亚洲视频香蕉一区| 深夜福利亚洲高清性感| 欧美成人免费视频午夜色| 肥白女人日韩中文视频| 久久精品少妇内射毛片| 久久99亚洲小姐精品综合| 亚洲国产成人爱av在线播放下载| 亚洲欧美日韩网友自拍| 亚洲一区二区三区免费的视频 | 国产伦精品一一区二区三区高清版| 国产传媒精品视频一区| 亚洲国产中文字幕在线观看| 欧美一区二区三区十区| 欧美国产日产综合精品|