創建私有pod spec的流程以及坑點

參考: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版本製作私有庫。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章