CocoaPods
什么是 CocoaPods
CocoaPods 是基于Ruby編寫的一應用級別的依賴管理器,其中涵蓋了4.5萬個庫
https://cocoapods.org/
CocoaPods 組成
CocoaPods/CocoaPod
這是是一個面向用戶的組件,每當執行一個 pod 命令時,這個組件都將被激活。該組件包括了所有使用 CocoaPods 涉及到的功能,并且還能通過調用所有其它的 gems 來執行任務。CocoaPods/Core
Core 組件提供支持與 CocoaPods 相關文件的處理,文件主要是 Podfile 和 podspecs。Podfile
Podfile 是一個文件,用于定義項目所需要使用的第三方庫。Podspec
.podspec 也是一個文件,該文件描述了一個庫是怎樣被添加到工程中的。它支持的功能有:列出源文件、framework、編譯選項和某個庫所需要的依賴等。CocoaPods/Xcodeproj
這個 gem 組件負責所有工程文件的整合。它能夠對創建并修改 .xcodeproj 和 .xcworkspace 文件。它也可以作為單獨的一個 gem 包使用。如果你想要寫一個腳本來方便的修改工程文件,那么可以使用這個 gem。
什么是 Ruby
Ruby 是一種開源的面向對象程序設計的服務器端腳本語言,OS X已自帶Ruby
Podfile就是通過Ruby腳本解析的
安裝 CocoaPods
sudo gem install cocoapods
Gem 是 Ruby 模塊 (叫做 Gems) 的包管理器。其包含包信息,以及用于安裝的文件。
安裝問題
-
國內網絡環境無法連接源
ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError) Errno::ECONNRESET: Connection reset by peer - SSL_connect
解決方法:替換國內鏡像源
gem sources --remove https://rubygems.org/ gem sources -a https://gems.ruby-china.com/
-
Ruby環境版本過低
Unable to resolve dependencies: cocoapods requires cocoapods-core (=0.35.0), claide (~> 0.7.0), xcodeproj (~> 0.20.2), cocoapods-downloader (~> 0.8.0)
解決方法:升級Ruby
sudo gem update --system
輸入后出現
ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /usr/bin directory.
因缺少權限需要更換安裝目錄
sudo gem install cocoapods -n /usr/local/bin
使用 CocoaPods
pod常用命令
#從本地倉庫記錄搜索
pod search
#初始化、更新倉庫信息
pod setup
#更新倉庫信息
pod repo update
#為項目創建Podfile
pod init
#根據Podfile安裝第三方庫
pod install
#根據Podfile更新第三方庫
pod update
#根據Podfile安裝/更新第三方庫,同時不更新倉庫信息
pod install --verbose --no-repo-update
pod update --verbose --no-repo-update
查詢Pod庫也可直接從官網搜索
集成 CocoaPods
-
創建Podfile
終端進入工程目錄輸入
pod init
即可創建Podfile,若為Swift項目
# use_frameworks!
此句會自動取消注釋,表明依賴的庫編譯生成.frameworkds,而不是.a
若項目中有多個Target則一個Podfile中會生成多段模板# Uncomment the next line to define a global platform for your project # platform :ios, '9.0' target 'TargetName' do # Uncomment the next line if you're using Swift or would like to use dynamic frameworks # use_frameworks! # Pods for TargetName end
消除第三方庫警告
platform :ios, '9.0' # 隱藏所有警告 inhibit_all_warnings! target 'TargetName' do # 不要隱藏ReactiveObjC的警告,也可以用此方法只隱藏指定pod警告。 pod 'xxx', '~> 1.0.0', :inhibit_warnings => false end
-
編輯Podfile
pod 'xxx' : 使用倉庫記錄的最新版本。 pod 'xxx', '1.0' : 使用1.0版本。 pod 'xxx', '~>1.0': 則表示使用的版本范圍是 1.0 <= 版本 < 2.0 若為是~>1.0.0, 那么則表示使用的版本范圍是 1.0.0 <= 版本 < 1.1.0 pod 'xxx', '>1.0': 使用大于1.0的版本 pod 'xxx', '>=1.0': 使用1.0及以上的版本 pod 'xxx', '<1.0': 使用小于1.0的版本 pod 'xxx', '<=1.0': 使用小于等于1.0的版本 pod 'xxx', :path => '本地代碼倉庫的路徑/xxx.podspec' #使用該方式可以指定本地存在的依賴路徑(podspec文件稍后會結介紹到)。 pod 'xxx', :git => 'git倉庫地址' #可以通過git倉庫地址來加載相關依賴。 pod 'xxx', :git => '本地代碼倉庫的路徑', :tag => '2.2.2' :#后方可以跟:tag參數來指定相關的tag號。當然后邊還可以通過:branch => '分支號'來指定依賴于某個分支,通過:commit => 'commit號'來指定那個提交。
若使用多個私有庫則可直接在Podfile開始添加source,但必須添加所有需要的source,否則無法找到目標庫
CocoaPods 公共庫索引地址source 'https://github.com/CocoaPods/Specs.git'
-
安裝/更新第三方庫
pod install pod update
安裝完成后會創建 Pods目錄、Podfile.lock文件、和.xcworkspace文件
以后項目都從.xcworkspace打開
Pods目錄下下載了第三方庫,此目錄需要加入.gitignore文件中,避免隨git提交/Pods
執行install命令時會檢查Podfile.lock文件,若沒有則會創建一個
Podfile.lock記錄了創建時所安裝的依賴庫版本,當目錄下有Podfile.lock文件時pod會依據Podfile.lock中記錄的版本安裝,否則就安裝Podfile中指定版本或最新版本
update指令則會對未指定版本的庫進行更新,并更新Podfile.lock
所以當協作開發時,每當一人更新了依賴庫版本,也要提交Podfile.lock,其他人拉取后使用install指令而非update對Pod依賴庫進行更新,方便統一版本
當發現無法更新到最新版本庫時,執行pod setup
更新本地倉庫索引
刪除 CocoaPods
- Target->Build Phases,刪除 [CP]Check Pods Manifest.lock 和 [CP]Copy Pods Resources
- 刪除項目Pod相關引用
- 刪除項目目錄下Pod文件
制作 CocoaPods 倉庫
創建框架工程并建立git倉庫
編輯工程打tag
創建私有Repo git倉庫
-
創建Pod配置文件
pod spec create XXX
生成.podspec文件,內容如下
name:框架名 version:當前版本,后續更新了新版本,需要修改此處,需要有對應git tag summary:簡要描述,在pod search時會顯示該信息。 description:詳細描述 homepage:頁面鏈接 license:開源協議 author:作者 source:源碼git地址 platform:支持最低ios版本 source_files:源文件(可以包含.h和.m) public_header_files:頭文件(.h文件) resources:資源文件(配置的文件都會被放到mainBundle中) resource_bundles:資源文件(配置的文件會放到你自己指定的bundle中) frameworks:依賴的系統框架 vendored_frameworks:依賴的非系統框架 libraries:依賴的系統庫 vendored_libraries:依賴的非系統的靜態庫 dependency:依賴的三方庫
官方示例
Pod::Spec.new do |spec|
spec.name = 'Reachability'
spec.version = '3.1.0'
spec.license = { :type => 'BSD' }
spec.homepage = 'https://github.com/tonymillion/Reachability'
spec.authors = { 'Tony Million' => 'tonymillion@gmail.com' }
spec.summary = 'ARC and GCD Compatible Reachability Class for iOS and macOS.'
spec.source = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
spec.source_files = 'Reachability.h,m'
spec.framework = 'SystemConfiguration'
spec.requires_arc = true
end
-
校驗配置文件
可用該指令進行本地校驗合法性pod lib lint
更多詳細配置方式可上官網
在push repo時會自動進行校驗,但如果校驗有warning或error則不能push,可添加--allow-warnings
忽略警告 -
添加/推送repo
pod repo add [repo名] [repo git地址] pod repo push [repo名] [podspec文件路徑]
推送完成使用
pod spec lint
進行網絡校驗,校驗source是否由指定tag
CocoaPod 工作原理
操作過程
- 分析依賴項
- 檢查工程target
- 查找Podfile變化
- 解析Podfile
- 比較詳情文件
- 下載依賴項
- 安裝依賴項
- 創建Pod工程
- 創建工程
- 添加依賴源文件
- 添加framework
- 添加libraries
- 添加資源文件
- 鏈接頭文件
- 安裝依賴項target
- 寫入pod工程文件
- 寫lockfile
- 寫manifest
- 整合工程
- 整合target
索引目錄結構
~/.cocoapods/repos
.
├── Specs
└── [SPEC_NAME]
└── [VERSION]
└── [SPEC_NAME].podspec
工程結構
Demo
├── Demo
│ ├── Demo
│ ├── Demo.xcodeproj
│ ├── DemoTests
│ └── DemoUITests
├── Demo.xcworkspace
├── PodFile
├── Podfile.lock
└── Pods
├── AFNetworking
│ ├── Source Files
│ └── Support Files
│ ├── AFNetworking-dummy.m
│ ├── AFNetworking-prefix.pch
│ └── AFNetworking.xcconfig
├── Headers
├── Manifest.lock
├── Pods.xcodeproj
└── Target Support Files
├── Pods-Demo-acknowledgements.markdown
├── Pods-Demo-acknowledgements.plist
├── Pods-Demo-dummy.m
├── Pods-Demo-frameworks.sh
├── Pods-Demo-resources.sh
├── Pods-Demo.debug.xcconfig
└── Pods-Demo.release.xcconfig
-
target support files
- .xcconfig 配置環境變量
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SDWebImage" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/SDWebImage" OTHER_LDFLAGS = -framework "ImageIO" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/SDWebImage PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES
CONFIGURATION_BUILD_DIR : buid location GCC_PREPROCESSOR_DEFINITIONS : Clang preprocess OTHER_LDFLAGS : link binary with libraries PRODUCT_BUNDLE_IDENTIFIER : packaging SKIP_INSTALL
- -dummy.m
compile source
輔助純分類庫編譯實現編譯
- Pod target support files
- -acknowledgement聲明文件
- -framewrok.sh 安裝framework腳本
- -resource.sh 資源文件拷貝腳本
- check pods manifest.lock
運行時檢查安裝清單和下載清單是否一致 - copy pods resoources
執行resource拷貝