1. 程式人生 > IOS開發 >如何將自己的元件庫使用CocoaPods管理

如何將自己的元件庫使用CocoaPods管理

使用CocoaPods的好處

  • 未使用CocoaPods:整合的時候需要將原始碼拖到⼯程⾥面,⼿動新增元件需要依賴的系統庫以及根據需要新增 -ObjC 、 -fno-objc-arc等,升級元件也需要重複之前的步驟
  • 使⽤CocoaPods:修改podfile⽂件後,⼀⾏命令整合,升級或移除元件庫,不需要額外操作

使用CocoaPods管理元件化開發

1.註冊trunk

  • 不是任何人都能推送,因為cocoapods依賴trunk伺服器管理,所以需要通過trunk推送⾃己的podspec
  • 命令: pod trunk register [email protected] 'name'
  • 收到郵件有點開連結訪問⼀下就好了

2.podspec

Cocopods原理:根據Podfile描述,找到對應程式碼庫的podspec⽂件然後根據podspec中的描述,找到程式碼庫,並且找到之後,拷⻉需要的⽂件到⾃己的⼯程中。

  • 建立spec檔案命令: pod spec create spec檔名
Pod::Spec.new do |s| #設定元件庫的名稱
     s.name =
"YuntxIMLib"
#設定元件庫的版本號 s.version = "5.4.9"
#元件庫的簡介
s.summary = "容聯雲通訊IM SDK(如果看不到最新版本,請使⽤pod repo update 命令更新一下本地pod倉庫)"
# 元件庫的詳情描述,要求⽐簡介的字數多些 s.description = <<-DESC #設定倉庫主頁 s.homepage #設定許可 s.license #設定作者 s.author 容聯雲通訊SDK YuntxIMLib. (如果看不到最新版本,請使用 pod repo update 命令更新⼀下本地pod倉庫) DESC = "https://www.yuntongxun.com/" = "MIT" = { "author" => "[email protected]" } #設定支援的最低系統版本 s.ios.deployment_target = "8.0" #設定倉庫源,表示在哪可以找到元件⼯工程
s.source = { :git => "https://gitlab.com/YuntxSDK/YuntxIMLib.git",:tag => "#{s.version}" } #資源⽂檔案 s.resources = "sdk/CCPSDKBundle.bundle" #設定源⽂件路徑,不是整個⼯程的檔案,⽽是⾃己封裝的需要暴露出來的程式碼,以後別的⼯程引⼊,就會引⼊這裡的程式碼。 s.source_files = "sdk/*.h" #設定使用的靜態庫(非系統) s.vendored_library = 'sdk/*.a' #設定依賴庫(系統),不需要 lib,例如: libicucore寫成icucore即可 s.libraries = "resolv.9","icucore","sqlite3","z","xml2","bz2.1.0","c++" #設定依賴的 framework(系統),寫的時候不需要字尾名 s.framework = "CoreTelephony","MediaPlayer","CFNetwork","SystemConfiguration","MobileCoreServices","AudioToolbox","AVFoundation","Vide oToolbox" #設定使用的framework(非系統) # vendored_frameworks = "" #設定⼦目錄 s.subspec 'Delegate' do |ss| ss.source_files = "sdk/Delegate/*.h" end s.subspec 'enums' do |ss| ss.source_files = "sdk/enums/*.h" end s.subspec 'Manager' do |ss| ss.source_files = "sdk/Manager/*.h" end s.subspec 'private' do |ss| ss.source_files = "sdk/private/*.h" end s.subspec 'types' do |ss| ss.source_files = "sdk/types/*.h","sdk/types/LiveChatRoomType/*.h" end s.subspec 'board' do |ss| ss.source_files = "sdk/board/*.h" end #設定元件庫是否是基於 ARC 記憶體管理的,預設為 true,如果不是,會自動新增-fno-objc-arc s.requires_arc = true #如果部分是ARC #spec.requires_arc = false #spec.requires_arc = ['Classes/*ARC.m','Classes/ARC.mm'] //指定 MRC 的⽂件 #設定依賴的其他 pod 庫 # s.dependency "JSONKit","~> 1.4" #設定xcconfig s.xcconfig = { 'OTHER_LINKER_FLAGS' => '-ObjC','ENABLE_BITCODE' => 'NO' } end 複製程式碼
- 檔名匹配
 - * 匹配所有⽂件
 - c* 匹配以名字C開頭的檔案
 - *c 匹配以名字c結尾的檔案
 - *c* 匹配所有名字包含c的檔案
 - ** 資料夾以及遞迴子資料夾
 - ? 任意⼀個字元(注意是⼀個字元) 
 - [set] 匹配多個字元,⽀持取反
 - {p,q} 匹配名字包括p 或者 q的⽂件
複製程式碼
  • 給⾃己倉庫繫結Tag,因為cocoapods是根據程式碼倉庫的Tag,去下載對應Tag的遠端程式碼庫的。
git tag 0.0.1
git push --tags
複製程式碼

3.驗證pod 庫

  • 命令:pod lib lint
  • 命令後加--verbose 列印詳細 log
  • 命令後加 --allow-warnings 當出現警告,但是不影響 pod 庫的使⽤的時候會驗證通過
  • 命令後加 --use-libraries 使⽤了⾃己的私有庫,不加可能會驗證不通過,加了就沒問題

4.推送⾃己的podspec到cocoapods的索引庫

  • 命令:pod trunk push --verbose --allow-warnings --use-libraries ,後⾯的命令作用同上
  • 注意:必須cd 進⼊到podspec⽬錄下,才能執⾏行行這個程式碼
  • 注意:podspec檔案中的s.version版本號要跟最新tag一致
  • 注意:podspec檔案中的s.source倉庫地址也不能寫錯

5.測試能否索引到

  • 命令: pod search 元件庫名稱
  • 如果搜尋不到⾃己的元件庫,但是⼜ pod trunk push 成功了,說明本地pod索引庫沒有更新
  • 更新本地 pod 索引庫
  1. rm ~/Library/Caches/CocoaPods/search_index.json 
  2. pod setup
  3. pod search name
複製程式碼

6.其他

  • 給增加其他維護者: pod trunk add-owner YuntxIMLib [email protected]
  • 移除其他維護者: pod trunk remove-owner YuntxIMLib [email protected]
  • 升級元件庫:修改元件程式碼,打 tag,push 到遠端程式碼庫,修改 podspec⽂件中的 s.version重複步驟3,4,5即可
  • 從 pod 索引庫移除元件庫開啟終端,輸⼊以下指令:
1. pod trunk delete name tag 
2. rm ~/Library/Caches/CocoaPods/search_index.json 
3. pod setup 
4. pod search name
複製程式碼

7.可能遇到的問題

pod lib lint/repo push不支援i386編譯&只能真機運⾏行行的庫

  • 終端 gem which cocoapods
  • 進⼊ /usr/local/lib/ruby/gems/2.5.0/gems/cocoapods-1.6.0.beta.1/lib
  • 在當前lib⽬目錄下有個cocoapods資料夾,找到validator.rb ⽂件
  • 因為不能直接修改 validator.rb ⽂件,所以用命令: sudo vim validator.rb⽂件路徑 ,輸⼊密碼後即可編輯,將上圖紅框中部分該成下面,這樣就能繞過 pod lib lint 檢測了
# command += %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator)
# command += Fourflusher::SimControl.new.destination(:oldest,'iOS',deployment_target)
command += %w(--help)#為了了繞過模擬器器檢測不不通過的 bug
複製程式碼

8.基於本地pod庫的元件化

上⾯講到的⽅法是將元件庫託管到公有遠端倉庫,任何人都可以下載整合元件庫。但是有時候我們公司內部的⼀些大型專案也使用了元件化⽅方式來開發,這時候我們的元件庫就不需要專⻔放到遠端倉庫來託管,照樣也可以使用CocoaPods來管理。

  • 如圖新建三個工程: MainTarget 是主工程,ComponentA,ComponentB分別是兩個不同的元件⼯程
  • 設定元件⼯程的 podspec⽂件
Pod::Spec.new do |spec|
 spec.name
spec.version
spec.summary
spec.homepage
spec.license
spec.author
spec.source
spec.source_files = "ComponentA/Class/*.{h,m}"
= "ComponentA"
= "0.0.1"
= "A short description of ComponentA." = "https://www.yuntongxun.com/"
= "MIT"
= { "author" => "[email protected]" } = { :path => 'ComponentA.podspec' }
end
複製程式碼

這裡主要是 spec.source元件路徑要指向自身,其他的配置根據實際需要可以新增

  • MainTarget 的 Podfile⽂件
target 'MainTarget' do
pod 'ComponentA',:path => '../ComponentA'
end
複製程式碼

執行 pod install 後, MainTarget 主⼯程就會將 ComponentA 元件整合進來