我 :“ 2017年還有多久?”
我 :“ ‘冬天來了,春天還會遠嗎?’,馬上就要步入18年,您說17年還有多久。您就看著吧,下個月到處都是17年年終總結!”
I'sorry,進入正題
我個人寫本文的目的只有一個:讓你輕松制作自己的
pod
庫。可能是因為我 笨?網上的教程,我看的有點??(暈),不過最終還是摸索出來了,并且明白了123,so,請允許我以我“笨”的方式來讓你輕松。
第一步:在GitHub上新建一個倉庫
說明:由于自己創建PPKit時沒有截圖,這里為了說明,新建了PPKit1來截圖說明,諒解!
第二步:clone項目到本地,并創建PPKit1.podspec文件
具體clone與創建.podspec文件的命令如下:
//2.1(具體路徑,看你自己放置)
cd /Users/peijianbo/Documents/MTTest
//2.2
git clone https://github.com/chinesemanbobo/PPKit1.git
//2.3 (切換到開源庫名相同的目錄)
cd /Users/peijianbo/Documents/MTTest/PPKit1
//2.4 (很重要的第一步,create后面必須是開源庫名,此處是PPKit1)
pod spec create PPKit1
其中最關鍵的是(請自動替換PPKit1
為自己的庫名),當然cd
對應的文件目錄也不要弄錯:
pod spec create PPKit1
等到終端看到如上圖綠色文字Specification created at PPKit1.podspec,這一步就成功了。
第三步:配置PPKit.podspec
,尤其是里面的各種目錄的.source_files
文件要注意
注意:此處開始,我們再回到PPKit。(如果你自己的庫,請替換PPKit為你的庫名來閱讀)。
3.1 打開PPKit.podspec
文件(推薦用Sublime Text
打開),先閱讀里面各種#
后面的注釋說明,尤其有必要讀讀開頭的3行注釋
此處,為什么覺得很有必要讀讀開頭的3行注釋,都是自己血與淚的教訓!我自己當時直接忽略這些注釋,一心急著想搞定,結果,折騰很久,后頭再看注釋,才明白好多,然后慢慢修改,才OK的。不過,你也可以不看,說了讓你輕松。
下面的是開頭的3行注釋,容我簡單翻譯與介紹下:
//1.
Be sure to run `pod spec lint PPKit.podspec' to ensure this is a valid spec and to remove all comments including this before submitting the spec.
//2.
To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html
//3.
To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/
- 在你提交
PPKit.podspec
文件到CocoaPods
前,務必要在命令行運行pod spec lint PPKit.podspec
來確保.podspec
有效,并且刪除所有的注釋,包括這句(Be sure ... submitting the spec.
)。- 你可以在http://docs.cocoapods.org/specification.html看到更多關于
podspec
的屬性的信息。- 你可以在https://github.com/CocoaPods/Specs/上查看當前都有那些有效的、可以用的
Pods
。
上面第3條,你也可以點開看一看,保證你有收獲,如下:
點開后,在
This repository
里輸入AFNetworking
,然后摁Enter鍵
搜索,你會看到下圖,先別驚奇(至于我在下圖說的,'本地也有',就不上圖了):
CocoaPods的秘密(原理)
看到這,如果你的項目用到了CocoaPods
,有沒有一種“噢...,原來是這樣的”的柳暗花明又一村
的感覺,如果你有,你NB;如果沒有,沒有就算了,你更要認真看下去!反正我有。嘿嘿!
放大招的時候來了:CocoaPods說白了,就是幫我們管理第三方or自己的庫;而它不過也是一個.xcodeproj工程。只不過,它是專門管理第三方or自己的庫的工程,而它的工作原理就是:你把.podspec文件制作好,然后trunk push (后面后講到)給它,它再把.podspec文件保存為.podspec.json文件放到GitHub,你需要的話,它通過這個.podspec.json把GitHub上對應的開源庫的文件下載下來,放到你的工程里。至此,OK。
說了這么多,再來張圖,證實下,我們繼續講pod
庫的制作,圖如下(不信也不行):
3.2 修改PPKit.podspec
文件,刪除里面所有的注釋,然后再修改。下面給出PPKit.podspec
以便參考,注釋我已經加進去了(如果你發布的話,最好把注釋都去掉,此處只是為了說明才保留注釋的),如下:
Pod::Spec.new do |s|
#開源庫的名字
s.name = "PPKit"
#開源庫當期版本
s.version = "0.0.6"
#開源庫概述(打開GitHub能看到的描述)
s.summary = "開發中常用的自定義控件、開發經驗、開發bug記錄,常用宏、categories等封裝,不再每個項目都手動配置,用Pod統一管理。"
#開源庫描述 (這個描述會被用來生成開源庫的標簽和提高被搜到,必需寫在中間一行,只要在中間一行,不需要考慮縮進)
s.description = <<-DESC
開發中經常從A項目copy一些代碼(比如常用的宏、category等)到B項目,A更改了一個category,B又要改動;B更改了一個category,A也要改動,不方便同步,就容易出差錯,所以,考慮用Pod來管理。
DESC
#可以是開源庫的GitHub地址,也可以是你自己的網址等
s.homepage = "https://github.com/chinesemanbobo/PPKit"
#我這里是參靠網上的一種寫法,不會報警告,也可以直接 s.license = 'MIT'
s.license = { :type => 'MIT', :text => <<-LICENSE
Copyright PPAbner 2016-2017
LICENSE
}
#開源庫作者
s.author = { "chinesemanbobo" => "chinesemanbobo@163.com" }
#開源庫作者的社交鏈接(此處我放的是微博)
s.social_media_url = "https://weibo.com/5366568018/profile?rightmod=1&wvr=6&mod=personnumber&is_all=1"
#開源庫支持的平臺(暫時沒考慮tvOS、OSX等)
s.platform = :ios
#開源庫最低支持
s.ios.deployment_target = "8.0"
#VIP 開源庫GitHub的路徑與tag值,GitHub路徑后必須有.git,tag實際就是上面的版本
s.source = { :git => "https://github.com/chinesemanbobo/PPKit.git", :tag => s.version }
#VIP 開源庫資源文件 (我自己總結:每個文件都要有自己的路徑,尤其你想目錄分的比較詳細的話,更具體的說明,看圖對比著再說)
s.source_files = 'PPKit/PPKit.h','PPKit/PPMacros.h'
#子目錄PPHelpers(2級),PPKit(1級),ss子目錄可以隨便寫,但下面要對應
s.subspec 'PPHelpers' do |ss|
#子目錄PPRuntimeHelper.h和PPRuntimeHelper.m (3級)
ss.source_files = 'PPKit/PPHelpers/PPRuntimeHelper.{h,m}'
end
s.subspec 'PPCategories' do |ss|
ss.subspec 'UI' do |ssui|
ssui.subspec 'UIScreen' do |ssuiscreen|
ssuiscreen.source_files = 'PPKit/PPCategories/UI/UIScreen/UIScreen+EasilySize.{h,m}'
end
end
end
#開源庫頭文件
s.public_header_files = 'PPKit/PPKit.h'
#開源庫依賴庫
# s.dependency "JSONKit", "~> 1.4"
# 是否支持arc
s.requires_arc = true
end
3.3 .podspec
里面的.source_files
的簡單介紹(主要是語法)
一個宗旨:庫里面每個文件、資源都要有路徑指向它。
部分語法:
'PPKit/*' 表示匹配所有PPKit目錄下文件,不包含子目錄的 'PPKit/PPHelpers/*.{h,m}' 表示匹配PPHelpers所有以.h和.m結尾的文件 'PPKit/**/*' 表示匹配所有文件(主目錄和子目錄,其中**相當于省略中間層級)
具體的語法示例及截圖,見文章最后面(參考鏈接之前)。
第四步:更新PPKit.podspec
到GitHub
上
依次執行下面命令:
$ git add -A && git commit -m "你的更新說明"
//tag值要和.podspce里的version相同,并且必須設置
$ git tag '0.0.68'
$ git push --tags
$ git push origin master
第五步:驗證PPKit.podspec
是否有效
pod spec lint PPKit.podspec
如果驗證不通過,可以執行
pod spec lint PPKit.podspec --verbose
查看詳細的ERROR
和WARING
提示,根據提示依次解決,然后回到第四步重新來一遍。
注意:在重新開始之前,我們要刪除遠程庫的tag和本地的tag,命令如下:$ git tag -d 0.0.68 //刪除本地tag $ git push origin :refs/tags/0.0.68 // 刪除遠程庫tag
直到如下圖的驗證成功:
第六步:提交PPKit.podspec
到CocoaPods
pod trunk push PPKit.podspec
如果是第一次提交,需要先執行下面的命令去CocoaPods注冊(填寫郵箱,收取驗證鏈接,點擊鏈接,就OK):
$ pod trunk register 郵箱 '昵稱' --description=' 這里寫描述'
然后再執行:
pod trunk push PPKit.podspec
OLA,到此就結束了,趕緊去pod search
一下,看有沒有!
遇到的問題s:
1. pod search PPkit 搜不出
【方案一】cocoapods search 獲取不到最新庫的解決方法
我用的是第二種:執行pod repo update
更新本地倉庫,再pod search PPkit
,就能 搜到了。
【方案二】執行pod search PPkit --simple
--simple
【方案三】打開~/Library/Caches/CocoaPods
,刪除search_index.json
,該文件會在重新搜索時創建。
【方案四】執行pod search PPkit --repo-update
附:從AFNetworking/PPKit/YYKit看podspec語法。
研究了自己常用的開源庫的文件目錄,其中AFNetworking是最完美的,也是我最想要的,而其它的大多數都是,所有.h和.m文件都放在一個目錄下,比如:IQKeyboardManager。對比如下圖:
AFNetworking與IQKeyboardManager的pod庫目錄對比
參考AFNetworking來說明{}里面的共用以及子目錄的設置。
1. 如下圖中間的線:
AFURLRequestSerialization.h
、AFURLRequestSerialization.m
以及AFURLResponseSerialization.h
和AFURLResponseSerialization.m
可以寫為'AFNetworing/AFURL{Request,Response}Serialization.{h,m}'
。所以:{}
里面的用逗號(,)隔開,相當于數學中的組合.
2. Serialization文件不需要指定路徑,只需要subspec調用了就好,它處于第2級目錄,里面除了上面的4個文件別無其它。但是這4個文件必須指定目錄路徑,如上面1中所示。
AFNetworking的Serialization目錄解釋說明
PPKit配置與截圖說明,如下:記住那個原則:每個文件/路徑都要指定對應的路徑。
由YYKit學會與理解.exclude_files
.exclude_files,忽略YYKit下的,重新建文件夾(目錄)來管理。