參考:http://www.cocoachina.com/ios/20150228/11206.html
一、創建私有Spec Repo
創建一個git倉庫,完成後輸入命令:pod repo add CMSpecs http://gitlab.365eche.com/Frame/CMSpecs.git, 成功後可以進入~/.cocoapods/repos目錄查看,第一步完成。其他合作人員共同使用這個Spec Repo的話在有權限的前提下執行相同的命令來添加這個Repo就行了
二、創建pod項目
在要創建項目的目錄下執行:pod lib create podTestlibrary(podTestlibrary是項目名字)。之後會有5個問題,1.用什麼語言OC或者Swift。2.是否需要一個例子工程;3.選擇一個測試框架;4.是否基於View測試;5.類的前綴,直接點回車就是選擇默認值,完了後會自動執行pod install創建項目並生成依賴。
(坑點)有時候pod lib create生成的項目沒有生成安裝了cocopods的workspace,報錯是pod file裏邊的錯誤,沒錯誤的時候pod file裏的樣子是這樣的
target 'JKAlertDialog_Example', :exclusive => true do
pod 'JKAlertDialog', :path => '../'
end
target 'JKAlertDialog_Tests', :exclusive => true do
pod 'JKAlertDialog', :path => '../'
pod 'Specta'
pod 'Expecta'
pod 'FBSnapshotTestCase'
pod 'Expecta+Snapshots'
end
如果報pod file錯誤的話就把pod file修改成上面這種結構的,然後intall pod就行了。
然後添加庫文件和資源,並配置podspec。把代碼文件放進pod/Classes文件夾中,把資源文件放進pod/Assert文件夾中(不需要放到一個bundle中再添加進來,pod會幫你放進bundle中),然後需要配置一下podspec文件,
Pod::Spec.new do |s|
s.name = "PodTestLibrary" #名稱
s.version = "0.1.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/u/wtlucky/p/podTestLibrary" #主頁,這裏要填寫可以訪問到的地址,不然驗證不通過
# s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" #截圖
s.license = 'MIT' #開源協議
s.author = { "wtlucky" => "[email protected]" } #作者信息
s.source = { :git => "https://coding.net/wtlucky/podTestLibrary.git", :tag => "0.1.0" } #項目地址,這裏不支持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</twitter_username>
上面命令自動生成的podspec中resource_bundles這一項是註釋掉的,所以放入Assert中的文件讀取不到,還有就是一定要注意標點符號。
資源文件也可以用s.resources = '目錄' #資源文件會編譯到mainbundle,獲取文件方式跟正常情況一樣,cocopods希望用resource_bundle的方式,這樣不會被讀取到mainbundle,讀取時會麻煩點,可參考http://blog.xianqu.org/2015/08/pod-resources/,但是一定注意他是先拿到一個bundle,然後又拿到這個bundle的path,然後通過這個path又生成一個bundle,經過很多嘗試,只有這種辦法可以正常讀取。
然後進入Example文件中執行pod update,打開項目可以看到已經添加進Development Pods/PodTestLibrary,然後可以可以編輯demo測試一下組件,注意:每次添加新的文件或者更新podspec都要重新執行以下pod update命令,測試無誤後就推送到遠端倉庫(在PodTestLibrary文件夾下)
$ git add .
$ git commit -s -m "Initial Commit of Library"
$ git remote add origin [email protected]:wtlucky/podTestLibrary.git #添加遠端倉庫
$ git push origin master #提交到遠端倉庫
然後打上一個tag,跟podspec裏設置的一樣(注意)
git tag -m “0.1.0”
git push —-tags
三、驗證一下pod spec
pod lib lint
本地測試pod spec文件
創建一個新的項目,在podfile文件中
pod 'PodTestLibrary', :path => '~/code/Cocoapods/podTest/PodTestLibrary' #指定路徑
然後pod install,打開項目工程,可以看到庫文件都被加載到Pods子項目中了,不過它們並沒有在Pods目錄下,而是跟測試項目一樣存在於Development Pods/PodTestLibrary中,這是因爲我們是在本地測試,而沒有把podspec文件添加到Spec Repo中的緣故。
四、podspec提交到spec repo
把podspec中的無用註釋刪除掉,然後用一個命令提交podspec
pod repo push CMSpecs PodTestLibrary.podspec #前面是本地Repo名字 後面是pod spec名字
然後可以進入到~/.cocoapods/repos/CMSpecs中查看,spec repo遠端倉庫也有了一次提交
然後可以用pod search命令查看。
六、更新維護pod spec
添加/修改文件,修改podspec,pod update,然後push 到 遠端,打tag,然後驗證podspec,然後和第四步一樣
七、subspace
給libriary建立子分支,在classes內建立不同的子分支的目錄,並配置podspec文件配置不同的subspec,其他同上。
s.subspec 'NetWorkEngine' do |networkEngine|
networkEngine.source_files = 'Pod/Classes/NetworkEngine/**/*'
networkEngine.public_header_files = 'Pod/Classes/NetworkEngine/**/*.h'
networkEngine.dependency 'AFNetworking', '~> 2.3'
end
s.subspec 'DataModel' do |dataModel|
dataModel.source_files = 'Pod/Classes/DataModel/**/*'
dataModel.public_header_files = 'Pod/Classes/DataModel/**/*.h'
end
s.subspec 'CommonTools' do |commonTools|
commonTools.source_files = 'Pod/Classes/CommonTools/**/*'
commonTools.public_header_files = 'Pod/Classes/CommonTools/**/*.h'
commonTools.dependency 'OpenUDID', '~> 1.0.0'
end
s.subspec 'UIKitAddition' do |ui|
ui.source_files = 'Pod/Classes/UIKitAddition/**/*'
ui.public_header_files = 'Pod/Classes/UIKitAddition/**/*.h'
ui.resource = "Pod/Assets/MLSUIKitResource.bundle"
ui.dependency 'PodTestLibrary/CommonTools'
end
(坑點)關於私有pod庫依賴私有pod庫,這個需要在驗證
pod lib lint --sources=https://github.com/CocoaPods/Specs.git,http://gitlab.365eche.com/Frame/CMSpecs.git
(如果同時依賴私有庫和cocopods的master庫,或者多個私有庫,可以有多個鏈接,中間用逗號分隔),向私有庫中提交也需要
pod repo push CMSpecs --sources=https://github.com/CocoaPods/Specs.git,http://gitlab.365eche.com/Frame/CMSpecs.git
最後一個問題點:cocopods0.3.9版本按上面步驟在製作私有庫依賴私有庫時候是沒有問題的,但是目前cocopods1.0.0版本在pod lib lint 時不能通過驗證,經過大量查閱,這應該是cocopods支持的問題,有待解決,所以在這種情況下可以退回到0.3.9版本製作私有庫。