我 :“ 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
,有没有一种“噢...,原来是这样的”的柳暗花明又一村
的感觉,如果你有,你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
【方案三】打开~/Library/Caches/CocoaPods
,删除search_index.json
,该文件会在重新搜索时创建。
【方案四】执行pod search PPkit --repo-update
附:从AFNetworking/PPKit/YYKit看podspec语法。
研究了自己常用的开源库的文件目录,其中AFNetworking是最完美的,也是我最想要的,而其它的大多数都是,所有.h和.m文件都放在一个目录下,比如:IQKeyboardManager。对比如下图:
参考AFNetworking来说明{}里面的共用以及子目录的设置。
1. 如下图中间的线:
AFURLRequestSerialization.h
、AFURLRequestSerialization.m
以及AFURLResponseSerialization.h
和AFURLResponseSerialization.m
可以写为'AFNetworing/AFURL{Request,Response}Serialization.{h,m}'
。所以:{}
里面的用逗号(,)隔开,相当于数学中的组合.
2. Serialization文件不需要指定路径,只需要subspec调用了就好,它处于第2级目录,里面除了上面的4个文件别无其它。但是这4个文件必须指定目录路径,如上面1中所示。
PPKit配置与截图说明,如下:记住那个原则:每个文件/路径都要指定对应的路径。
由YYKit学会与理解.exclude_files
.exclude_files,忽略YYKit下的,重新建文件夹(目录)来管理。