一、相關(guān)課題研究主題
- CocoaPods 對(duì)比 SwiftPackageManager 和 Carthage
- CocoaPods 架構(gòu)解析
- CocoaPods 核心原理
- 創(chuàng)建 CocoaPods 本地庫(kù)、公開庫(kù)與私有庫(kù)
- 為自己的開源項(xiàng)目添加 CocoaPods 支持
- CocoaPods 與 Swift 交互說明
- CocoaPods 常見錯(cuò)誤分析與解決
- podfile 全面解析
- CocoaPos plugin 探究
- 1、探究 CocoaPods framework 與源碼關(guān)系
- 2、CocoaPods Package 使用與原理
- 3、CocoaPods-generate 使用與原理
- 4、基于 CocoaPods 組件二進(jìn)制化
- 5、組件化與 CI
- 實(shí)踐:自定義 plugin 之調(diào)試二進(jìn)制組件源碼
- 實(shí)踐:Flutter podhelper.rb 分析
二、名詞解釋
索引庫(kù):用來檢索 clone 項(xiàng)目真正地址的一個(gè)代碼倉(cāng)庫(kù),分為公開索引庫(kù)和私有索引庫(kù),公開索引庫(kù)即 https://github.com/CocoaPods/Specs.git,只能接受開源框架。
命令:
pod repo:輸出本地所有的索引庫(kù)信息
pod repo push [索引庫(kù)名稱] [podspec文件名]:將 podspec 文件 push 到本地索引庫(kù),例如 pod repo push huayuerepos DRNetworkService.podspec --verbose --allow-warnings --sources=http://172.31.0.116/iOS/huayuerepos.git,https://github.com/CocoaPods/Specs.git --use-libraries
// 下面是輔助 pod 通過編譯的一些命令參數(shù)
—allow-warnings // 忽略編譯告警
—verbose // 輸出詳細(xì)的信息
—use-libraries // 使用靜態(tài)庫(kù),如果私有庫(kù)中存在.a文件,則必須加上這個(gè)參數(shù)。自定義了pod 私有庫(kù),同時(shí)引用了另一個(gè)私有庫(kù)
—sources=xxxx,xxxxx // 引用的源碼倉(cāng)庫(kù)地址,默認(rèn) github 源,多個(gè)源之間以英文逗號(hào)分隔;當(dāng)自定義私有庫(kù)相互依賴時(shí),可以添加自定義的私有倉(cāng)庫(kù)源
--skip-tests: 在驗(yàn)證期間跳過構(gòu)建和運(yùn)行測(cè)試
--skip-import-validation: 跳過驗(yàn)證pod是否可以導(dǎo)入,即跳過鏈接步驟
pod spec create [filename]:創(chuàng)建 podspec 文件
pod spec lint --private:podspec 文件本地驗(yàn)證,等效于 pod lib lint
pod spec lint [filename]:podspec 文件遠(yuǎn)程驗(yàn)證
三、制作本地私有庫(kù)
終端下輸入 pod repo,如果之前沒有創(chuàng)建過本地索引庫(kù),輸出信息為:
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/Jack/.cocoapods/repos/master
瀏覽器打開 https://github.com/CocoaPods/Specs,可以看到一個(gè) Specs 文件夾,文件夾內(nèi)包含目前所有支持 CocoaPods 框架的索引,但 https://github.com/CocoaPods/Specs.git 是公開索引庫(kù),只能添加公開(開源)框架,如果想讓私有框架支持 CocoaPods,這個(gè)時(shí)候必須用私有索引庫(kù)。
1、已有開發(fā)好的框架代碼,需要抽離成私有庫(kù)
如果私有框架的代碼已存在,只需進(jìn)入對(duì)應(yīng)私有框架的根目錄,創(chuàng)建 podspec 文件,填寫正確信息后上傳,并將 podspec 文件 push 到本地私有索引庫(kù)即可。
- pod spec create xxx // 創(chuàng)建 podspec 文件
- pod lib lint --private // podspec 文件本地驗(yàn)證
- pod spec lint xxx.podspec --allow-warnings // podspec 文件遠(yuǎn)程驗(yàn)證,忽略編譯告警
- git add . // 添加 podspec 文件
- git commit -m xx // 提交 podspec 文件
- git push origin master // 將 podspec 文件推送至遠(yuǎn)程代碼倉(cāng)庫(kù)
- pod repo push [本地私有索引庫(kù)名稱] [podspec文件名.podspec] // 將 podspec 文件 push 到本地索引庫(kù)
- pod repo // 查看本地的索引庫(kù)信息
- cd [需要 push 的索引庫(kù) path]
- git status // 查看第 7 步是否成功,如果沒有成功,則看不到變更,此時(shí)需要檢測(cè)哪里出了問題,并重新開始
- git add .
- git commit -m "xx"
- git push origin master // 將本地索引庫(kù)的修改記錄 push 至遠(yuǎn)程索引庫(kù)
2、從 0 開始創(chuàng)建一個(gè)私有庫(kù)
如果從 0 開始創(chuàng)建一個(gè)私有庫(kù),則按照以下步驟執(zhí)行:(以下均以TestLib為例,請(qǐng)自行替換)
終端進(jìn)入準(zhǔn)備創(chuàng)建 lib 的文件夾,執(zhí)行命令 pod lib create TestLib
這個(gè)過程可能需要等待幾秒,之后會(huì)出現(xiàn)如下信息:
What language do you want to use?? [ Swift / ObjC ]
Would you like to include a demo application with your library? [ Yes / No ]
Which testing frameworks will you use? [ Specta / Kiwi / None ]
Would you like to do view based testing? [ Yes / No ]
根據(jù)提示輸入即可,完成后會(huì)自動(dòng)打開 TestLib 對(duì)應(yīng)的 Example 工程
執(zhí)行 tree 命令查看目錄結(jié)構(gòu)
01:TestLib Jack$ tree TestLib -L 2
TestLib
├── Example
│ ├── Podfile
│ ├── Podfile.lock
│ ├── Pods
│ ├── TestLib
│ ├── TestLib.xcodeproj
│ ├── TestLib.xcworkspace
│ └── Tests
├── LICENSE
├── README.md
├── TestLib
│ ├── Assets
│ └── Classes
├── TestLib.podspec
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj
10 directories, 5 files
將組件放入TestLib/Classes 中,并刪除 ReplaceMe.m,進(jìn)入 Example 文件夾執(zhí)行 pod install 后,TestLib 對(duì)應(yīng)的 Example 工程已經(jīng)裝載好,可以進(jìn)行 demo 演示。以后每次更新 lib,都需要進(jìn)到 Example 中執(zhí)行 pod install 獲取最新代碼。
- 創(chuàng)建遠(yuǎn)程私有庫(kù)
這里 README.md、開源許可證、gitignore 都不需要添加,從上面 TestLib 的目錄結(jié)構(gòu)可以看到,pod lib create 已經(jīng)創(chuàng)建了這三個(gè)文件,如果添加,在 commit 時(shí)候會(huì)導(dǎo)致沖突(文件內(nèi)容不完全相同),所以只要?jiǎng)?chuàng)建一個(gè)最干凈的私有庫(kù)。
Pod::Spec.new do |s|
s.name = 'TestLib'
s.version = '0.1.0'
s.summary = 'TestLib'
s.description = <<-DESC
TestLib只是一個(gè)演示
DESC
s.homepage = 'https://coding.net/u/coder_01/p/TestLib'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { '01_Jack' => '123@qq.com' }
s.source = { :git => 'git@git.coding.net:coder_01/PrivateSpecs.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0'
s.source_files = 'TestLib/Classes/**/*'
# s.resource_bundles = {
# 'TestLib' => ['TestLib/Assets/*.png']
# }
s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
- 對(duì) podspec 進(jìn)行本地驗(yàn)證,--sources 可以添加私有庫(kù)地址,多個(gè)以逗號(hào)分隔:
pod lib lint --sources='私有倉(cāng)庫(kù)repo地址,https://github.com/CocoaPods/Specs'
如果因?yàn)?waring 驗(yàn)證不通過可以加上--allow-warnings,遠(yuǎn)程驗(yàn)證和 pod repo push 同理
- 對(duì) podspec 進(jìn)行遠(yuǎn)程驗(yàn)證
pod spec lint xx --allow-warnings
- 打包
驗(yàn)證通過后打包類庫(kù),這里可以用 cocoapods 的插件 cocoapods-packager 來完成。如果之前沒有安裝 cocoapods-packager,執(zhí)行以下命令:
sudo gem install cocoapods-packager
打包:pod package TestLib.podspec --force
默認(rèn)打包成.framework,如果加上 --library 則打包成.a。
驗(yàn)證通過后,通過 git status 可查看當(dāng)前git改變狀態(tài),不需要提交的文件可添加到gitignore中。
git status
git add .
git commit -m 'first blood'
到這里已經(jīng)可以將代碼提交到遠(yuǎn)程倉(cāng)庫(kù),但需要先添加倉(cāng)庫(kù)地址再提交
- 上傳
git remote add origin [git@git.coding.net](mailto:git@git.coding.net):coder_01/TestLib.git
git push origin master
在對(duì) podspec 做遠(yuǎn)程驗(yàn)證前要先 push tag,tag 必須與 podspec 中的 version 一致
git tag 0.1.0
git push --tags
pod spec lint --private
遠(yuǎn)程驗(yàn)證通過后,將 TestLib.podspec push 到遠(yuǎn)程私有索引庫(kù),同樣,需要先添加倉(cāng)庫(kù)再push
- 創(chuàng)建私有索引庫(kù)
pod repo add PrivateSpecs [git@git.coding.net](mailto:git@git.coding.net):coder_01/PrivateSpecs.git
pod repo push PrivateSpecs TestLib.podspec
查看索引庫(kù)
pod repo
此時(shí)本地索引庫(kù)長(zhǎng)這樣
cd ~/.cocoapods/repos
open .
PrivateSpecs
最基本的制作到這里就完成了,現(xiàn)在能搜到 TestLib 這個(gè)庫(kù)
pod search TestLib
pod search
新建工程,pod init,修改 podfile 文件。這里需要添加兩個(gè) source,一個(gè)原 master repo,一個(gè)后添加的 PrivateSpecs
source '[git@git.coding.net](mailto:git@git.coding.net):coder_01/PrivateSpecs.git'
source '[https://github.com/CocoaPods/Specs.git](https://github.com/CocoaPods/Specs.git)'
use_frameworks!
target 'Test' do
pod 'TestLib'
end
執(zhí)行 pod install 即可使用 TestLib 框架
Tip:如果組件中含有圖片、音視頻、xib/storyboard等,podspec的描述與代碼中的寫法都需要改變
四、常見問題
1、pod repo push / pod lib lint i386 x86_64 驗(yàn)證不通過 (Cocoapods 校驗(yàn)邏輯 https://xiaozhuanlan.com/topic/5869024173)
產(chǎn)生背景:在制作私有庫(kù)的時(shí)候,依賴了某 SDK,該 SDK 只能在真機(jī)編譯,即只支持真機(jī)指令集,不支持模擬器指令集
pod repo push / pod lib lint 驗(yàn)證的時(shí)候,會(huì)驗(yàn)證模擬器指令集(i386、x86_64)
解決方案:跳過對(duì)模擬器指令集的驗(yàn)證 --skip-import-validation