使用Cocoapods創建私有庫

五一之后,公司要求對代碼進行整理,同時進行代碼管理、自動化打包等標準化流程,這些東西一直是我想搞的,這次有了公司的支持,操作起來也更順利了,代碼管理、自動化打包會找時間寫一篇博客,這次主要記錄利用Cocoapods將多個項目中共用的代碼抽離出私有庫,方便其他項目的引用,也算是組件化的第一步吧。抽離出私有庫的時候,參考了很多的博客,遇到了很多的問題,主要參考了這篇博客

為什么要進行代碼抽離

很多公司不止有一個產品,當項目達到兩個及以上的時候,就需要考慮代碼的共用(理想情況下)。由于我們公司特殊情況(懶),原來做項目的時候沒有考慮這么多,由于公司新項目與原來的項目有大量功能相似,當時我們就采用了創建新分支的形式創建了新項目,導致代碼耦合性非常強,平常開發中遇到很多問題,比如:

  • 有些代碼可能這個項目需要,那個項目不需要
  • 分支切換太過頻繁
  • 創建了大量分支
  • 在這個分支上開發的時候,測試需要另一個項目的包,需要來回切換
  • 。。。。等等

先看下我們原來的代碼結構,確實感覺很頭疼:


image

綜上所述,代碼抽離迫在眉睫。。。。

1、創建私有Spec Repo

Spec Repo其實類似一個容器,里面裝著所有的公開的Pods,當使用Cocoapods后,他就會被clone到本地的~/.cocoapods/repos目錄下:

image

因此我們也需要創建一個私有的Spec Repo,因為是公司項目,所以我們搞一個私有庫,這次是我單獨的練習,GitHub上創建私有庫是收費的,所以這次我采用了免費的Git服務,我用的是Coding,首先需要在coding上創建一個自己的git倉庫,創建完成之后,在終端下執行如下命令

pod repo add ZJTestSpecs https://coding.net/u/cenzhijun/p/ZJTestSpecs/git

成功的話就會在~/.cocoapods/repos目錄下看到ZJTestSpecs文件夾了,第一步完成,這一步通常只需要執行一次

2、創建Pod項目的文件

首先cd到你想創建項目的文件夾執行如下操作

記住一定要創建一個單獨的名字,否則以后pod search <私有庫>會找到Github上跟你重名的項目

pod lib create ZJPodPrivateTest

之后會出現下列問題:

DA3D7B14F4D628E154A175EFFDE87B27

接下來就是在你的ZJPodPrivateTest文件夾下添加自己的內容,將自己的模塊部分放在ZJPodPrivateTest/Classes下,然后cdExample文件夾下執行pod update命令,之后打開項目,就能在Development Pods/ZJPodPrivateTest文件夾下看到自己添加的組件了,之后需要將項目推送到遠端倉庫,同樣需要先自己去git服務商哪里創建一個私有倉庫,然后cdZJPodPrivateTest目錄,執行如下操作:

git add -A
git commit -a -m "init library"
git remote add origin https://git.coding.net/cenzhijun/ZJPodPrivateTest.git

git push origin master

這個時候執行push操作會報如下錯誤:

C3672E624EF076875C02B836EFE87ED7

提示你需要先pull下代碼,這一步不能直接pull,需要執行如下命令:

git pull origin master --allow-unrelated-histories
D6043786E0DA1A559CA1DA5F27EB3F90

有可能會出現沖突,解決沖突之后push代碼:

git push origin master 

因為podspec文件獲取版本控制的項目需要tag號,所以還要搭上一個tag

git tag -m "first release" 0.1.0
git push --tags     #推送tag到遠端倉庫

做完這些之后開始編輯podspec文件,填上對應的信息。

編輯完之后,執行如下命令,驗證是否有效,不能有error或者warning

pod lib lint

當看到

6CECC0B42712110AA9F952FFE1C2E179

就說明驗證通過

3、本地測試podspec文件

自己可以創建一個新項目,在Podfile中指定自己編輯好的podspec文件,如下:(兩種方式填寫一種就行)

pod 'ZJPodPrivateTest', :path => '~/Desktop/ZJPodPrivateTest'      # 指定路徑
# pod 'PodTestLibrary', :podspec => '~/Desktop/ZJPodPrivateTest/ZJPodPrivateTest.podspec'  # 指定podspec文件

然后執行pod install命令安裝,然后打開項目發現庫文件已經被加載到Pods子項目中了,不過沒有在Pods目錄下,而是在Development Pods/ZJPodPrivateTest目錄下,因為是本地測試項目,沒有吧podspec文件添加到Spec Repo中的緣故

EEBF626209D091109DC43B9298F96E26



5B479CE603BFA168CD47132A8E8E5781

確認無誤后,就可以提交podspecSpec Repo中了

4、提交podspec

提交很簡單,只需要一個命令:

pod repo push ZJTestSpecs ZJPodPrivateTest.podspec  #前面是本地Repo名字 后面是podspec名字
481992FDCEF1AB9F310B905AF4D4A

沒有錯誤之后,就可以在~/.cocoapods/repos/ZJTestSpecs目錄下看到自己的私有庫了,同時我們遠程的Spec Repo也有一次提交,已經被自動push上去了

可以用pod search ZJPodPrivateTest查看自己的庫了

714E14C7AA77A9CDECE5C5334B28F057

*一定要記住自己的創建的私有庫一定不要跟Github上的第三方庫重名,否則會搜不到,我博客里面有的是ZJPodPrivateTest有的是ZJPodTest,就是因為ZJPodTestGithub上的一個第三方庫重名了,才會又重新建了ZJPodPrivateTest,按照我博客操作的時候ZJPodPrivateTestZJPodTest可以認為是同一個倉庫,有的截圖了,有的忘了,有不明白的,可以問我?。。?/p>

至此,自己的私有庫就算制作好了

5、使用制作好的Pod

Podfile文件中,內容如下:

source 'https://github.com/CocoaPods/Specs.git'  # 官方庫
source 'https://git.coding.net/cenzhijun/ZJTestSpecs.git'   # 私有庫

platform :ios, '8.0'

target 'TargetName' do
pod 'AFNetworking', '~> 3.0'    
pod 'ZJPodPrivateTest', '0.1.0'   #自己的私有庫
end

至此就算大功告成了

6、更新維護podspec

這里寫得很詳細,參考這個吧

遇到的坑

錯誤一

409FDEA31A5A4FA21B2B14E42D7D96A4

pod lib lint 驗證的時候一直報這個錯,原因是私有庫中添加了動態庫或者靜態庫,解決方案:

pod lib lint --use-libraries

--use-libraries:表示使用靜態庫或者是framework,這里主要是解決當我們依賴一些framework庫后校驗提示找不到庫的時候用到。

錯誤二

E03336C72F6E450A612C4021C7FA09E6

pod lib lint的時候一直有一些警告,可以忽略掉這些警告:

pod lib lint --allow-warnings

--allow-warnings:表示允許警告

保險起見可以使用:

pod lib lint --use-libraries --allow-warnings

錯誤三

pod lib lint驗證通過,但是repo push的時候卻一直報錯,又忘截圖了,大概是這樣的:

xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information

我之所以報這個錯,是因為,修改了自己的私有庫,打了tag,podspec文件對應的s.version忘了修改了,解決方案:

重新發一個release版的,打上tag之后,修改podspec文件對應的s.version,重新pod repo push

溫馨提示:如果你在pod lib lint的時候用到了--use-libraries或者--allow-warnings,那么在pod repo push的時候也要加上這些指令?。?!例如:

pod repo push ZJTestSpecs ZJEncryptPodTest.podspec --use-libraries --allow-warnings

總結

創建私有庫的時候,盡管我參考的這篇文章已經寫得十分詳細,但是還是有一個過時的操作,很導致操作錯誤,尤其是在本地倉庫push到遠程倉庫那里出現問題,同時創建私有庫不能和GitHub上存在的第三方庫重名也是我摸索很久發現的,希望看到這篇文章的同學能夠少走彎路????????

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容