本文是投稿文章,作者:huluobobo
在開發過程中,經常會使用到第三框架,我們通過一個pod install命令,很方便的就將第三方框架加到我們自己的項目中。
如果我們也想將自己寫的組件或庫開源出去,讓別人也可以通過pod install命令安裝自己的框架該怎麼做呢?下面,我就教大家一步一步的將自己的pods發布到CocoaPods 中。如果你現在對CocoaPods還不太了解,推薦你看一看這篇文章:用CocoaPods做iOS程序的依賴管理
創建自己項目的Podspec描述文件
下面我會通過一個名為HUPhotoBrowser的項目來講解一下整個過程。
項目發布到github後,需要打上tag。之後我們在工程根目錄中初始化一個Podspec文件:
pod spec create HUPhotoBrowser
該命令將在本目錄產生一個名為HUPhotoBrowser.podspec文件。用編輯器打開該文件,裡面已經有非常豐富的說明文檔。下面介紹如何聲明第三方庫的代碼目錄和資源目錄,還有該第三方庫所依賴ios核心框架和第三方庫。這是我的podspec文件:
Pod::Spec.new do |s| s.name = "HUPhotoBrowser" s.version = "0.0.2" s.summary = "photo browser for ios." s.homepage = "https://github.com/hujewelz/HUPhotoBrowser" s.license = "MIT" s.author = { "Jewelz Hu" => "[email protected]" } s.platform = :ios, "7.0" s.source = { :git => "https://github.com/hujewelz/HUPhotoBrowser.git", :tag => "0.0.2" } s.source_files = "HUPhotoBrowser", "HUPhotoBrowser/**/*.{h,m}" s.framework = "UIKit" # s.frameworks = "SomeFramework", "AnotherFramework"
s.name是我們庫的名稱,s.version是庫原代碼版本號,s.summary是對我們庫的一個簡單的介紹,s.homepage聲明庫的主頁,s.license是所采用的授權版本,s.author是庫的作者。s.platform是我們庫所支持的軟件平台,這在我們最後提交進行編譯 時有用。s.source聲明原代碼的地址。我這裡是托管在github上,所以這裡將地址copy過來就行了。
對於很多第三方庫而言,在發布的時候都會打上一個tag,如版本0.0.1就會打上一個名為0.0.1的tag,你也可以選擇一個最新的commit來作為該庫0.0.1版的代碼, 那麼最終source就是這樣了:
{:git => "https://github.com/hujewelz/HUPhotoBrowser.git", :commit => '65584b0e0b08e01f83e66d487180c164b5182409'}
我這裡還是使用的tag,所以我這裡就是這樣的:
{ :git => "https://github.com/hujewelz/HUPhotoBrowser.git", :tag => "0.0.2" }
以後我們的庫有新版本時,我們可以修改相應的version和source。
s.source_files聲明了我們庫的源代碼的位置,所以這個地方不能填錯了。
先看一下我的目錄結構:
所以工程根目錄下的HUPhotoBrowse文件夾才是庫的原代碼目錄。
s.source_files = "HUPhotoBrowser", "HUPhotoBrowser/**/*.{h,m}"
目錄的層級關系一定要跟代碼庫的保持一致。這裡前一部分可以不用的,因為我這裡後一部分的HUPhotoBrowser/**與前面是一致的,這個指定的目錄下的文件都會進行編譯。如果該目錄下還有一些資源文件(如圖片等),這些文件並不需要進行編譯。可以使用s.resourcs聲明。*.{h,m}是一個類似正則表達式的字符串,表示匹配所有以.h和.m為擴展名的文件。
s.framework聲明了所依賴的核心庫,我這裡只用到了UIKit,所以是這樣的:
s.framework = "UIKit"
如果你的項目中依賴多個庫,可以使用
s.frameworks = "SomeFramework", "AnotherFramework"
當然,我們開發的庫中也可能還依賴第三方庫,例如JSONKit,那麼,就可以做如下聲明:
s.dependency "JSONKit", "~> 1.4"
如果有多個需要填寫多個s.dependency。
編輯完podspec文件後,需要驗證一下這個文件是否可用,如果有任何WARNING或者ERROR都是不可以的,它就不能被添加到Spec Repo中,不過xcode的WARNING是可以存在的,驗證需要執行命令:
pod spec lint PodName.podspec
當看到HUPhotoBrowser passed validation.時,說明驗證通過了。
編輯好podspec文件後就可以將該podspec文件保存到本機的~/.cocoapods/repos/master/Specs目錄中僅供自己使用,也可以將其提交到CocoaPods/Specs代碼庫中。下面我們先將其保存到本機中:
下面可以看一下是否可以通過搜索找到該庫:
同樣在需要依賴於HUPhotoBrowser這個庫的項目,可以將下列添加到項目的Podfile文件中
pod 'HUPhotoBrowser', '~0.0.2'
保存文件,並用pod install安裝HUPhotoBrowser庫。
通過以上步驟創建Pod庫還只能供自己使用,下面會繼續講解如何將其提交到CocoaPods/Specs代碼庫中,讓其他人也可以通過pod install安裝我們的開源庫。
CocoaPods Trunk發布自己的Pods
在cocoapods使用了trunk之後,CocoaPods 需要0.33以上版本,用 pod --version查看版本,如果版本低,需要更新。
注冊Trunk
$ pod trunk register [email protected] 'Orta Therox' --description='macbook air'
大家在注冊時需要替換成自己的郵箱和用戶名,一切順利的話就會受到一份郵件,點擊郵件中的鏈接後驗證一下:
pod trunk me
當然,如果你的pod是由多人維護的,你也可以添加其他維護者:
$ pod trunk add-owner ARAnalytics [email protected]
上面的工作完成之後,我們就可以開始 trunk push了。
Trunk push
pod trunk push 命令會首先驗證你本地的podspec文件(是否有錯誤),之後會上傳spec文件到trunk,最後會將你上傳的podspec文件轉換為需要的json文件。在工程根目錄(包含有.podspec)下執行命令:
pod trunk push
如果在trunk push過程中報錯了,仔細查看一下錯誤信息。我當初就是使用了podspec文件中描述的版本所沒有的API,之後修改podspec文件中s.platform = :ios, "7.0"就可以了。
如果你能看的上面的結果說明上傳成功了。我們也可以在本地的~/.cocoapods/repos/master/Specs目錄下看到轉換之後的json文件,
至此我們整個制作自己的開源庫的過程就完成了,以後有新版本只需要修改工程根目錄下的podspec文件就行了,然後重新執行pod trunk push命令。
最後
最後對這個過程做個總結:
1.開源庫發布之後,需要打上tag
2.進入到項目根目錄下,創建podspec文件
pod spec create PodName
3.編輯podspec文件中的相關信息,有兩個比較重要的地方s.source和s.source_files,可以驗證是否有誤:
pod spec lint PodName.podspec
4.注冊pod trunk
$ pod trunk register [email protected] 'Orta Therox' --description='macbook air'
5.發布到pod trunk
pod trunk push [NAME.podspec]
該命令在包含有.podspec文件的目錄下執行
6.更新pod庫
pod setup
如果pod trunk push成功後無法pod search到自己的庫,可執行該命令。
最後的最後
哈哈。好吧,我承認其實我是來打廣告的。例子中的HUPhotoBrowser是我開源的一個圖片浏覽器的庫,使用起來非常簡單,一行代碼就以實現圖片浏覽功能,支持本地和網絡圖片。希望大家可以支持一下,歡迎大家star。如果有什麼問題的話可以直接issue我。最後,希望能跟大家共同進步。項目地址:HUPhotoBrowser