CocoaPods 相關(guān)課題研究和本地庫(kù)制作

一、相關(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

瀏覽器打開 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ù)即可。

  1. pod spec create xxx // 創(chuàng)建 podspec 文件
  2. pod lib lint --private // podspec 文件本地驗(yàn)證
  3. pod spec lint xxx.podspec --allow-warnings // podspec 文件遠(yuǎn)程驗(yàn)證,忽略編譯告警
  4. git add . // 添加 podspec 文件
  5. git commit -m xx // 提交 podspec 文件
  6. git push origin master // 將 podspec 文件推送至遠(yuǎn)程代碼倉(cāng)庫(kù)
  7. pod repo push [本地私有索引庫(kù)名稱] [podspec文件名.podspec] // 將 podspec 文件 push 到本地索引庫(kù)
  8. pod repo // 查看本地的索引庫(kù)信息
  9. cd [需要 push 的索引庫(kù) path]
  10. git status // 查看第 7 步是否成功,如果沒有成功,則看不到變更,此時(shí)需要檢測(cè)哪里出了問題,并重新開始
  11. git add .
  12. git commit -m "xx"
  13. 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容