说起Cocoapods,让我想起了在大学时手动拖第三方代码包的灰色经历。。。当时想玩玩百度地图和高德地图的api,各种link系统包,修改Build Settings
里的参数,最后运行不起来还一行一行和官方文档里对。。特别是百度和高德地图都拖进一个项目中时各种问题真的泪崩。。自从使用了Cocoapods,PodFile
里一行代码就解决了这些烦恼。
不过这里我并不想讲怎么装Cocoapods和怎么使用,因为对于iOS App的开发,几乎都采用了Cocoapods吧,而且网上教材很多,查找也很方便。这里我只想讲一下怎么在Cocoapods发布自己的代码
。(其实在第一次使用Cocoapods我就有强烈的愿望这么做,一直拖到现在。。)
使开源库支持pod
我们先看一下Pod版本号:
pod --version
1.0.1
这里主要介绍下流程。其实使自己的开源库支持Pod的过程并不复杂,主要是在自己的git库里创建一个.Podspec
文件,里面配置一些参数,然后推送到远程的cocoapods
,这样其他人就能用你的开源库拉。一般都使用gitHub
作为自己的git库,我也不例外,这里我选用我写的第三方库NMAutoHeightTableCell
来测试。地址
创建.Podspec文件
- 首先从
github
上clone
你的项目文件到本地。(可以使用命令行,也可以使用图形界面SourseTree,为了方便截图,我使用SourseTree)
- cd 到你的项目目录下用
pod spec create NMAutoHeightTableCell
命令创建.Podspec
文件。
$ cd /Users/nuomi/NMKit/NMAutoHeightTableCell/lib
$ pod spec create NMAutoHeightTableCell
Specification created at NMAutoHeightTableCell.podspec
于是我们的项目文件下就生成了NMAutoHeightTableCell.podspec
文件。用文本编辑器或者vi开这个文件,去掉注释,大概就剩下这么几个部分。
Pod::Spec.new do |s|
s.name = "NMAutoHeightTableCell"
s.version = "0.0.1"
s.summary = "A short description of NMAutoHeightTableCell."
s.description = <<-DESC
DESC
s.homepage = "http://EXAMPLE/NMAutoHeightTableCell"
s.license = "MIT"
s.author = { "nuomi" => "xsz88287703@126.com" }
s.platform = :ios, "7.0"
s.source = { :git => "http://EXAMPLE/NMAutoHeightTableCell.git", :tag => "#{s.version}" }
s.source_files = "Classes", "Classes/**/*.{h,m}"
s.exclude_files = "Classes/Exclude"
s.requires_arc = true
s.dependency "Masonry", "~> 0.6"
end
s.name: 库名称,我这里是
NMAutoHeightTableCell
。s.version: 版本号。
s.summary: 摘要,简要说明你的开源库。
s.description: 描述,写在
<<-DESC
和DESC
之间。s.homepage: 项目主页。
s.license: 许可证,不懂就填
MIT
,具体可以网上查下MIT license
。s.author: 作者。
s.platform: 支持语言和SDK包限制,我这里是支持IOS7以上
s.source: git地址和
tag
,什么是tag后面会讲。s.source_files: 包含的文件。这里有必要说明下,怎么找自己的要公开的路径。我的项目路径为
https://github.com/NBaby/NMKit/tree/master/NMAutoHeightTableCell/lib
,前面s.source
填写的是https://github.com/NBaby/NMKit.git
,可见已经到NMKit
这个文件夹了,所以s.source_files
只要填NMAutoHeightTableCell/lib
就能到Lib下了。后面因为只要.h
,.m
文件,所以s.source_files
完整的形式为:"NMAutoHeightTableCell/lib", "*.{h,m}"
主要的就是上面这些还有些其他的注意事项可以参考网上的解决方案:
如果我们的开源库依赖系统库怎么办?
# s.framework = 'SomeFramework'// 去掉#,设置依赖的系统库名称
# s.frameworks = 'SomeFramework', 'AnotherFramework'//设置多个系统库名称
# s.library = 'iconv'// 设置只依赖一个系统的library
# s.libraries = 'iconv', 'xml2' // 设置依赖多个系统的library
# s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }// 这里是工程配置,这样使用者就不需要手动处理,由pod自动处理了。
如果我们的开源库依赖系统库怎么办?
s.dependency 'JSONKit', '~> 1.4'//设置我们的开源库依赖哪些第三方库和依赖的版本号。
我的例子:
Pod::Spec.new do |s|
s.name = "NMAutoHeightTableCell"
s.version = "0.0.1"
s.summary = "一个可以使用Autolayout实现自动计算Cell高度的扩展库"
s.description = <<-DESC
一个可以使用Autolayout实现自动计算Cell高度的扩展库
DESC
s.homepage = "https://github.com/NBaby/NMKit/tree/master/NMAutoHeightTableCell"
s.license = "MIT"
s.author = { "nuomi" => "xsz88287703@126.com" }
# s.platform = :ios
s.platform = :ios, "7.0"
s.source = { :git => "https://github.com/NBaby/NMKit.git", :tag => "0.0.1" }
s.source_files = "NMAutoHeightTableCell/lib", "*.{h,m}"
s.requires_arc = true
end
好了,如果这里都填好了,可以先测一下本地的.Podspec
文件是否填对。
检验.Podspec文件
cd 到本地开源库项目的.Podspec文件
目录下,使用pod lib lint
命令来尝试编译,如果要忽略警告,可以在后面添上--allow-warnings
,如果成功会显示passed validation
如果有错也没事,根据错误提示慢慢改.Podspec
文件,好了再编译,直到成功为止。
上传本地文件到gitHub
还记得我们.Podspec文件
文件里用了:tag => "0.0.1"
这句话么,这里就要用到了。首先用SourceTree
切出一个分支,名字命名为“0.0.1”,这里一定要对上,否则后面会找不到。
然后就可以推送的gitHub上去了。
这里用命令行完成操作也是可以的。
推送到远程的cocoapods
回到终端,通过 pod trunk push 库名.podspec --allow-warnings
来推送到远程的cocoapods.
记得第一次推送到cocoapods会让你填一个邮箱,然后往你邮箱你发一封验证邮件。由于当时没截图。。这里就放上验证邮件的截图吧。。
一切顺利的话就能用Pod Search
搜索你的库拉。
咦,小伙伴的电脑搜不到怎么办。。试着pod repo update
一下就ok~
总结
第一次尝试肯定会遇到横多问题,其实不用担心,将错误信息在网上搜一下就会出来很多解决方法。有些错误写得很直白,稍微看下也就懂了(像我的路径没对上就提示找不到xxx文件)。
这次尝试也算是实现了一年前的心愿,也算是一种进步吧~
我是翻滚的牛宝宝,欢迎大家评论交流~