Featured image of post 使用CocoaPods管理iOS库---制作pod篇

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

:“2017年还有多久?”

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

I’sorry,进入正题:

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

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

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

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

clone库到本地,并在库名对应文件夹了创建.podspec

具体clone与创建.podspec文件的命令如下:

1
2
3
4
5
6
7
8
//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

至此,会出现Specification created at PPKit1.podspec。Good!

第③步:配置.podspec,尤其是里面的.source_files文件要注意

注意:此处开始,我们再回到PPKit。(如果你自己的库,请替换PPKit为你的库名来阅读)。

3.1 打开PPKit.podspec文件(我用的是Sublime Text,提示、关键字高亮处理的比较好),我觉得很有必要读读开头的3行注释,真的是很有必要。(我自己就是因为后来才读这3行注释,中间浪费了很多时间)。下面,我简单翻译下:

1
2
3
4
5
6
#  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.
#
#  To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html
#  To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/
#
  1. 在你提交.podspec文件到CocoaPods前,务必要在命令行运行pod spec lint PPKit.podspec来确保.podspec有效,并且删除所有的注释,包括这句(Be sure … submitting the spec.)。
  2. 你可以在cocoapods.org看到更多关于podspec(pod规则)的属性的信息。
  3. 你可以在GitHub上查看当前都有那些有效的、可以用的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原理

那就打开PPKit.podspec,删除里面所有的注释。然后修改,下面给出PPKit.podspec以便参考,注释我以及加进去(如果你发布的话,最好注释去掉,此处只是为了说明):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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.2 .podspec里面的.source_files的常见语法

一个宗旨:库里面每个文件、资源都要有路径指向它。

1
2
3
"PPKit/*"  表示匹配所有PPKit目录下文件,不包含子目录的
"PPKit/PPHelpers/*.{h,m}"  表示匹配PPHelpers所有以.h和.m结尾的文件
"PPKit/**/*"  表示匹配所有文件(主目录和子目录,其中**相当于省略中间层级)

具体的语法示例及截图,见文章最后面(参考链接之前)。

第④步:更新GitHub

依次执行下面命令:

1
2
3
4
5
$ git add -A && git commit -m "你的更新说明" 
//tag值要和.podspce里的version相同,并且必须设置
$ git tag '1.0.0'   
$ git push --tags  
$ git push origin master  

第⑤步:验证.podspec是否有效

1
pod spec lint PPKit.podspec

如果验证不通过,可以执行**pod spec lint PPKit.podspec --verbose**查看详细的ERRORWARING提示,根据提示依次解决,然后回到第四步重新来一遍。 注意:在重新开始之前,我们要删除远程库的tag和本地的tag,命令如下:

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

直到如下图的验证成功。

第⑥步:提交.podspec到CocoaPods

1
pod trunk push PPKit.podspec

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

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

然后再执行:

1
pod trunk push PPKit.podspec

OLA,到此就结束了,赶紧去pod search一下,看有没有!

遇到的问题s:

pod search PPkit搜不出

【方案一】cocoapods search 获取不到最新库的解决方法 我用的是第二种:执行 pod repo update更新本地仓库,再pod search PPkit ,就能 搜到了。

【方案二】执行 pod search PPkit –simple

【方案三】打开~/Library/Caches/CocoaPods,删除search_index.json,该文件会在重新搜索时创建。

附:从AFNetworking/PPKit/YYKitpodspec语法。

研究了自己常用的开源库的文件目录,其中**AFNetworking是最完美的,也是我最想要的,而其它的大多数都是,所有.h.m文件都放在一个目录下,比如:IQKeyboardManager**。对比如下图:

AFNetworking与IQKeyboardManager的pod库目录对比

参考[AFNetworking](https://github.com/AFNetworking/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下的,重新建文件夹(目录)来管理。

2017-11-24 03:51:40 耗时6个小时写此文!

参考链接:

Built with Hugo
主题 StackJimmy 设计