學習新知識必然是一個踩坑的過程,這兩天看了下pod私有庫的創建,總體來說還是比較簡單的,但是中間踩了一個坑,也不能說是坑吧,只是自己技術不扎實,花了兩個下午才完全熟練。
私有庫的創建網上教程很多,但是對于基礎知識欠缺而且專業名詞知道的甚少的我來說還是有很大的困難的,所以記錄一下,畢竟我的記性那么不好
創建一個私有的podspec包括如下那么幾個步驟:
1.創建一個私有的Spec Repo。
2.創建Pod的所需要的項目工程文件,并且有可訪問的項目版本git地址。
3.創建并修改Pod所對應的podspec文件。
4.本地測試配置好的podspec文件是否可用。
5.提交項目和podspec配置到Git倉庫,并打標簽。
6.向私有的Spec Repo中提交podspec。
7.在個人項目中的Podfile中增加剛剛制作的好的Pod并使用。
8.更新維護podspec。
整體流程就是這8個步驟,其中前7個步驟是開始,第8個步驟是使用更新,畢竟我們的庫也不是寫好后就不會更改的
1創建一個私有的Spec Repo
這里叫做創建一個私有的
倉庫源
或者倉庫列表
,或者直接叫做倉庫
,或者是叫索引
。
Spec Repo
是Pods
的倉庫列表,我們pod install
或者pod update
的時候會從倉庫列表中查找當前最新的版本,然后進行下載更新。如果我們要做私有庫,就不能放在官方的倉庫列表中,所以要創建一個私有的倉庫列表,來存放我們私有庫的列表。
如果你使用過pod,本地會有一個倉庫列表,每次pod install
或者pod update
會對倉庫列表進行更新。在~/.cocoapods/repos
目錄下,master就是官方的倉庫列表,里面的都是開源的,我們通過pod search XXX
命令就可以搜索到這些開源庫
比如pod search 1210
,可能是某個同學寫的私有庫的測試小demo,這里建議大家不要隨便往共用倉庫列表里面添加無用的開源庫,這個倉庫列表可是分發到全世界的!
進入正題,創建一個私有Spec Repo
,私有倉庫列表就是一個普通的空的git倉庫(后面會添加內容的),在你們的git服務器上面創建一個新的倉庫就行,不需要里面有任何文件,然后你可以拿到你的git倉庫的一個地址,比如我coding網站上面創建一個名字為DDSpecs
的倉庫,git地址是:https://coding.net/Yasin/DDSpecs.git
(你是訪問不通的),然后在終端下執行命令,將新創建的私有倉庫添加到本地Pods
里面,這樣就相當于使用pod的時候多了一個倉庫列表,多了一個數據源。
$ pod repo add DDSpecs https://coding.net/Yasin/DDSpecs.git
這個命令可能會進行一些賬號的驗證,成功后就像上圖1里面一樣會多一個pod倉庫列表。現在可以看到DDSpecs文件夾下面是空的,這是正常的,因為是一個全新的倉庫列表。添加公司已有的倉庫列表也是這個命令,但是里面可能會有私有庫列表。
2創建Pod的所需要的項目工程文件,并且有可訪問的項目版本git地址
這個步驟的目的:創建我們的模塊項目(一般是一個可運行的demo,個別比較特殊的只有模塊的文件),把模塊的文件按照真實文件夾放好,并且上傳到git服務器,得到git地址。(附帶可以在這一步創建后面所需要的
podspec
文件和license
文件)
這里我們也需要模塊項目的git地址,這個地址是下載代碼用的,可能你的模塊已經創建好了git,也可能沒有,這都不重要,重要的是要有一個代碼的git地址。
這里提供三個方法,自己選擇喜歡合適的就行了:
- 使用命令創建一個新的項目工程
找到一個存放項目的文件夾,輸入下面的命令
$ pod lib create UserModelDemo
這里會創建一個名為UserModelDemo的項目,里面包含了我們下面要用到的
podspec
文件和license
文件,可以對項目進行修改,變成我們想要的樣子。
- 使用命令接入已有的模塊項目
找到一個存放項目的文件夾,輸入下面的命令
$ pod spec create PodTestLibrary git@coding.net:Yasin/UserModelDemo.git
這個命令我沒有試過,留個坑給大家吧。應該也會創建podspec
文件和license
文件
- 正常手動創建一個項目
就是平常我們創建項目的流程,創建一個普通的項目,或者說是已有的,然后修改成我們需要的樣子。
這三種方法都可以,關鍵是要有git地址,請再次確認我們這一步驟的目的達到了。真實文件夾存放
、git地址
。
3創建并修改Pod所對應的podspec文件
上面第二步可能已經創建好了
podspec
文件和license
文件,也可能沒有,這一步重點介紹一下這兩個文件。
podspec
文件是pods私有庫的描述文件,是Ruby格式的,里面包含了下載地址,私有庫的版本等信息。沒有的可以創建一個,比如“DDUserModel.podspec”
Pod::Spec.new do |s|
s.name = "DDUserModel" #私有庫名稱
s.version = "1.0.0" #版本號
s.summary = "Just Testing." #簡短介紹,下面是詳細介紹
s.description = <<-DESC
Testing Private Podspec.
* Markdown format.
* Don't worry about the indent, we strip it!
DESC
s.homepage = "https://coding.net/Yasin/UserModelDemo"
#主頁,這里要填寫可以訪問到的地址,不然驗證不通過
# s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" #截圖
s.license = { :type => 'MIT', :file => 'LICENSE' } #開源協議
s.author = { 'Yasin' => 'yasinzhou@foxmail.com' } #作者信息
s.source = { :git => "https://coding.net/Yasin/UserModelDemo.git", :tag => s.version.to_s }
#項目地址,這里不支持ssh的地址,驗證不通過,只支持HTTP和HTTPS,最好使用HTTPS
# s.social_media_url = 'https://twitter.com/<twitter_username>' #多媒體介紹地址
s.platform = :ios, '7.0' #支持的平臺及版本
s.requires_arc = true #是否使用ARC,如果指定具體文件,則具體的問題使用ARC
s.source_files = 'Pod/Classes/**/*'
#代碼源文件地址,**/*表示Classes目錄及其子目錄下所有文件,
#如果有多個目錄下則用逗號分開,如果需要在項目中分組顯示,這里也要做相應的設置
s.resource_bundles = {
'PodTestLibrary' => ['Pod/Assets/*.png']
} #資源文件地址
s.public_header_files = 'Pod/Classes/**/*.h' #公開頭文件地址
s.frameworks = 'UIKit' #所需的framework,多個用逗號隔開
s.dependency 'AFNetworking', '~> 2.3'
#依賴關系,該項目所依賴的其他庫,如果有多個需要填寫多個s.dependency
end
這個文件基本上就這些內容,可以下載幾個開源庫(不是pod安裝,而是直接去下載帶有demo的項目庫)對照參考一下,加深理解。我也是看了好幾個開源庫的才看懂的。
license
文件就是上面描述文件里面提到的開源協議,是一個文本文件,直接拷貝一份,修改一下里面的年份和作者信息就行了,命名為“LICENSE”,沒有后綴
Copyright (c) 2016 Yasin <yasinzhou@foxmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
4本地測試配置好的podspec文件是否可用
測試一下
podspec
文件是否書寫正確
這一步只是簡單的測試一下是否有格式錯誤,使用命令
$ pod lib lint
如果有錯誤根據提示修改就好了,一般來說問題不大
5提交項目和podspec配置到Git倉庫,并打標簽
將沒有錯誤的項目上傳到git,和podspec
文件和license
文件一起上傳。
上面的podspec
文件中提到一個版本號,這個是git倉庫標簽,打標簽的方法就不說了,不會的查一下吧,這里需要注意的是打標簽需要推送到遠端
這個版本號和xcode中的那個版本沒有聯系的,不過一般為了查看方便,會修改為一致。
其他的也沒有什么了
6向私有的Spec Repo中提交podspec
完成這一步就可以使用
pod install
命令進行安裝了
只有將podspec
文件提交到倉庫列表后才能像平常一樣使用pods安裝管理,不過因為是私有的倉庫列表,換臺機器要重新添加倉庫列表
$ pod repo push DDSpecs DDUserModel.podspec #前面是本地Repo名字 后面是podspec文件
這一步可能也會報錯,比如你的項目地址不能訪問啦、沒有開源協議啦、git遠程倉庫沒有打標簽啦...等等,如果報錯根據提示修改,修改之后從步驟5重新走一下,要修改版本號和重新打標簽,或者你可以把原來的標簽刪了,再加在最新的節點上,但是一般不建議這樣做。
這個地方感覺挺麻煩的,不知道是不是我理解的有問題,有理解更好的可以交流一下,大家都是一起學習的嘛??
7在個人項目中的Podfile中增加剛剛制作的好的Pod并使用
完成后可以新建一個工程,就像使用普通pod庫一樣試驗一下
這里再說一個坑:swift的類和成員變量在pod里面都是私有的??,所以在定義可以給外面引用的類和成員變量的時候要加上public屬性,不然你會看到文件pod下來了,但是引用類和成員變量的時候會提示找不到。我艸了,當時在這個地方卡了一個下午,各種配置都是對的,就是引用不了,試了各種方法,后來才發現是權限的問題??,只能說自己好傻,基礎知識太欠啊
8更新維護podspec
私有庫也是會更新的,基本上都是把更新后的內容push到遠端git服務器,然后重走5和6的步驟,重新打標簽,重新推送到pod倉庫列表,然后在項目里面pod install
或者pod update
總結
首先有幾個疑問:
1.模塊化如果使用pods私有庫的話,那每次修改豈不是都要更新維護podspec?特別是在改BUG的時候,那種是不是太痛苦?
2.感覺模塊化pods私有庫更適合大一點的團隊使用,每個人負責一個私有庫的維護,如果是一兩個人,每個模塊一個pods私有庫,那是不是太痛苦?
另外說一下如果pod私有庫有依賴關系的話,上傳git服務器的時候可以對依賴庫進行忽略。
如果是使用SourceTree可以在設置-高級里面添加忽略路徑,比如/Example/Pods
,更多更高級的用法可以更深入的學習哈