将自己封装的库上传至Pod的repo存储库。
1. 需要准备的东西
- GitHub、trunk账号(后面会提到如何注册)
- 有的还需要配置和管理.ssh账号
- 下载Sourcetree管理自己的公共库(需要注册Sourcetree账号),或者通过终端命令进行管理
2. 在GitHub上创建一个空的仓库
-
新建Repository,如下图:
3. 通过终端命令创建本地工程
1)打开终端,通过cd 命令进入到目标文件夹下,我这里是进入桌面的PublicRepository文件夹
$ cd Desktop/PublicRepository/
2)通过pod命令查询一下你起的工程名是否已被占用,若已被占用必须重新起名,因为pod要求库名不能重复,否则到最后一步由于工程名被占用,提交通不过,就得重来一遍了。
$ pod search 工程名
结果如下图:无法找到名称、作者、摘要或描述与“JYTest0”匹配的pod,说明起的工程名在pod中未被占用。
3)通过pod命令创建模板工程
$ pod lib create 工程名
注意:执行此命令后,Cocoapods会自动帮我们创建README文件和MIT LICENSE协议文件
-
命令运行后有些配置项需要配置下,如下图:
填写完成后,将自动创建demo应用程序,并自动运行pod install命令安装下载JYTest0公共库,下载完成后,自动打开demo应用程序。
- 预览demo工程,工程结构如下图:
4. 添加公共库文件到Classes文件夹中,资源文件添加到Assets文件夹中
-
在Xcode打开的demo工程中,选中ReplaceMe.swift文件,右键Show in Finder,打开Classes文件夹,将自己的公共库文件添加到Classes文件夹中,并将无用的ReplaceMe.swift文件删除。目录结构如下图:
切记:不要直接将公共库文件拖到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导致的,错误如下图:仔细阅读这条警告,大致意思是:你没有指定使用的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文件成功,如下图:
- 终端cd 到demo工程目录,运行
$ pod install
命令,更新demo工程的公共库和.podspec配置文件。
按照提示把错误的地方修改好,然后编译demo工程没有错误,再次验证即可。如果更改正确后,还出现这个错误,可尝试新建一个新的tag,然后再验证。
7. 将本地的模板工程提交到GitHub的空仓库
运行以下命令:
$ git add .
$ git commit -m '提交的描述'
$ git remote add origin git地址
$ git push -u origin master
- 为GitHub上的公共库添加tag,命令如下:
$ git tag 0.0.1
$ git push --tag
注意:
tag的版本必须和.podspec配置文件中的s.version = '0.0.1'
的版本保持一致。
8. 通过命令验证GitHub上公共库的.podspec文件
注意:
在此步骤操作之前,必须确保已经把本地的模板工程已经提交到GitHub上的空仓库了
- cd 到.podspec 所在的目录,运行以下命令进行验证:
$ pod spec lint JYTest0.podspec 或者直接 $ pod spec lint
⚠️注意:
该验证必须确定已经把本地工程提交到GitHub的空仓库了。否则会报如下错误:
-
提交工程到GitHub上,再验证,验证成功,如下图:
验证过程中遇到的错误:
错误1:报[!] Unable to find a spec named
JYTest0.podspec'.`错误,说明你所在的目录非.podspec配置文件的目录。
错误2:如下图:
s.source_files = 'JYTest0/Classes/**/*'
路径配置错误导致的,修改路径为s.source_files = 'JYTest0/Classes/*.swift'
,然后提交到GitHub的公共库,再运行验证命令即可。如果更改为正确路径后,还出现这个错误,可尝试新建一个新的tag,然后再验证。
9. 提交pod 到Specs仓库(提交.podspec文件至pod库)
- 以上步骤都正确后,可以进行pod库的提交,运行如下命令:
$ pod trunk push Test.podspec
-
提交成功,如下图:
提交过程中可能遇到的问题:
问题1:报[!] The specified path
Test.podspecdoes not point to an existing podspec file.
错误,说明你所在的目录非.podspec配置文件的目录。
问题2:如下图:
运行以下命令注册trunk账号(参见trunk命令):
$ pod trunk register 你的邮箱 用户名 --description='描述内容' (描述可省略)
邮箱验证成功后,运行一下命令:
$ pod trunk me
确定注册的信息是否通过验证。验证通过输出信息如下:
问题3:已存在重名的公共库问题,如下图:
- Name: 名称
- Email: 邮箱(GitHub账号)
- Since: August 2nd, 2018 19:27
- Pods:
- Test0
- JYTest0
- Sessions:
这个错误貌似只能重新走一遍流程了。
问题4:如下图:由于本地的master的repo还没有我们的公共库,所以需要先更新一下,再提交。更新命令如下:
$ pod repo update --verbose
10. 通过pod命令搜索自己制作的公共库
- 运行一下命令,搜索自己制作的公共库
$ pod search JYTest0 (不区分大小写)
运行命令后,却没有搜索到我的公共库,提示信息如下图:提示信息表明:[!]无法找到名称、作者、摘要或描述与“JYTest0”匹配的pod。
对于有些类库确实是在Cocoapods中所不存在的,为了确定我们搜索的库是不是真的在Cocoapods的Repos中存在,我们可以到https://cocoapods.org/中进行搜索。
- 解决方案1:
1)在终端运行pod setup
命令,运行结果如下图所示,说明执行成功: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库命令,就可以搜索到公共库了。
参考文章:
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无法搜索到类库的解决办法