iOS备忘录iOS进阶专栏ios进阶

使用CocoaPods管理iOS库---制作pod篇

2017-11-25  本文已影响138人  PPAbner
使用CocoaPods管理iOS库

我 :“ 2017年还有多久?”

我 :“ ‘冬天来了,春天还会远吗?’,马上就要步入18年,您说17年还有多久。您就看着吧,下个月到处都是17年年终总结!”

I'sorry,进入正题

我个人写本文的目的只有一个:让你轻松制作自己的pod。可能是因为我 笨?网上的教程,我看的有点😓(晕),不过最终还是摸索出来了,并且明白了123,so,请允许我以我“笨”的方式来让你轻松。

第一步:在GitHub上新建一个仓库

说明:由于自己创建PPKit时没有截图,这里为了说明,新建了PPKit1来截图说明,谅解!

新建仓库

第二步:clone项目到本地,并创建PPKit1.podspec文件

终端之创建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/
  1. 在你提交PPKit.podspec文件到CocoaPods前,务必要在命令行运行 pod spec lint PPKit.podspec 来确保.podspec有效,并且删除所有的注释,包括这句(Be sure ... submitting the spec.)。
  2. 你可以在http://docs.cocoapods.org/specification.html看到更多关于podspec的属性的信息。
  3. 你可以在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库的制作,图如下(不信也不行):

解密CocoaPods原理

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.podspecGitHub

依次执行下面命令:

$ 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查看详细的ERRORWARING提示,根据提示依次解决,然后回到第四步重新来一遍。
注意:在重新开始之前,我们要删除远程库的tag和本地的tag,命令如下:

 $ git tag -d 0.0.68                   //删除本地tag
 $ git push origin :refs/tags/0.0.68   // 删除远程库tag

直到如下图的验证成功

PPKit.podspce验证成功

第六步:提交PPKit.podspecCocoaPods

pod trunk push PPKit.podspec

如果是第一次提交,需要先执行下面的命令去CocoaPods注册(填写邮箱,收取验证链接,点击链接,就OK):

$ pod trunk register 邮箱 '昵称' --description=' 这里写描述'

然后再执行:

pod trunk push PPKit.podspec
trunk成功

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.hAFURLRequestSerialization.m以及AFURLResponseSerialization.hAFURLResponseSerialization.m可以写为'AFNetworing/AFURL{Request,Response}Serialization.{h,m}'。所以:{}里面的用逗号(,)隔开,相当于数学中的组合.
2. Serialization文件不需要指定路径,只需要subspec调用了就好,它处于第2级目录,里面除了上面的4个文件别无其它。但是这4个文件必须指定目录路径,如上面1中所示。

AFNetworking的Serialization目录解释说明

PPKit配置与截图说明,如下:记住那个原则:每个文件/路径都要指定对应的路径。

利用PPKit..podspec说明.source_files目录路径怎么写

由YYKit学会与理解.exclude_files

.exclude_files,忽略YYKit下的,重新建文件夹(目录)来管理。

.exclude_files示例

参考链接:

  1. Cocoapods: pod search无法搜索到类库的解决办法
  2. 给自己的开源库添加cocopods支持
  3. 让自己的开源项目支持CocoaPods
  4. Cocoapods完整使用篇
上一篇下一篇

猜你喜欢

热点阅读