我這篇和別人最大的區別,可能除了算是比較新的實踐,還有就是對應的語言是Swift。
為什麼需要打包私有庫?
公司專案採用分支的方式進行“效率開發”,鑑於部分專案的基礎功能一致,資料服務也保持了一致,所以在一開始這樣的方式倒也沒什麼問題。But!!!隨著專案的持續進行,各個客戶定製類的要求差異化嚴重,採用分支的弊端逐漸顯現:
- Base專案存在Bug,導致分支專案全部需要逐一修改,工作重複。(隨著專案的增加,後期維護難度指數上升)
- 功能管理不可控,Base專案中經常有部分內容在分支專案中不需要。
- Base專案通過判斷語句,將iPad和iPhone專案合二為一,存在一些專案早期不需要iPad端。(貌似後期App上架想加或想去除另一端會比較麻煩)
- 當有部分基礎功能需要升級,就如同改程式碼一樣需要處處分支進行更改。
- 雖然公司開發人員不多,流程也沒有很完善,但是當自己嘗試Jenkins做CI時,發現分支的方式對於一些配置非常不友好。
- ……
基於以上種種情況,便思考著如何改進,第一反應就是重構程式碼,重新組織架構專案。但是,當看了bang,casa,limboy等等大佬們元件化的思路之後有點懵懵的。最終,只能著手於從專案中抽出公共庫或者業務庫的思路著手,因此動手目標指向Cocoapods打包私有庫。
計劃是將一些基礎公共功能抽離出來,方便以後所有型別的專案都可以使用,我司目前除了上文提到的Base專案並沒有維護使用的庫?。當前者完成,主要也是打通打包私有庫這個流程之後,便著手抽取專案的業務功能模組作為庫來使用。存在的問題是,還不太清楚是直接把邏輯抽離出來,還是連著UI一起(應該不太好)。最終就能做到通過這些私有庫快速搭建專案,針對目前的專案也許還是需要一個Base專案進行一些基礎配置(因為會用到一個第三方庫)。
CocoaPods 打包進行時
預設打包前已經在電腦上配置好cocoaPods和Git環境,否則後續步驟在一開始就沒法進行。關於Git環境配置網上一搜很多,至於cocoaPods環境配置正好自己之前寫過一篇算是目前比較新的文件記錄。
第一步,建立本地pod倉庫
通過Pod命令可以建立一個本地倉庫,會自帶一些基礎配置,只需要把自己的程式碼放在正確的位置即可完成私有庫封裝程式碼部分的內容。
pod lib create YourPodName
複製程式碼
命令列執行完以上命令,會出現幾個選項,根據自己的情況去做選擇即可。提供自己的配置如下:
What platform do you want to use?? [ iOS / macOS ]
> iOS
What language do you want to use?? [ Swift / ObjC ]
> Swift
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
Which testing frameworks will you use? [ Quick / None ]
> None
Would you like to do view based testing? [ Yes / No ]
> No
Running pod install on your new library.
複製程式碼
目前網上能查到的資料,好多都還有一項選擇是統一配置類名字首,不過目前我這個版本已經沒有該選項。當上面執行完成之後會自動開啟Example工程示例,接下來就可以進行具體的程式碼編寫或者直接替換到對應位置。
第二步,修改Pod內容
開啟建立的Pod庫所在資料夾,在根目錄位置有著 YourNamePod.podspec
和 README.md
兩個檔案,分別開啟進行對應的修改。
YourNamePod.podspec 檔案修改
鑑於是在建立私有庫,本機的Git命令繫結的是GitHub,所以切記要修改檔案裡的git對應的地址到本地Gitd庫地址!!!
Pod::Spec.new do |s|
s.name = 'YourNamePod'
s.version = '0.0.2' // 一定記得修改version!!!一定要和Git的Tag是相同!!!
s.summary = '改成自己的summary
s.description = <<-DESC
修改為自己庫的描述內容
DESC
s.homepage = '修改為自己本地Git庫的地址' // 注意,這裡的地址是本地庫在瀏覽器上面的URL
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' } // 預設MIT許可
s.author = { '使用者名稱' => '使用者賬號' }
s.source = { :git => '修改為自己本地Git庫的地址', :tag => s.version.to_s } // 此處的地址,是從Git庫copy過來的,以 .git 結尾。
s.ios.deployment_target = '9.0'
s.source_files = 'Pod/Classes/**/*' // 原生的地址是 'YourNamePod/Classes/**/*', 但是這個地址在後面 的 pod repo push 中會出現問題,根據一個開源的庫,修改了地址。注意,Pod 資料夾仍然是在根目錄。
s.swift_version = '5.0' // 親測,需要加上swift版本
end
複製程式碼
README.md檔案修改
README檔案其實不用修改也無所謂,只是想著方便以後其他人瞭解這個庫的使用,自己寫了一些說明罷了。反正,如果有需要就看著加內容,或者看看自動生成的內容裡是否有什麼資訊時需要刪除的。
具體程式碼放哪裡
具體程式碼當然得自己實現,但是放什麼地方卻是有講究的,在上文有提過 s.source_files 對應的預設路徑需要更改。自己庫的程式碼就是要放在這個檔案路徑之下。如果按照我的步驟建立,則應該是在 Pod -> Classes 資料夾之中。
當開啟示例專案進行測試驗證時,首先需要 pod install
,然後正常開啟專案。此時在 Xcode 中左側皮膚 Pods下找到自己的 Pod 檔案,再次確認下程式碼是不是都在,不在就 add 進來。接下來就是在示例工程中去進行各種嘗試,每次對Pod檔案裡的程式碼進行了修改我都會重新 pod install
一次,然後 clean -> build。
第三步,Git部分
一開始說了需要本地有Git環境,現在就要用到了,在次之前先在本地的Git庫中新建一個倉庫(我司是用Gogs進行搭建)。注意!!!倉庫名字與建立的 Pod 庫名一致,不一致會不會有問題,我不知道,反正我沒試過。記得!!!倉庫不要設定成私有庫,設定成為私有庫在後面會出現問題,我找到的解決方案就是設定為public。
接下來,就是開啟命令列 cd 到 Pod 庫資料夾的根目錄,進行以下命令的執行:
git add . // 跟蹤所有改動過的檔案
git commit -m"提交內容"
git remote add origin <git庫url> // 具體的url時沒有 <>
git push -u origin master
git tag 0.0.1 // 需要與 .podspec 檔案中的 s.version 對應
git push --tags
複製程式碼
在這裡需要注意的是,git 命令的執行,自己習慣了客戶端,當使用命令列好像有些步驟問題。自己踩到的坑如下:
- 如果在第一次 push 之前對 Pod庫資料夾裡的內容進行了修改,貌似 push 的內容是最初沒修改前的。
- 當多次 add -> commit -> push 之後,可能會出現
git ! [rejected] master -> master (fetch first)
這樣的問題,解決方法是執行:
git pull origin master
git push origin master // 如果執行之後還是沒有即可成功,那麼執行下面的內容
git commit -m"xxx"
git push
複製程式碼
正常來說,應該就進行下一步的操作,如果在Git過程中遇到了坑,建議仔細看錯誤提示進行修改。
第四步,Pod 部分
Pod 部分的坑遇到不少,但是如果前面的步驟如果都有注意到細節,該修改的都修改了,那麼下面的命令列執行起來應該是很順暢。命令列 cd 至 Pod 庫資料夾根目錄,然後往下看⬇️:
pod repo // 檢查 pod 庫
pod repo add YourNamePod <Git-Url> // 新增到本地cocoapods中
pod lib lint // 檢測自己的 Pod 庫配置
pod repo push YourNamePod YourNamePod.podspec // push 庫配置
// 成功之後
pod search YourNamePod // 能夠搜到就可以用起來了,這裡可能有個小坑,那就是儘量在取名時取個唯一值,可以在Github上先搜一搜。私有庫可能沒啥影響,但是如果是公共的同名應該會有坑。
複製程式碼
如果上述 lib lint
出現了紅色warning提示,可以嘗試在命令後面加上 --allow warnings。 至於其他的一些相關錯誤,根據資訊提示搜一下基本都有解決方案,另外會在文末附上幾個參考連結。
在其他專案使用的時候,podfile 檔案裡需要加上 source 路徑,否則沒法使用到私有庫。
source "git-url.git" // 此處換成自己本地庫的 url
use_frameworks!
target 'TestPod' do
pod 'YourNamePod', '~> 0.0.2'
end
複製程式碼
第五步,最後就是維護!!!
到第四步成功結束,只是階段性的勝利,之所以打包私有庫除了方便使用還有就是後期維護更新!!!
後期功能更新或日常維護步驟如下:
- 修改 .podspec檔案裡的 version
- git 對應的操作:更新 push ,以及 tag 對應 version
- pod lib lint / pod lib lint allow--warnings
- pod repo push YourNamePod YourNamePod.podspec
至此,我所瞭解的一個閉環流程就結束了,希望以上內容有所幫助。
關於打包 CocoaPods 庫Tips
- 對外提供的介面需要明確的宣告 public ,否則即便能夠
import ***
也無法使用介面方法/屬性。 - 關於封裝 MLog 日誌時需要用到
#if MLOG
這樣的預處理巨集操作,但是不知道為啥在 Example 工程中做的配置(Pods 中 Targets 對應的地方做的配置)每次pod install
就自己清空了。如果有大佬清楚怎麼設定,感謝不吝指教。
精選參考文件,並感謝!
我的渣渣專欄還有點其他方面的整理,不適合大神,49年入國軍的童鞋倒是可以去瞄一下。至於訂閱,能保證的就是,我一定會更新下去?。