背景
上一篇博客最新的CocoaPods的使用教程(一)里主要講解了CocoPods得簡單的日常使用。但是我們經常會想把自己的開源庫讓別人通過 **pod install **來使用。網上有好多博客說如何使用Cocoapods創(chuàng)建私有的podspec
以及如何把自己的開源庫發(fā)布到CocoasPods等等,而我在看他們的時候好多寫的都比較模糊、比較費解。因為我比較笨吧,經過我一步一步琢磨親測過后,我有了一個很好地理解。在這里我盡量的詳細說明一下(當然我也有很多沒有考慮的地方,大家都是凡人嘛_,我也是煩人)
前言
這一篇博客主要講解創(chuàng)建CocoaPods的私有庫。希望這一篇博客能讓你們少走點彎路,讓你私有庫靈活運用。下一篇博客會介紹創(chuàng)建CocoaPods的開源庫。主要講解內容目錄:
一. 創(chuàng)建項目的Podspec索引文件
二. 創(chuàng)建CocoaPods的私有庫
三. CocoaPods私有庫管理的原理
四. 常用命令匯總
一. 創(chuàng)建項目的Podspec索引文件
作用:索引作用,就是讓命令能找到我們的代碼(私有庫或開源庫)
創(chuàng)建命令:進入我們在工程根目錄或者開源庫根目錄中初始化一個Podspec文件:
pod spec create JYPodTest
該命令將在本目錄產生一個名為JYPodTest.podspec文件。用編輯器打開該文件,里面已經有非常豐富的說明文檔。下面介紹如何聲明第三方庫的代碼目錄和資源目錄,還有該第三方庫所依賴ios核心框架和第三方庫。這是我的podspec文件:
Pod::Spec.new do |s|
s.name = "JYPodTest"
s.version = "0.0.1"
s.summary = "open souurse Test With JYPodTest."
s.homepage = "https://git.coding.net/Dely/JYPodTest.git"
s.license = 'MIT'
s.author = { "Dely" => "jiayaoit@126.com" }
s.platform = :ios, "7.0"
s.source = { :git => "https://git.coding.net/Dely/JYPodTest.git", :tag => s.version }
s.source_files = "JYPodTest/*.{h,m}"
s.resources = "*.jpg", "*.md", "*.mobileprovision"
s.frameworks = "UIKit", "Foundation"
end
各個參數(shù)含義:
s.name
聲明庫的名稱
s.summary
對這個庫的簡短說明介紹
s.version
當前庫的版本
s.homepage
聲明庫的主頁
s.license
所采用的授權版本
s.author
庫的作者
s.platform
庫運行的平臺和系統(tǒng)的最低版本
s.source
庫的倉庫地址以及版本號或者committed等
s.source_files
聲明庫的源代碼的位置,庫的真正路徑(一般是相對路徑)所以這個地方不能填錯。這個目錄下的文件都會進行編譯。
s.resources
存放我們不想?yún)⑴c編譯的資源文件
s.frameworks
聲明了庫所依賴的系統(tǒng)核心庫
s.dependency
我們開發(fā)的庫中也可能還依賴第三方庫,例如JSONKit,那么,就可以做如下聲明:s.dependency "JSONKit", "~> 1.4"
,如果有多個就寫多個
上面的屬性基本上夠用,如果還想引入更多參數(shù),請自行查看。
注意點:地址一定要寫正確,各個文件的路徑要寫正確,
二. 創(chuàng)建CocoaPods的私有庫
1. 把代碼托管到代碼托管平臺上
托管在github或者coding,SVN,公司私有服務器等,選擇哪一個沒影響(只是一個地址)。下面我把他托管到coding上(連接快點),
我采用只是包含源代碼的文件夾(如下目錄結構),xcode新建工程里面包含源代碼也一樣,只要路徑寫正確就ok。
- 1.新建遠程倉庫:github或coding,公司內部服務器等等上都可以
-
2.本地文件初始化倉庫
- 如果是xcode新建一個工程,里面包含庫的源代碼。xcode會自動
git init
初始化倉庫,跳過初始化這一步 - 如果是只是包含源代碼的文件夾,需要對這個源代碼文件夾初始化如下:
- 如果是xcode新建一個工程,里面包含庫的源代碼。xcode會自動
//進入源代碼根目錄
cd ~/Desktop/JYPodTest
//git初始化
git init
- 3.在庫根目錄下創(chuàng)建Podspec文件
//進入源代碼根目錄
cd ~/Desktop/JYPodTest
//創(chuàng)建Podspec文件
pod spec create JYPodTest
現(xiàn)在我們的目錄如下:
-
4.把源代碼推送到遠程倉庫(我是coding)
庫的源代碼對應的遠程倉庫的地址為:https://git.coding.net/Dely/JYPodTest.git
//進入源代碼根目錄
cd ~/Desktop/JYPodTest
//添加到git得暫存區(qū)
git add -A
//提交到本地倉庫
git commit -m "first commit"
//添加遠端倉庫地址
git remote add origin https://git.coding.net/Dely/JYPodTest.git
//把本地代碼推送到遠端倉庫
git push -u origin master
-
5.對源代碼打tag,推送到遠端倉庫
因為下面編輯podspec文件中需要獲取Git版本控制的源代碼,所以我們要打上一個tag,
你也可以在podspec文件中保存你的commitid,或者分支來獲取相應的源代碼。不過基本上都是打tag。
//進入源代碼根目錄
cd ~/Desktop/JYPodTest
//新建一個tag
git tag 0.0.1
//tag推送到遠端
git push origin 0.0.1
2. 編輯podspec文件
做完上面這些就可以編輯podspec文件了。最開始已經講解了這個文件的寫法。
注意:庫目錄的各個路徑要對應,tag版本要和上面tag對應起來
podspec文件內容如下:
Pod::Spec.new do |s|
s.name = "JYPodTest"
s.version = "0.0.1"
s.summary = "open source Test With JYPodTest."
s.homepage = "https://git.coding.net/Dely/JYPodTest.git"
s.license = 'MIT'
s.author = { "Dely" => "jiayaoit@126.com" }
s.platform = :ios, "7.0"
s.source = { :git => "https://git.coding.net/Dely/JYPodTest.git", :tag => s.version }
s.source_files = "JYPodTest/*.{h,m}"
s.resources = "*.jpg", "*.md", "*.mobileprovision"
s.frameworks = "UIKit", "Foundation"
end
編輯好保存起來推送到遠程倉庫:
cd ~/Desktop/JYPodTest
git add -A
git commit -m "修改pod spec文件"
git push origin master
3.驗證Podspec文件的有效性
注意 注意:本地驗證之前一定要保證我們的源代碼和tag已經同步到遠端倉庫,否則驗證會找不到相應代碼和tag的。
進入根目錄下驗證
cd ~/Desktop/JYPodTest
pod spec lint JYPodTest.podspec
//可以使用下面。顯示具體問題。以及忽略所有警告
//pod spec lint JYPodTest.podspec --verbose --allow-warnings
注意:錯誤error一定是不可以的,必須要把錯誤修改掉。警告最好修改,可是使用--allow-warnings
忽略警告
如果Podspec文件無效,由于問題各種各樣,請Google解決!一定要保證文件的有效性哦,
- 有人會為我為什么根目錄不要 LICENSE文件?不需要,因為我們現(xiàn)在是私有庫哦,不要驗證這些開源授權的東西。下一篇博客說道開源才會需要這個文件。
- 有人會問我修改了podspec文件需要推送到遠端?需要。因為私有庫驗證會驗證你遠端的podspec文件
- 有人會問我修改了podspec文件tag需要重新打和推送到遠端?不需要。除非你源代碼有改動,需要重新發(fā)一個版本。
4.本地測試Podspec文件
我們可以創(chuàng)建一個新的項目,在這個項目的Podfile文件中直接指定剛才創(chuàng)建編輯好的podspec文件,看是否可用。 在Podfile中我們可以這樣編輯,有兩種方式
platform :ios, '7.0'
target 'JYTest' do
pod 'JYPodTest', :path => '~/Desktop/JYPodTest' # 指定路徑
#pod 'JYPodTest', :podspec => '~/Desktop/JYPodTest/JYPodTest.podspec' #指定podspec文件
end
然后執(zhí)行pod install
命令安裝依賴,打開項目工程,可以看到庫文件都被加載到Pods子項目中了,不過它們并沒有在Pods目錄下,而是跟測試項目一樣存在于Development Pods/JYPodTest中,這是因為我們是在本地測試,而沒有把podspec文件添加到Spec Repo中的緣故。
在項目中編寫代碼,測試庫文件無誤后就可以開始下一步了,提交podspec到Spec Repo中。
5.向Repo提交私有的podspec
- 1.新建一個我們保存podspec文件的遠端倉庫
我們的遠端的podspec倉庫地址為:https://git.coding.net/Dely/JYPodspec.git
-
2.給cocoapods添加私有repo
終端輸入:
pod repo add JYPod https://git.coding.net/Dely/JYPodspec.git
查看是否添加成功:
pod repo list
- 3.將JYPodTest.podspec文件添加到podspec遠端倉庫和本地repo/JYPod里
//兩個參數(shù):添加的私有repo名 JYPod 將要添加的Podspec路徑
pod repo push JYPod ~/Desktop/JYPodTest/JYPodTest.podspec --allow-warnings
這個命令有兩個作用:
- 第一:在本地repo/JYPod倉庫添加我們的podspec文件
- 第二:在我們的遠端存放podspec倉庫里push最新的podspec文件
出線下面信息說明添加成功:
此時打開本地~/.cocoapods/repos/JYPod
目錄查看
遠端podspec倉庫也會同步過來podspec信息:
6.如何引用私有庫
上面都完成的話,那我們看看能不能搜索到我忙的私有庫
pod search JYPodTest
如何使用呢?在前面本地驗證的工程里修改Podfile文件如下:
source 'https://git.coding.net/Dely/JYPodspec.git'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '7.0'
target 'JYTest' do
pod 'JYPodTest', '~> 0.0.1' #私有庫
pod 'JYCarousel', '~> 0.0.1' #開源庫
end
注意:我們添加我們的遠端podspec倉庫地址時,一定一定要把開源庫CococaPods的podspec的github地址寫上(上一篇博客有提到)
執(zhí)行pod update
命令看看
工程變化:
從上面項目可以看到,我們自己的庫文件已經出現(xiàn)在Pods子項目中的Pods子目錄下了,而不再是Development Pods。到現(xiàn)在是不是有一種成就感_
特別插入: 特別插入: 特別插入: 還有另一種方式引用私有庫哦**
這種方式我們上一篇博客里提到過,自定義Podfile的寫法里提到,
我們同樣修改我們的測試工程的Podfile文件:
platform :ios, '7.0'
target 'JYTest' do
pod 'JYPodTest', :git => 'https://git.coding.net/Dely/JYPodTest.git' #指定私有庫遠程倉庫地址,還可以指定tag,committed等
end
執(zhí)行pod update看看效果:
這種寫法比較方便,直接指定源代碼的git倉庫地址就可以了,也不需要在Podfile引入source的podspec的倉庫地址,
這種寫法維護:只要修改源代碼,然后在需要發(fā)布新版本的時候打tag,更改podspec的內容推送到倉庫就可以了。
缺點就是寫法不美觀
我們現(xiàn)在的項目就是采用這種引入方式_
7.更新維護私有庫
上面已經建立好我忙的私有庫了,我們不可能一直是一個版本一輩子只用一樣的代碼吧。所以我們要更新維護我忙的私有庫源代碼。
1.修改我們的私有源代碼
我們對我忙的私有庫做了大量大量的改動,需要發(fā)布新版本了。這里我們也大量改動一下:添加一張圖片_
2.推送到私有庫遠端
- 我們對這個新版本打一個打tag,比如:1.0.0 ,然后push到遠端倉庫
- 修改podspec文件,根據(jù)你代碼改動修改,tag和目錄結構等
- 驗證podspec有效性,跟上面一樣。進行本地驗證,然后在向repo提交podspec文件。驗證保證通過。不通過繼續(xù)修改直至通過,推送到遠端私有庫
pod spec lint JYPodTest.podspec --allow-warnings
注意 注意:本地驗證之前一定要保證我們的源代碼和tag已經同步到遠端倉庫,否則驗證會找不到相應代碼和tag的。
3.再次向repo提交podspec文件
驗證好podspec文件有效性之后,之后就可以再次向repo提交我們的最新podspec文件了,命令和之前一樣
//兩個參數(shù):添加的私有repo名 JYPod 將要添加的Podspec路徑
pod repo push JYPod ~/Desktop/JYPodTest/JYPodTest.podspec --allow-warnings
我們再打開目錄~/.cocoapods/repos/JYPod
目錄下你會看到我們的倉庫里多了一個1.0.0版本
我們pod search JYPodTest
看下,會出現(xiàn)兩個版本哦
我們在我們的測試項目Podfile文件引用1.0.0版本。pod update 就可以了
3.Repo 添加和刪除命令
如何刪除一個Spec Repo,只需要執(zhí)行一條命令即可
pod repo remove JYPod
添加Spec Repo
pod repo add JYPod https://git.coding.net/Dely/JYPodspec.git
查看Spec repo列表
pod repo list
如果我們要刪除私有Spec Repo下的某一個podspec怎么操作呢,此時無需借助Cocoapods,只需要cd到~/.cocoapods/repos/JTPod目錄下,刪掉庫目錄
rm -Rf JYPodTest
然后在將Git的變動push到遠端倉庫即可
git add -A
git commit -m "remove unuseful pods"
git push origin master
我們直接在遠端podspec倉庫添加庫目錄,我們可以再本地~/.cocoapods/repos/JTPod目錄下拉取
git pull origin master
//或者更新所有的本地podspec文件
//pod repo update
小結: 創(chuàng)建CocoaPods的私有庫到這里頁系統(tǒng)的講解完了。私有庫最核心的就是podspec文件,這個文件也是CocoaPods的最核心的。
三. CocoaPods私有庫管理的原理
其實Cocoapods就是通過一個podspec文件來管理的,本地
~/.cocoapods/repos
下得各個目錄(不管開源庫master,私有庫JYPod)。這些目錄其實就是我們從遠端倉庫clone下來的,跟遠端保持一樣。我們pod search
命令就會在本地目錄下查找?guī)臁?/p>只不過私有庫有我們自己的podspec遠端倉庫,我們能pull和push,有我們自己控制。而開源庫的master我們只有pull的權限而已,沒啥太多東西哦,
我們
pod install
或者pod update
CocoaPods就會根據(jù)我們podspec文件里的配置來找到我們的源代碼,然后安裝我們的依賴庫。
四. 常用命令匯總
1. pod spec create JYPodTest
初始化一個Podspec文件
**2. pod spec lint JYPodTest.podspec **
驗證Podspec文件的有效性
//可以使用下面。顯示具體問題--verbose。以及忽略所有警告 --allow-warnings
//pod spec lint JYPodTest.podspec --verbose --allow-warnings
3. pod repo add JYPod https://git.coding.net/Dely/JYPodspec.git
給cocoapods添加私有repo
//相當于git remote add origin https://git.coding.net/Dely/JYPodspec.git
4. pod repo list
查看Spec repo列表
5.pod repo push JYPod ~/Desktop/JYPodTest/JYPodTest.podspec --allow-warnings
//將JYPodTest.podspec文件添加到podspec遠端倉庫和本地repo/JYPod里
//兩個參數(shù):添加的私有repo名 JYPod 將要添加的Podspec路徑
6. pod repo remove JYPod
刪除一個Spec repo
結尾:
創(chuàng)建CocoaPods私有庫基本上就這些內容了,不知道我的介紹你是否能理解,這東西需要自己操作學習一下,那樣會理解比較深刻。下一篇博客我會介紹創(chuàng)建CocoaPods的開源庫,把我們的開源庫發(fā)布到CocoaPods上。
我的開源庫喜歡請賞賜我一個star吧-------->最簡單方便的iOS輪播開源庫:JYCarousel
如果你喜歡我的文章請點個喜歡哦_(樓主好生不要臉啊)