不識廬山真面目,只緣身在此山中html
原文連接ios
CocoaPods是OS X和iOS下的一個第三類庫管理工具,經過CocoaPods工具咱們能夠爲項目添加被稱爲「Pods」的依賴庫(這些類庫必須是CocoaPods自己所支持的),而且能夠輕鬆管理其版本。c++
iOS程序依賴管理工具還有Carthage(Carthage 是由 Swift 語言寫的,只支持動態框架,只支持 iOS8+),工程中能夠Carthage和CocoaPods一塊兒存在使用,可是建議使用一種,我的推薦CocoaPods。git
CocoaPods項目源碼github
CocoaPods須要Ruby環境,安裝Ruby和修改ruby鏡像命令以下:(Mac自帶 Ruby)json
#安裝ruby
gem install ruby
#升級ruby
sudo gem update --system
#檢查版本
ruby -v
# 更新ruby鏡像
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
#檢查鏡像是否更新成功
gem sources -l
複製代碼
下載和卸載命令緩存
#下載最新版本
sudo gem install cocoapods (sudo gem install -n /usr/local/bin cocoapods)
#下載指定版本
sudo gem install cocoapods -v 1.6.1
#卸載
sudo gem uninstall cocoapods
#卸載指定版本
sudo gem uninstall cocoapods -v 1.6.1
#檢查pod版本
pod --version
複製代碼
還能夠在工程目錄下,使用Gemfile
來指定使用cocoapods的版本。ruby
gem "cocoapods", '~> 1.6.1'
複製代碼
建立Podfile文件bash
#進入項目根路徑中執行,生成Podfile文件(若是有Podfile文件不用執行pod init)
pod init
複製代碼
說明:Podfile文件詳細描述了一個或多個工程中targets的依賴關係服務器
Podfile添加第三方庫依賴
target 'QSAppDemo' do
pod 'AFNetworking'
pod 'YYModel', '~> 1.0.4'
pod 'OOMDetector', '1.3'
# Debug模式下生效
pod 'FLEX', '~> 2.0', :configurations => ['Debug']
pod 'WebViewJavascriptBridge', :git => 'https://github.com/marcuswestin/WebViewJavascriptBridge.git'
end
複製代碼
下載和安裝第三方庫
pod install
複製代碼
說明1:下載成功後,使用CocoaPods 生成的 .xcworkspace 文件來打開工程;每次更改了 Podfile 文件,要從新執行一次pod update命令;
說明2:發生執行pod install
或pod update
都卡在Analyzing dependencies
的狀況,是由於要升級CocoaPods的spec倉庫,命令後添加--verbose --no-repo-update
參數能夠省略此步。
若是依賴項後不指定版本,默認取最新版本
pod 'OOMDetector'
複製代碼
若是依賴項後跟上特定版本,就是使用指定版本
pod 'OOMDetector'
複製代碼
> 0.1
高於0.1版本(不包含0.1版本)的任意一個版本
>= 0.1
高於0.1版本(包含0.1版本)的任意一個版本
< 0.1
低於0.1版本(不包含0.1版本)的任意一個
<= 0.1
低於0.1版本(包含0.1版本)的任意一個
~> 0.1.2
版本 0.1.2的版本到0.2 ,不包括0.2。這個基於你指定的版本號的最後一個部分。這個例子等效於>= 0.1.2而且 <0.2.0,而且始終是你指定範圍內的最新版本。
引入master分支(默認)
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git'
複製代碼
引入指定的分支
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :branch => 'develop'
複製代碼
引入某個節點的代碼
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '2.7.0'
複製代碼
引入某個特殊的提交節點
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '685e31a31bb1ebce3fdb5a752e392dfd8263e169'
複製代碼
Source:指定pod的來源。若是不指定source,默認是使用CocoaPods官方的source
# 使用官方默認地址(默認)
source 'https://github.com/CocoaPods/Specs.git'
複製代碼
use_frameworks!:使用此命令會在Pods工程下的Frameworks目錄下生成依賴庫的framework,若是不使用,會在Pods工程下的Products目錄下生成.a的靜態庫。
target 'QSAppDemo' do
use_frameworks!
end
複製代碼
關於Pofile的詳細語法能夠參考: Podfile Syntax Reference 或 Podfile文件用法詳解
因爲業務須要,須要開發某業務SDK,方便公司內業務接入,選擇使用建立私有Pod庫;
本質上,建立公有Pod庫或者私有Pod庫原理是同樣的,不同的是:二者的版本索引查詢方式不同, 公有庫的podspec由CocoaPods/Specs管理, 而內部私有使用的pod庫須要公司內部創建一個倉庫來管理podspec。
私有spec repo的構建形式有兩種, 一種是私有git服務器上面建立,一種是本機建立;通常是在公司內部搭建的git服務器上面建立私有spec repo
#將遠程的私有版本倉庫添加到本地
pod repo add qs_private_pods_specs https://github.com/buaa0300/qs_private_pods_specs.git
#添加成功後,打開~/.cocoapods/repos能夠看到新增的qs_private_pods_specs
複製代碼
pod lib create QSBizSDK # QSBizSDK是SDK的名字
What platform do you want to use?? [ iOS / macOS ]
> iOS
What language do you want to use?? [ Swift / ObjC ]
> ObjC
Would you like to include a demo application with your library? [ Yes / No ]
> YES
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
Would you like to do view based testing? [ Yes / No ]
> No
What is your class prefix?
> QS
......
複製代碼
說明1:pod lib create QSBizSDK
實際上是下載了一個pod模板,而後在內部經過更改.podspec文件的配置定製化本身的pod,podspec是描述pod的說明信息的。 說明2: pod lib create ProjectName
其實使用了默認參數,補全的話pod lib create ProjectName --template-url=https://github.com/CocoaPods/pod-template.git
說明3: 將項目託管到Git,私有庫通常上傳到內部的倉庫中。
Pod::Spec.new do |s|
s.name = 'QSBizSDK'
s.version = '1.0.0'
s.summary = 'A short description of QSBizSDK.'
s.description = <<-DESC Add long description of the pod here. DESC
s.homepage = 'https://github.com/buaa0300/QSBizSDK'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = {'南華coder' => 'buaa0300@qq.com'}
s.source = { :git => 'https://github.com/buaa0300/QSBizSDK.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.default_subspec = 'QSCore'
# 各個子模塊的個自的源碼路徑
s.subspec 'QSCore' do |qscore|
qscore.source_files = 'Classes/QSCore/**/*'
end
# A a 必定要不同,是別名,添加好暴露的頭文件
s.subspec 'A' do |a|
a.source_files = 'Classes/QSCore/A/**/*'
a.public_header_files='Classes/QSCore/A/*.h'
end
# 能夠添加內部本身模塊,或者外部的依賴
s.subspec 'B' do |b|
a.source_files = 'Classes/QSCore/B/**/*'
a.public_header_files='Classes/QSCore/B/*.h'
b.dependency 'Classes/QSCore/A'
b.dependency 'AFNetworking', '~> 3.0'
b.frameworks = 'SystemConfiguration', 'CFNetwork', 'PassKit'
b.libraries = 'c++', 'z'
end
s.subspec 'C' do |c|
c.source_files = 'Classes/QSCore/C/**/*'
c.dependency 'Classes/QSCore/B'
end
end
複製代碼
說明:對於一個功能比較多的SDK,podspec中須要作的事情比較多,如利用subspec將代碼模塊化,方便使用時按需導入;不一樣的模塊可能依賴framework、靜態庫、內部其餘模塊,也須要處理好;
說明2:可使用pod spec lint xxx.podspec
來檢查podspec的配置有效性
pod repo push qs_private_pods_specs QSBizSDK.podspec
複製代碼
說明:添加成功以後qs_private_pods_specs
中會包含QSBizSDK庫的podspec信息, 能夠前往~/.cocoapods/repos
下的qs_private_pods_specs
文件夾中查看, 同時git服務器中的遠端也更新了.
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_setting["ENABLE_BITCODE"] = 'NO'
end
end
end
複製代碼
#查看本地pod緩存
pod cache list
#清除某個庫緩存
pod cache clean xxxx
# 清除全部pod緩存
pod cache clean -all
#刪除緩存方法
rm ~/Library/Caches/Cocoapods/Pods/Pods/Release
複製代碼
# 更新庫命令
pod repo update
# 刪除 search_index.json 文件
rm ~/Library/Caches/CocoaPods/search_index.json
複製代碼