Cocoapods: 私有倉庫
在我之前的部落格中分享了幾篇關於 Cocoapods 的文章(文末有連結),今天分享另外一個主題即如何建立你自己的私有倉庫以及如何使用私有倉庫。
為什麼會有這種需求呢?
開發組內或者公司內,不希望把一些核心的公用程式碼給到外界使用(不開源),但是這些程式碼基本很穩定很成熟,可以做成元件給到其他人或者組內使用。
那麼,就可以使用 Cocoapods 來建立自己的私有倉庫,讓大家共享程式碼,也是元件化的一種方案。
下面的分享全是基於實踐所得,中間也遇到很多坑,都被我一一解決了,希望能幫到正在閱讀文章的你。
建立倉庫
這裡的建立倉庫,包括兩個倉庫,一個是程式碼倉庫,另一個是 pod 源的倉庫。
建立名為 iOS_private_lib
的 repository,這個主要用來存放我們的程式碼。
同樣道理,建立一個 Repo 用於存放私有的 SpecRepo 源,我建立的是 https://github.com/veryitman/private_spec_repo.git
這個倉庫。
為了說明問題,這裡我使用了 Public
來模擬 Private
倉庫。在實際開發中,一般都是使用公司自己搭建的私有 git 伺服器來做,我這裡主要是為了說明問題。
建立程式碼工程
1. 先 clone 剛才建立的 repo 到本地
cd ~/workspace/ git clone https://github.com/veryitman/iOS_private_lib
2. 建立工程
在 ~/workspace/iOS_private_lib
下使用 pod lib create
建立工程,工程名字為 CoreHTTP
,執行命令如下:
cd ~/workspace/iOS_private_lib pod lib create CoreHTTP
根據提示輸入對應的資訊即可完成建立,如圖:

建立成功後,包含一個 Example 例子工程,工程目錄如下:

使用 Xcode 開啟例子工程,在 CoreHTTP/Classes
中建立檔案即可,如下圖所示:

3. 編輯 podspec 檔案
Pod::Spec.new do |s| s.name= 'CoreHTTP' s.version= '0.1.0' s.summary= 'CoreHTTP for create private pod, it is a demo only.' s.description= <<-DESC The project of CoreHTTP is a private pod, it is a demo only. DESC s.homepage= 'https://github.com/veryitman/iOS_private_lib.git' s.license= { :type => 'MIT', :file => 'LICENSE' } s.author= { '[email protected]' => '[email protected]' } s.platform= :ios, "7.0" s.source= { :git => 'https://github.com/veryitman/iOS_private_lib.git', :tag => s.version.to_s } s.ios.deployment_target = '8.0' s.source_files = 'CoreHTTP/Classes/**/*' s.requires_arc = true end
這裡需要注意,如果 s.source_files
寫的不對,會報下面的錯誤。
- ERROR | [iOS] file patterns: The `source_files` pattern did not match any file.
CoreHTTP
的名字必須是你程式碼存放的資料夾名,而且這個檔案件要與 podspec
檔案在同一級檔案目錄下,從上面截圖的目錄結構可以看出。這裡我折騰了蠻久,最後思考和參考了自己之前的開源專案管理部落格,才解決這個問題。
4. 檢查和驗證本地 podspec 檔案
cd CoreHTTP pod lib lint CoreHTTP.podspec
驗證通過會顯示如下圖所示的成功提示

使用 Xcode 開啟工程,刪除對應以 Test開頭
的相關的庫和資料夾,確保 Xcode 能編譯通過,選擇模擬器即可。
這裡一定要先清空 cocoapods 的快取,否則後面遠端驗證還是報錯,無法通過驗證。
清空 cocoapods 的快取,命令如下:
rm ~/Library/Caches/CocoaPods/Pods/External/CoreHTTP rm ~/Library/Caches/CocoaPods/Pods/Specs/External/CoreHTTP
5. 上傳工程到 Github 遠端程式碼倉庫
cd ~/workspace/iOS_private_lib git add CoreHTTP/ git commit -m "Add lib." git push
6. 給版本新增 tag
cd ~/workspace/iOS_private_lib git tag 0.1.0 -m "Add lib and example project." git push --tags
7. 進行遠端驗證
cd ~/workspace/iOS_private_lib pod spec lint CoreHTTP/CoreHTTP.podspec --verbose --use-libraries
注意: --verbose
選項是為了看編譯和驗證資訊, --use-libraries
是為了能支援 i386 架構,如果不加此引數,私有庫無法通過驗證。
驗證成功的示意圖:

提交私有 podspec
1. 向本地的 cocoapods 倉庫新增私有 Spec Repo
cd ~/workspace/iOS_private_lib pod repo add PrivateSpec https://github.com/veryitman/private_spec_repo.git
這裡一定要注意:對應的地址是 SpecRepo 倉庫地址而不是程式碼倉庫地址。
本地存放 spec 的私有倉庫名稱,我這裡取名為 PrivateSpec
,你也可以取其他名字,但是記住在下面的步驟中要保持一致。
ls -alt ~/.cocoapods/repos/
可以看到已經成功新增本地 repo 中,其他 master 是 cocoapods 官方公開的源,其他為私有源。如下圖所示:

2. 向私有的 Spec Repo 中提交 podspec
下面的 PrivateSpec
是與上面的名稱對應的。
cd ~/workspace/iOS_private_lib pod repo push PrivateSpec ./CoreHTTP/CoreHTTP.podspec --verbose --use-libraries
這裡要注意,新增私有庫和之前博文 Cocoapods 管理開源專案 中提到的 pod trunk push
是不一樣的操作。
使用私有庫
1. 搜尋庫
pod search CoreHTTP
如果搜尋不到,可以執行下面的兩條命令:
rm ~/Library/Caches/CocoaPods/search_index.json pod setup
然後繼續搜尋就可以了,搜尋成功會顯示如下內容:
CoreHTTP (0.1.0) CoreHTTP for create private pod, it is a demo only. pod 'CoreHTTP', '~> 0.1.0' - Homepage: https://github.com/veryitman/iOS_private_lib.git - Source:https://github.com/veryitman/iOS_private_lib.git - Versions: 0.1.0 [PrivateSpec repo]
為了避免和其他私有庫命名衝突,建議在自己的私有庫前面加上公司或者其他標示,如 TepdCoreHTTP、FphCoreHTTP 等。
2. 在 Podfile 檔案的頂部新增 source
source 'https://github.com/veryitman/private_spec_repo.git' source 'https://github.com/CocoaPods/Specs.git'
注意一個是我們私有 SpecRepo 地址(非私有程式碼庫地址),另一個是官方公有源地址。
使用私有庫的工程的 Podfile 寫法示例如下:
source 'https://github.com/veryitman/private_spec_repo.git' source 'https://github.com/CocoaPods/Specs.git' platform :ios, '7.0' target 'TestCoreHTTP' do pod 'CoreHTTP', '~> 0.1.0' end
在工程中可以直接使用私有庫了,示例程式碼如下:
#import "ViewController.h" #import <CoreHTTPHeader.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *lib_desc = [CoreHTTPHeader libDesc]; NSLog(@"The HTTP's library desc: %@", lib_desc); } @end
pod 命令
//將工程新增到本地 repo 中 pod repo add [本地私有倉庫名] [遠端倉庫地址] //移除本地 repo pod repo remove [本地私有倉庫名] //檢視本地 repo pod repo
//只從本地驗證你的pod能否通過驗證 pod lib lint *.podspec //從本地和遠端驗證你的pod能否通過驗證 pod spec lint *.podspec