元件化開發之私有庫製作以及常見問題

文藝範兒的小貓咪發表於2019-03-04

前言:這篇文章主要描述私有庫的製作過程以及本人在使用過程中的一些問題和解決方案,提到元件化就不得不想到pods私有庫相關的東西(當然元件化不侷限於結合私有庫使用,還可以做成靜態庫或者多target開發等方式,這裡只講解私有庫相關的東西,稍後會出一篇元件化結合私有庫實現元件化開發的方式)

私有庫,顧名思義就是不想暴露給公共知曉的庫,也可以說僅供公司或者個人使用的庫,我們常用的第三方庫管理方式是cocoapods,所有的第三方都有一個存放索引的源地址,也可以理解為公有庫地址 https://github.com/CocoaPods/Specs 在終端輸入 pod repo就能看到裡面有個master,這個就是我們在安裝cocoapods的時候,在本地建立的索引庫,預設的第三方庫檔案都會從本地索引庫先查詢,如果本地索引庫沒有,就會從源地址中獲取,這也是為何我們首次pod install第三方的時候慢,執行pod update或者 pod update xxx --no-repo-update的時候也會慢的原因。好了,廢話不多說,下面開始進入正題(為了方便複製和檢視,我會配上操作圖以及對應的命令)

一:準備工作

1. 檢視本地是否有了私有庫索引檔案

pod repo
終端操作:pod repo,會看到有個索引列表如下:

本地有的索引庫
如果本地沒有就只有master一個,我這裡已經有了一個私有的,那麼如何建立呢?請看下面:

2. 建立遠端私有庫索引(這裡以在github上為例)

新建倉庫

由於github私有庫收費,我這裡以public為例,實則是一樣的。 一般命名為xxxSpec

遠端建立私有庫檔案

點選create repository即可建立倉庫成功 這裡我們可以得到一個遠端索引庫的地址,下面要用

索引庫地址

3. 新增本地私有庫索引

新增本地索引庫

終端執行命令 : pod repo add 本地索引庫名稱 遠端索引庫地址,後面的地址就是遠端索引庫地址,LWPrivateSpec即為本地索引庫的名稱,這個可以自定義,一般和遠端庫名稱保持一致即可

檢視新增是否成功

執行 pod repo後檢視,本地私有索引庫檔案已經好了,到這裡關於索引庫的建立就完成了,下面開始進入私有庫建立的環節

二:私有庫建立

1. 建立遠端倉庫

方法和索引庫建立一樣,這裡不在贅述

2. 將遠端庫拉取到本地

clone倉庫

選擇一個路徑,將遠端庫clone到本地 git clone 遠端庫地址

為了測試需要,需要建立測試工程,方便對元件功能的測試

3. 建立工程

建立工程

4. 引入pod

進入工程目錄,執行如下命令,建立空的pod檔案 pod init

pod install

5. 建立podspec檔案

進入本地倉庫路徑,執行如下命令

建立podspec

pod spec create 庫名稱這裡庫名稱最好和倉庫名稱一致,也可以隨便起,也就是日後pod 'xx庫'這裡要填寫的名稱

另外在.podspec同等路徑下,建立Pod/Classess檔案,最後的結構如下:

pod檔案結構

之後的功能模組就放在classes檔案下

三:podspec的編寫及其相關依賴設定

1. podspec檔案的編寫

開啟.podspec檔案如下(擷取部分):

podspec初始內容

這裡主要注意一下幾個點:

  • s.name: 庫的名稱
  • s.version:版本號
  • s.summary:摘要
  • s.description:描述部分,要比摘要長
  • s.homepage:源地址,也就是私有庫對應的遠端地址
  • s.license:執照,一般選擇預設
  • s.author:作者名稱
  • s.platform:支援平臺
  • s.source:來源
  • s.source_files:檔案路徑
  • s.framework/s.frameworks:依賴的系統的framework
  • s.dependency:依賴的庫

修改後的podspec

這樣提交後,引用時會發現,所有的.h,.m檔案都在Classes檔案下,我們看到有的第三方檔案管理會出現分層

第三方分層

像這樣有幾個子庫,比如我們想要用WXPay,那麼在podfile中只需要引入pod 'YGFunctionComponent/WXPay'即可,那麼這種是如何設定的呢?下面講述:

2. 分層檔案的編寫

檔案分層

這裡有三個子庫,每個子庫中都可以只編寫自己的功能,當然子庫之間也可以依賴,這個後面再講

分層編寫的podspec

子庫建立主要依賴於subpec 要注意的是 do 和 end 要成對出現,不然驗證的時候會報錯 也許你已經注意到,子庫中也可以設定各自的依賴,還有一點要注意,父庫的source_files設定要麼去掉,要麼就變化,不能再是Pod/Classess/**/*.{h,m}的格式,否則分層是沒用的,比如我們想要在父庫中有一個標頭檔案xxx.h,需要這樣設定:Pod/Classes/xxx.h

標頭檔案引入

匯入後的結構如下:

分層目錄

3. 子庫間的依賴

比如:我在LWFunctionComponent中有一個Utils的子庫,在LocationTool中用到了Utils這個子庫,那麼該如何設定呢?

子庫之間的依賴

xx.dependency "庫名稱/子庫名稱"

4. 私有庫之間的依賴

和依賴第三方庫一樣 s.dependency "私有庫名稱

5. 驗證過程

首先是要提交到遠端並打tag值 git add .

git commit -m "xxx"

git push

git tag xxx這裡的tag要和podspec中的保持一致,否則會報錯

git push --tags

5.1 本地驗證 pod lib lint

5.2 遠端驗證 pod spec lint

6. 新增到私有庫索引

pod repo push 本地私有索引檔名 庫名稱.podspec

當然如果只是上面的寫法你會發現會遇到很多問題,在第三點中我會列出一些常見的問題以及解決方案

三:驗證過程的問題及其解決方案

  1. tag值導致的問題,這裡再次強調,一定要注意git所打的tag值一定要和podspec中的保持一致
  2. 警告導致的問題,提交的時候你會發現很多-WARN開頭的,如果你按照的是pod spec lint或者pod lib lint,那麼一定會報錯,這個時候只需要加上--allow-warnings即可解決
  3. 依賴第三方庫導致的報錯問題,只需加上--use-libraries即可解決
  4. 私有庫依賴私有庫找不到的報錯問題,一般情況下會預設從master或者官方的spec源地址https://github.com/CocoaPods/Specs中去查詢依賴庫檔案,而私有庫是查詢不到的,所以解決方法如下: --source=私有庫源地址,官方庫源地址即可

注意:上面的2,3兩點錯誤在新增私有索引的時候,也要加上--use-libraries --allow-warnings這樣的標識,否則也會報錯哦

結束語:寫了兩個多小時,最後的問題以及解決方案模組實在不想再截圖了,如果有需要後續會慢慢補上,敬請諒解 如果有其他問題,可以留言或評論區討論

此外如果提交公共倉庫開源出來,當然需要註冊一個trunk嘍,註冊方式如下:

1.pod trunk register 郵箱 '作者名稱’ --verbose
這裡的作者名和podspec中設定的s.author保持一致 2.去郵箱驗證即可

相關文章