如何建立私有 CocoaPods 倉庫
公共 CocoaPods
開啟隱藏目錄,可以使用命令:
//開啟隱藏的命令:
defaults write com.apple.finder AppleShowAllFiles -bool true
//關閉隱藏的命令:
defaults write com.apple.finder AppleShowAllFiles -bool false
接著需要重啟一下 Finder, 可以按住 option + 右鍵 Finder 圖示選擇重啟。然後開啟隱藏目錄 .cocoapods (這個目錄在你的個人目錄底下, ~/.cocoapods
或 /Users/[username]/.cocoapods
)
p1
可以看到上圖, .cocoapods 目錄下的 repos 其實是 repository (倉庫)的縮寫。 repos 中存放的時倉庫的集合。這裡的 master 就是 CocoaPods 官方建立的倉庫,也就是我們所謂的公共庫。
specs 目錄下存放的就是所有提交到 CocoaPods 的開源庫的 podspec 檔案的集合。
其結構如下圖所示:
p2 其組成方式:
specName -- version -- specName.podspec
( master 裡現在是 specName.podspec.json,這個 .json 檔案就是 podspec 檔案加了個字尾。我們可以採用 pod
ipc spec
那這個資料夾是如何來得呢?其實,這個資料夾是在你安裝了 CocoaPods 後,第一次執行 pod
install
時, CocoaPods 通過命令 pod
setup
來建立的(這條命令會自動執行)。
上述是官方的 repo ,私有庫的話可以看下我們前面的翻譯或者檢視官方文件,但是官方文件有一些過程寫的不是特別詳細,自己實現的時候遇到了一些坑,特此梳理一下過程,按照官方文件內容實現一個私有的 spec repo 。根據官方的原理,我們只需要建立一個和 master 相類似結構的目錄就可以實現私有的 spec repo,當然你可以 fork
一個官方的 repo,但是它包含了太多沒有必要地庫在裡面,這在編譯倉庫的時候需要浪費大量的時間,所以我們只要自己重新建立一個就可以了。
1.建立一個私有的 Spec Repo
在你的 git 伺服器上建立一個 repo。這裡你可以在 github 或者你自己的 git 伺服器上實現。公司內部使用的話這裡推薦大家使用私有的倉庫,但是 github 的私有倉庫是要收費的 $7/month (壕請無視 - -!)。大部分公司都是有自己的git伺服器,不過一般只能在公司內網使用,或者可以選擇Gitlab,Coding, Bitbucket任意一種。我們以在 github 上建立為例:
p3
如圖所示,我們在 github 上建立一個空的倉庫,命名為 O2Specs ,這個倉庫是用來存放我們自己所有的私有庫的 spec 檔案,就如同官方的 https://github.com/CocoaPods/Specs 是用來存放所有官方的 specs 檔案一樣。
然後我們就可以執行:
pod repo add REPO_NAME SOURCE_URL
其中的 REPO_NAME 是我們要新增的私有 repo 的名稱(這裡我們待會填的是: O2Specs),後面是倉庫的 git 地址。這裡做的其實是建立的工作,也就是在 ~/.cocoapods/repo
目錄下添加了一個以你的私有 repo 為名的資料夾,但是並沒有新增 spec 檔案。
在終端執行命令:
pod repo add O2Specs https://github.com/marklin2012/O2Specs.git
這裡用的是 https 地址,當然你也可以用 git 地址,不過這樣有可能失敗。如果失敗,很大因素是你 github 的 ssh 在本地沒有配置好,配置方法可以看這裡:Generating SSH keys,成功後可以看得到 .cocoapods 目錄如下圖所示:
p4
至此,我們已經在本地得到我們自己的私有倉庫 O2Specs ,這是一個空的倉庫。
2.新增私有的 Repo 安裝到你的 CocoaPods 中
這個步驟需要我們事先完成 CocoaPods 依賴庫的搭建,具體可以檢視我們另外一篇教程:製作 CocoaPods 依賴庫。如果這裡你想先看看效果,也可以直接從 github 上 clone 示例工程繼續下面的操作。
讓我們進入到上面 clone 的示例工程目錄中(或者你自己搭建的依賴庫目錄中):
p5
開啟工程的 podspec 檔案:
Pod::Spec.new do |s|
s.name = "O2View" #名稱
s.version = "0.0.1" #版本號
s.summary = "Just testing" #簡短介紹
s.description = <<-DESC
私有Pods測試
* Markdown 格式
DESC
s.homepage = "http://aotu.io/"
# s.screenshots = "www.example.com/screenshots_1.gif"
s.license = "MIT" #開源協議
s.author = { "linyi31" => "[email protected]" }
s.source = { :git => "https://github.com/marklin2012/O2View.git" }
## 這裡不支援ssh的地址,只支援HTTP和HTTPS,最好使用HTTPS
## 正常情況下我們會使用穩定的tag版本來訪問,如果是在開發測試的時候,不需要釋出release版本,直接指向git地址使用
## 待測試通過完成後我們再發布指定release版本,使用如下方式
#s.source = { :git => "http://EXAMPLE/O2View.git", :tag => s.version }
s.platform = :ios, "9.0" #支援的平臺及版本,這裡我們呢用swift,直接上9.0
s.requires_arc = true #是否使用ARC
s.source_files = "O2View/*.swift" #OC可以使用類似這樣"Classes/**/*.{h,m}"
s.frameworks = 'UIKit', 'QuartzCore', 'Foundation' #所需的framework,多個用逗號隔開
s.module_name = 'O2View' #模組名稱
# s.dependency "JSONKit", "~> 1.4" #依賴關係,該專案所依賴的其他庫,如果有多個可以寫多個 s.dependency
end
這個檔案本質上是一個 ruby 檔案,這是我們事先已經實現好的依賴庫的 podspec 檔案,如果前面步驟都正常的話,也就是說我們認為這個 podspec 是合法的話,就可以直接將這些內容 push 到我們本地的 repo 中。為了避免錯誤,我們可以再驗證一下,命令列輸入:
pod lib lint
執行之後可能會得到下面的警告:
-> O2View (0.0.1)
- WARN | source: Git sources should specify a tag.
[!] O2View did not pass validation, due to 1 warning (but you can use `--allow-warnings` to ignore it) and All results apply only to public specs, but you can use `--private` to ignore them if linting the specification for a private pod..
You can use the `--no-clean` option to inspect any issue.
由於我們的示例工程還沒有生成正式的 release 版本, github 上並沒有任何 tag,所以我們剛才填寫 .podspec 檔案填寫 git 地址的時候沒有填寫指定 tag (上面檔案的註釋中有提到),解決方法我們可以先執行忽略警告的命令:
pod lib lint --allow-warnings
如果成功會出現如下輸出:
-> O2View (0.0.1)
- WARN | source: Git sources should specify a tag.
O2View passed validation.
到此,我們的 O2View.podspec 就符合規範了。
3.新增你的 Podspec 到你的 repo
在前面驗證通過的基礎上,我們接著執行命令:
pod repo push O2Specs O2View.podspec
執行完,如果失敗會有相對應的警告和錯誤提示,只要按照警告和錯誤的詳細資訊進行修改和完善即可。成功的情況應該可以在終端看到類似的輸出:
Validating spec
-> O2View (0.0.1)
- WARN | source: Git sources should specify a tag.
Updating the `O2Specs' repo
Already up-to-date.
Adding the spec to the `O2Specs' repo
- [Add] O2View (0.0.1)
Pushing the `O2Specs' repo
To https://github.com/marklin2012/O2Specs.git
9f32092..8d0ced5 master -> master
再進入到 .cocoapods 的目錄中,可以看到已經發生了變化:
p6
同時,我們還發現 O2Specs 的 github 倉庫也已經發生了變化:
p7
按照平時使用 CocoaPods 的習慣,我們新增依賴庫之前會先搜尋一下庫,讓我們執行一下命令:
pod search O2View
哈哈,可以看到已經建立成功了!
-> O2View (0.0.1)
Just testing
pod 'O2View', '~> 0.0.1'
- Homepage: http://aotu.io/
- Source: https://github.com/marklin2012/O2View.git
- Versions: 0.0.1 [O2Specs repo]
4.測試私有 pod
看到前面的搜尋結果,小夥伴們是不是開始有點激動了?讓我們建立一個普通的工程,命名為 TestPodDemo,然後在終端 cd 到其目錄路徑下,新增一個 Podfile 檔案:
pod init
建立後修改 Podfile 檔案內容如下:
use_frameworks!
target 'TestPodDemo' do
pod ‘O2View’
end
執行:
pod install
我們得到如下提示:
Updating local specs repositories
Analyzing dependencies
[!] Unable to find a specification for `O2View`
[!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes in your editor of choice.
找不到 O2View ? 額- -!。。。剛才 search 明明可以找到這個依賴庫的,為什麼現在找不到了呢?
彆著急!其實原因是你在 Podfile 中沒有指定路徑,當你執行 pod
install
的時候,CocoaPods 預設只會在 master 下搜尋,而我們的 spec 是存在我們私有的 O2Specs 目錄下的。所以解決方式很簡單,就是引入搜尋地址即可,在 Podfile 的頂部新增如下兩行程式碼:
source 'https://github.com/CocoaPods/Specs.git' #官方倉庫地址
source ‘https://github.com/marklin2012/O2Specs.git’ #私有倉庫地址
這裡必須新增兩個地址,預設情況下,你如果不新增 source ,系統會預設使用官方倉庫地址,但是當你添加了 source 之後,系統就不會自動搜尋官方地址,所以這兩句都必須新增,否則其他基於官方的依賴庫都不能使用了。
再次執行 pod install
,我們就可以看到很順利的安裝成功了:
Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Using O2View (0.0.1)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
恭喜!這樣一來我們就可以使用這個私有庫了!
釋出穩定的依賴庫版本
前面我們提到過,我們的這個例項依賴庫 O2View 沒有生成穩定的 release 版本。當我們除錯完內容之後,一般都是要釋出穩定版本的,更新之後再繼續釋出新版本。我們可以使用命令列或者在 github 頁面手動生成,這裡為了方便我們使用命令列,首先在終端中 cd 到之前的依賴庫 O2View 的目錄中,然後輸入如下命令:
git tag '0.0.1'
git push --tags
git push origin master
這樣我們就得到了一個穩定的 release 版本 0.0.1:
p8
這裡我用的版本號是 0.0.1 基於研發版本,關於版本號的一些規範可以參考:語義化版本 2.0.0
對於我們的 podspec 檔案,我們也需要將 s.source
做一下小小的改動:
s.source = { :git => "https://github.com/marklin2012/O2View.git", :tag => version }
這樣我們使用這個依賴庫的時候就能對應上版本號,並且知道在 github 中使用穩定的 release 版本程式碼。太棒了!
最後只需要再重複 push
一下我們的 Podfile 就可以!
接下來做什麼?
好了,到這裡我們已經完全掌握如何建立一個本地私有的 CocoaPods 了!我們完全可以把我們專案中得程式碼拆出來好好的封裝一些 pods, 好好使用這個黑魔法!
祝大家玩得愉快!