Swift/Objective-C-使用Cocoapods创建/管理公共库

将自己封装的库上传至Pod的repo存储库。

1. 需要准备的东西
  • GitHubtrunk账号(后面会提到如何注册)
  • 有的还需要配置和管理.ssh账号
  • 下载Sourcetree管理自己的公共库(需要注册Sourcetree账号),或者通过终端命令进行管理
2. 在GitHub上创建一个空的仓库
  • 新建Repository,如下图:
    选择新建Repository.png

3. 通过终端命令创建本地工程

1)打开终端,通过cd 命令进入到目标文件夹下,我这里是进入桌面的PublicRepository文件夹

$ cd Desktop/PublicRepository/ 

2)通过pod命令查询一下你起的工程名是否已被占用,若已被占用必须重新起名,因为pod要求库名不能重复,否则到最后一步由于工程名被占用,提交通不过,就得重来一遍了。

$ pod search 工程名

结果如下图:
工程名未在pod中找到.png

无法找到名称、作者、摘要或描述与“JYTest0”匹配的pod,说明起的工程名在pod中未被占用。

3)通过pod命令创建模板工程

$ pod lib create 工程名

注意:执行此命令后,Cocoapods会自动帮我们创建README文件和MIT LICENSE协议文件

  • 命令运行后有些配置项需要配置下,如下图:
    创建本地模板工程,及配置信息.png

填写完成后,将自动创建demo应用程序,并自动运行pod install命令安装下载JYTest0公共库,下载完成后,自动打开demo应用程序。

  • 预览demo工程,工程结构如下图:
    demo工程目录结构.png
4. 添加公共库文件到Classes文件夹中,资源文件添加到Assets文件夹中
  • 在Xcode打开的demo工程中,选中ReplaceMe.swift文件,右键Show in Finder,打开Classes文件夹,将自己的公共库文件添加到Classes文件夹中,并将无用的ReplaceMe.swift文件删除。目录结构如下图:
    封装的公共库文件所在目录.png

切记:不要直接将公共库文件拖到Xcode打开的demo工程的ReplaceMe.swift文件的位置,这样做可能导致路径错误。

注意:若你创建的模板工程中没有Assets和Classes这两个文件夹,你可以自己创建这两个文件夹,放到对应的位置,导入公共库文件;或者根据自己喜好创建文件夹,导入公共库文件,以上两种方式创建后都需要再次查看.podspec文件中的s.source_files的配置,确定路径是否对应正确,若不正确则需修改成自己的文件夹及文件路径。

5. 配置“工程名.podspec”文件中的信息

1)在Xcode打开的demo工程中,找到Podspec Metadata文件夹下的“工程名.podspec”文件。

  • .podspec文件中配置信息说明:
Pod::Spec.new do |s|
  s.name             = 'JYTest0'    # 工程的名字(pod search 搜索的关键词,一定要和.podspec的名称一样,否则报错)
  s.version          = '0.1.0'   # 工程的版本控制(默认0.1.0版本),控制公共库的下载,必须和tag的版本保持一致(稍后提到)
  s.summary          = 'A short description of JYTest0.' # 项目的概要(简介),最好修改下,否则pod验证时可能报错

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

# 项目的描述,是概要的扩展。注意:这里的结构不可变,只能在TODO那一行增加东西,否则报错(注意s.description 文字书写格式);这里的文字的长度,一定要比上面的s.summary长,不然会认为格式不合格
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'git项目链接(注意不带.git)' # 项目主页地址,GitHub上的公共库地址,注意不带后缀.git(必须为可以链接到的页面)。.podspec文件中的homepage和source不支持ssh协议地址,所以我们得放入http/https地址。
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'  # 截屏,屏幕快照的地址,例如演示的 gif 文件
  s.license          = { :type => 'MIT', :file => 'LICENSE' } # 开源协议,模板创建的不用改动
  s.author           = { '用户名' => 'GitHub邮箱地址或其他' } # 作者信息,不用改动
  s.source           = { :git => '完整的git项目链接(带.git)', :tag => s.version.to_s } # 这个很关键,指的就是git的对应的远程仓库的地址以及版本号,版本号直接获取的是上面的s.version(带.git,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS),tag是公共库的版本号
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' # 多媒体介绍地址

  s.ios.deployment_target = '8.0' # 支持的平台及最低依赖版本
  # s.platform     = :ios, '8.0' # 支持的平台及版本
  s.requires_arc = true # 是否使用ARC,如果指定具体文件,则具体的问题使用ARC

  # s.exclude_files = '' # 隐藏的文件

  s.source_files = 'JYTest0/Classes/**/*' # 为代码库源文件路径(你库文件存放的目录位置),**/*表示Classes目录及其子目录下所有文件,“**” 表示匹配所有子目录,“*”是通配符,“.{h,m}” 表示匹配所有以.h和.m结尾的文件,“” 表示匹配所有文件,如果有多个目录下则用逗号分开。如果你准备pod的工程只是.h、.m以及一些图片资源的话,s.source_files = 'Classes/**/*.{h,m}'等,保证Classes 下的所有子文件中的.h、.m都能加载。打包公共库需要的文件路径都在这里配置,稍后详细配置。
  # 设置子目录,如果需要在项目中分组显示,这里也要做相应的设置(因为我们封装的一段代码,可能是由好几段之间没有联系的代码拼起来的。而有的时候,我们只想用我们封装的代码的某一段或者某几段)
  s.subspec 'Test1' do |test|
    test.source_files = 'JYTest0/Classes/Test1/**/*'
    test.dependency 'AFNetworking', '~> 3.0'
    test.dependency 'SDWebImage', '~>2.0'
  end


  s.vendored_frameworks = 'Classes/xxx.framework'  # 包含的framework,也就是我们自己制作的pod

  # s.resource_bundles = { # .bundle、.png文件等资源文件路径
  # 这里存放的 bundle 文件的例如, '工程名称' => ['工程名称/Assets/*.png']  # 这里放的 png 图片的资源文件,如果还想使用  storyboard,xib,imageset 文件的话,可以如下面的方法写
  # '工程名称' => ['工程名称/Assets/*.{png,xib,storyboard,imageset}']
  # 如果我们使用 xib , storyboard , 图片等资源的时候文件必须强制性放到 Assets 文件夹下,这个文件夹在初始化的时候,并没有显示在工程中,不过可以通过 show in Finder classes 文件查看,发现里面有一个同级别的文件夹 Assets , 我们把我们创建的资源文件拖入到这个文件夹下,然后重新在终端中输入命令行: cd .../Example,然后pod install 再次查看会发现 Assets 文件夹与 classes 同时存在  
  #   'Test' => ['Test/Assets/*.png']
  # }
  # s.resource = ''  # 资源文件,单个
  # s.resources = '', '' # 资源文件,多个(含bundle)

  # s.public_header_files = 'Pod/Classes/**/*.h' # 公开头文件地址
  # s.frameworks = 'UIKit', 'MapKit' # 所需依赖的系统库文件,只能是系统库,多个用逗号隔开,如:s.frameworks = 'AVFoundation', 'CoreMotion', 'CoreMedia'
  # s.dependency 'AFNetworking', '~> 2.3' # 公共库中引入的其他依赖库,当在加载的时候也会一块把相关的依赖的库加载下来。注意:必须指定依赖库的版本,否则验证时会报错。每次只能引入一个依赖库,如果需要多个依赖库依次往下写即可,如:s.dependency 'AFNetworking',不能依赖未发布的库。
  # s.dependency 'SDWebImage' # 如果需要多个依赖库依次往下写即可

更多属性请参考Cocoapods-Podspec

  • 了解了.podspec文件中各种配置的作用,然后修改配置信息,主要需要修改的内容如下:
s.version          = '0.0.1'
s.summary          = '这是一个测试公共库!'
s.homepage         = 'https://github.com/JYanshao/JYTest0'
s.source           = { :git => 'https://github.com/JYanshao/JYTest0.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.source_files = 'JYTest0/Classes/**/*'
s.source_files = 'JYTest0/Classes/**/*.{h,m}' # 多个文件路径
s.dependency 依赖的第三方库
s.dependency 多个依赖的第三方库

注意:.podspec文件的结构是相对于公共库文件夹的

2)项目包含未发布至pod的第三方SDK、.a文件等的配置
s.vendored_libraries中加入依赖的和自己要发布的.a文件
s.vendored_libraries = 'Classes/xxxSDK.a','Classes/xxxV2.2.1.a'
s.vendored_frameworks中加入依赖的和自己要发布的.framework文件:
s.vendored_frameworks = 'Classes/xxx.framework', 'Classes/myself.framework'
.a库的特殊处理,因为s.vendored_libraries中引入的.a文件并不包含.a需要暴露出来的文件,所以需要在s.source_files中把要暴露的文件引用,注意相对目录,有图片资源的话处理方式相同

要发布至pod的自己的.a或者.framework其实和依赖的未发布至pod的三方库处理方式相同

3)配置修改完成后,cd 到Example文件夹下(即demo工程目录下),运行命令:

$ pod install

更新demo工程。更新成功后 Command+B 编译demo工程看有没有错误,若有错误及时修改,若错误未修改,则在之后的验证中会报错,通不过验证。
在demo工程中引入公共库(import JYTest0)测试是否可用,可以使用则说明没有问题。

6. 通过命令验证本地的.podspec文件

⚠️注意:在步骤操作之前,必须确保在GitHub上已经创建了对应的公共库

cd 到.podspec 所在的目录,运行以下命令进行验证:

$ pod lib lint JYTest0.podspec 或者直接 $ pod lib lint

验证过程中,发现出错了,是由于一个WARN导致的,错误如下图:
验证.podspec文件WARN错误1.png

仔细阅读这条警告,大致意思是:你没有指定使用的swift版本,验证器默认使用的是swift 3.2,可能会出现问题,希望你在验证期间指定Swift版本,请在podspec中添加“swift_version”属性。注意“--swift-version”参数或创建.swift-version隐藏文件的用法现在被弃用。

  • 解决方案1(推荐):警告中给出的解决方案,在.podspec 配置文件中添加“swift_version”属性( 这里的4.0是根据你使用的版本来指定的,不一定是4.0),完整的配置如下:
s.swift_version = '4.0'

然后再运行验证命令即可 。

  • 解决方案2(提示中说是被弃用了,但可以解决警告):在终端里cd 到你公共库.podspec文件目录下,创建.swift-version隐藏文件并指定swift版本号,运行以下命令:
$ echo "4.0" > .swift-version

然后再运行验证命令即可 。

  • 解决方案3(未试):如上图,在末尾也给出了其他解决的办法,就是在命令的后边加上“--allow-warnings”命令(即忽略警告),再运行即可解决。

  • 解决方案4(未试,提示中说是被弃用了,知道一下即可):在验证.podspec配置文件的命令后边指定swift版本,命令如下:

pod spec lint JYTest0.podspec --swift-version=4.0 –verbose

请注意: s.swift_version = '4.0' 和 echo "4.0" > .swift-version,这两个解决方案不要同时做 原因请看这篇文章

  • 我采用的是前两种方式解决了问题,验证.podspec文件成功,如下图:
    添加swift_version属性,验证.podspec配置文件成功.png
终端运行“echo "4.0" > .swift-version”命令,验证.podspec配置文件成功.png
  • 终端cd 到demo工程目录,运行$ pod install命令,更新demo工程的公共库和.podspec配置文件。

其他错误:由于导入公共库文件后,没有编译demo工程,不知道公共库文件中存在错误,导致验证失败,如下图:
导入的文件错误,导致验证失败.png

按照提示把错误的地方修改好,然后编译demo工程没有错误,再次验证即可。如果更改正确后,还出现这个错误,可尝试新建一个新的tag,然后再验证。

7. 将本地的模板工程提交到GitHub的空仓库

运行以下命令:

$ git add .
$ git commit -m '提交的描述'
$ git remote add origin git地址
$ git push -u origin master
提交公共库到GitHub上的空仓路1.png
提交公共库到GitHub上的空仓路2.png
  • 为GitHub上的公共库添加tag,命令如下:
$ git tag 0.0.1
$ git push --tag 

为公共库指定tag.png

注意:tag的版本必须和.podspec配置文件中的s.version = '0.0.1'的版本保持一致。

8. 通过命令验证GitHub上公共库的.podspec文件

注意:在此步骤操作之前,必须确保已经把本地的模板工程已经提交到GitHub上的空仓库了

  • cd 到.podspec 所在的目录,运行以下命令进行验证:
$ pod spec lint JYTest0.podspec 或者直接 $ pod spec lint

⚠️注意:该验证必须确定已经把本地工程提交到GitHub的空仓库了。否则会报如下错误:

未提交本地工程到git仓库,执行spec验证,报错.png

  • 提交工程到GitHub上,再验证,验证成功,如下图:
    验证.podspec配置文件成功.png
  • 验证过程中遇到的错误:
    错误1:报[!] Unable to find a spec namedJYTest0.podspec'.`错误,说明你所在的目录非.podspec配置文件的目录。

错误2:如下图:

spec验证问题2.png
该问题是由于我的.podspec配置文件中有一个不符合要求,需要进行修改,即s.source_files = 'JYTest0/Classes/**/*'路径配置错误导致的,修改路径为s.source_files = 'JYTest0/Classes/*.swift',然后提交到GitHub的公共库,再运行验证命令即可。如果更改为正确路径后,还出现这个错误,可尝试新建一个新的tag,然后再验证。

9. 提交pod 到Specs仓库(提交.podspec文件至pod库)
  • 以上步骤都正确后,可以进行pod库的提交,运行如下命令:
$ pod trunk push Test.podspec
  • 提交成功,如下图:
    提交pod到Specs仓库成功.png
  • 提交过程中可能遇到的问题:
    问题1:报[!] The specified pathTest.podspecdoes not point to an existing podspec file.错误,说明你所在的目录非.podspec配置文件的目录。

问题2:如下图:

需要先注册个pod账号问题.png
这个由于我们之前没有pod账号,所以提交的时候提示你,让你先注册个trunk账号。
运行以下命令注册trunk账号(参见trunk命令):

$ pod trunk register 你的邮箱 用户名 --description='描述内容' (描述可省略)
注册pod账号.png

邮箱验证成功后,运行一下命令:

$ pod trunk me

确定注册的信息是否通过验证。验证通过输出信息如下:

  • Name: 名称
  • Email: 邮箱(GitHub账号)
  • Since: August 2nd, 2018 19:27
  • Pods:
  • Test0
  • JYTest0
  • Sessions:

问题3:已存在重名的公共库问题,如下图:
提交pod到Specs,报名字已被占用的提示.png

这个错误貌似只能重新走一遍流程了。

问题4:如下图:
更新本地repo.png

由于本地的master的repo还没有我们的公共库,所以需要先更新一下,再提交。更新命令如下:

$ pod repo update --verbose
10. 通过pod命令搜索自己制作的公共库
  • 运行一下命令,搜索自己制作的公共库
$ pod search JYTest0 (不区分大小写)

运行命令后,却没有搜索到我的公共库,提示信息如下图:
搜索不到公共库,提示信息.png

提示信息表明:[!]无法找到名称、作者、摘要或描述与“JYTest0”匹配的pod。

对于有些类库确实是在Cocoapods中所不存在的,为了确定我们搜索的库是不是真的在Cocoapods的Repos中存在,我们可以到https://cocoapods.org/中进行搜索。

  • 解决方案1:
    1)在终端运行pod setup命令,运行结果如下图所示,说明执行成功:
    运行pod setup命令结果.png
    再次进行搜索操作,但结果还是找不到我的公共库,还是提示:[!] Unable to find a pod with name, author, summary, or description matching JYTest0

2)可能是由于pods库没更新导致的,那么需要运行$ pod repo update --verbose命令更新下本地的repo,然后后再次进行搜索操作,但结果还是找不到我的公共库,还是那个提示,那就继续探索吧。

  • 解决方案2:pod setup成功后,会在/Library/Caches/CocoaPods/目录下生成一个search_index.json文件,那么删除这个文件试试,前往/Library/Caches/CocoaPods/文件夹删除search_index.json文件,或者通过rm命令:$ rm ~/Library/Caches/CocoaPods/search_index.json,删除成功后,再次运行搜索pod库命令,就可以搜索到公共库了。

搜索结果:
搜索结果.png






参考文章:

iOS SDK制作上传Pods的repo公共库管理包含.framework和.a,.png文件等
iOS 使用Cocoapods创建/管理自己的公共库傻瓜教学
cocoapods 创建公开公共库
验证.podspec文件时关于swift version的警告问题
pod 私有库 swift_version问题
在github上传项目遇到的问题(error: failed to push some refs to 'https://github.com/CrazyDony/text.git')
[Cocoapods]项目添加Cocoapods支持遇到的坑
Cocoapods: pod search无法搜索到类库的解决办法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容