2、教你一步步用CocoaPods创建远程私有库
上一章介绍了1、教你一步步用CocoaPods创建远程公有库,应该对远程的公有库的上传和下载步骤有了一个大致的了解了。
随着我们的业务的增多,我们的app数量可能会增加,复用相关的模块代码这个时候就变得更迫切<工具类,网络请求类等>。所以我们就可以把我们之前的app中使用到的封装的相关的类提取出来放到多个app中使用,但是分散到多个app中维护起来还是比较麻烦的,以后涉及到统一的维护,统一的升级,一个个去修改那就太麻烦了。而我们又不能将我们的代码上传到远程公开的库中用CocoaPods来进行维护,而这个时候需要使用私有仓库来保存我们的代码。
用CocoaPods创建远程私有库
对比CocoaPods创建远程公有库我们可以很快的上手用CocoaPods创建远程私有库原理大同小异。
主要相关的区别在图中已经标明。
1、D盛放索引列表的远程仓库不再是 CocoaPods的官方的spec列表仓库,而是我们自己的远程私有仓库。
2、B公开的代码不是放在公开的git上面的仓库上,而是放在我们自己的私有仓库中
3、我们要将我们的代码对应的.podspec文件上传到D我们的远程私有仓库索引列表中。
不要晕,这里有两个私有的远程仓库,一个是用来盛放我们的封装的代码的,另外一个是用来代替CocoaPods的. podspec仓库,盛放我们私有的. podspec文件的。
那么我们需要做的工作包括以下几点
1>、创建一个本地的仓库,将自己想要公开的代码搞进去。
2>、修改.podSpec描述文件中的相关的描述信息
3>、将自己的封装的代码上传到远程私有仓库中去
4>、创建一个远程私有仓库,用来扮演CocoaPods官方的索引库
5>、将当前本地的.podSpec文件传到创建的私有远程仓库<用来扮演CocoaPods官方的索引库>
6>、测试一下,有没有上传到私有远程仓库的索引库中
7>、后期的升级维护
具体的步骤如下所示:
1>、创建一个本地的仓库,将自己想要公开的代码搞进去。
1.1、到相关的目录下面创建一个pod模板,终端执行下面的命令:
pod lib create DownLoader
之后他会问你五个问题,
1、选择语言
2、是否需要一个例子工程;
3、选择一个测试框架;
4、是否基于View测试;
5、类的前缀;
这几个问题的具体介绍可以去看官方文档,问完这5个问题他会自动执行pod install命令创建项目并生成依赖。
pod lib create DownLoader
Cloning `https://github.com/CocoaPods/pod-template.git` into `DownLoader`.
Configuring DownLoader template.
------------------------------
To get you started we need to ask a few questions, this should only take a minute.
If this is your first time we recommend running through with the guide:
- http://guides.cocoapods.org/making/using-pod-lib-create.html
( hold cmd and click links to open in a browser. )
What language do you want to use?? [ Swift / ObjC ]
> ObjC
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> Specta
Would you like to do view based testing? [ Yes / No ]
> Yes
What is your class prefix?
> ZY
Running pod install on your new library.
Analyzing dependencies
Fetching podspec for `DownLoader` from `../`
Downloading dependencies
生成的项目,自动生成一个仓库,测试Demo集成了CocoaPods,以及创建好了相关的####.podspec描述文件
1.2、将自己要封装的代码放到下面的目录,并且删除ReplaceMe.m
1.3、这个时候我们的自动生成的测试项目中是看不到我们刚刚放到Classes目录下面的东西的。需要执行一下Example下面的Podfile文件。
image.png
执行完毕之后打开Example项目
image.png
可以在这其中进行相关的调试,来修改我们准备封装的代码。因为 image.png
发现对应的是这个路径下的代码
image.png调试完毕,确认准备封装的代码没有bug,进行下一步。
2>、修改.podSpec描述文件中的相关的描述信息
详情可参考CocoaPods的官网的PodSpec语法.podspec可以选择使用Xcode进行打开修改
2.1、这里面主要注意这么几个地方就可以了
Pod::Spec.new do |s|
# 项目的名称
s.name = 'DownLoader'
# 项目的版本号,通过项目git的tag标签进行对应,这里的标签代表的版本
s.version = '0.1.0'
# 项目简单的描述信息
s.summary = '简单的下载器'
# 项目的详细描述信息,注意,这里的文字的长度,一定要比上面的s.summary长,不然会认为格式不合格
s.description = <<-DESC
简单的下载器,支持断点下载
DESC
# 项目的网页主页信息,这里可以直接写自己的远程仓库的主页的地址
s.homepage = 'https://coding.net/u/*******/p/DownLoader'
# 截图
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
# 开源协议
s.license = { :type => 'MIT', :file => 'LICENSE' }
# 作者信息
s.author = { 'zy_ios@163.com' => 'zy_ios@163.com' }
# 这个比较重要,指的就是git的对应的远程仓库的地址以及版本号,版本号直接获取的是上面的s.version
# 项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
s.source = { :git => 'https://git.coding.net/*******/DownLoader.git', :tag => s.version.to_s }
# 多媒体介绍地址
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
# 支持的平台及版本
s.ios.deployment_target = '8.0'
# 代码源文件地址,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
s.source_files = 'DownLoader/Classes/**/*'
# 资源文件地址
# s.resource_bundles = {
# 'DownLoader' => ['DownLoader/Assets/*.png']
# }
# 公开头文件地址
# s.public_header_files = 'Pod/Classes/**/*.h'
# 所需的framework,多个用逗号隔开
s.frameworks = 'UIKit'
# 依赖关系,该项目所依赖的其他,当在加载的时候也会一块把相关的依赖的库加载下来,如果有多个需要填写多个
# s.dependency 'AFNetworking', '~> 2.3'
# s.dependency 'YYModel'
# 是否使用ARC,如果指定具体文件,则具体的问题使用ARC
s.requires_arc = true
end
2.2、修改完毕之后进行检验一下.podspec的格式有木有问题
pod lib lint
通过
image.png
具体的错误原因可以根据相关的提示进行修改,但是有的时候没有错误,有的是一堆的警告,如下所示:
image.png
换一种检验的方式,忽略所有的警告进行格式的检验
pod lib lint --allow-warnings
3>、将自己的代码上传到远程私有仓库中去
3.1、创建一个远程私有仓库,远程私有仓库可以选择
bitbucket或者 Coding,我这里选择Coding
3.2、创建完远程私有仓库,将本地的仓库和远程创建的私有远程仓库绑定
git remote add origin https://git.coding.net/WANG19931123/DownLoader.git
git remote
git push origin master
当我们 git push origin master的时候尴尬了,报错了。
具体的原因是:
因为我之前使用的是bitbucket的代码管理平台,同样都是git,用户名和密码都被记在了本地,所以当执行push操作的时候会导致默认使用bitbucket的用户名和密码为了不和bitbucket冲突,这里我们使用ssh进行验证。
首先
创建一对公钥私钥
然后将创建的公钥传到我们的私有仓库设置中,私钥留在本地。 image.png
使用SSH的方式访问仓库
image.png
将当前的本地仓库的东西上传到远程私有仓库。
3.3、给当前代码打一个tag标签,然后push到远程仓库
注意的是,打的标签一定要和当前的. podspec文件对应
image.png
4>、创建一个远程私有仓库,用来扮演CocoaPods官方的索引库
4.1、在Coding创建私有仓库
4.2、将当前的远程仓库,同步到本地
终端运行如下命令
pod repo
可以看到当前所有的spec对应的本地仓库,可以看到他们的本地路径和远程url各自对应的是啥。
image.png
进入如下路径:
image.png将刚刚创建的远程仓库,clone到repos下面,和master同级。
这里同样还是使用SSH 方式访问仓库,
创建一对公钥私钥。
git clone git@git.coding.net:WANG19931123/PrivateSpecsGather.git
5>、将当前本地的.podSpec文件传到创建的私有远程仓库<用来扮演CocoaPods官方的索引库>
5.1、到.podspec文件的目录下面
5.1.1、首先先检测一下.podspec的远程仓库是不是可以用
pod spec lint
image.png
发现报错了。又是一个坑。
为啥会报错呢?因为上面我们就写明原因了。
因为我之前使用的是bitbucket的代码管理平台,同样都是git,用户名和密码都被记在了本地,所以当对coding私有仓库的操作的时候,导致默认使用bitbucket的用户名和密码。
虽然我们的测试项目通过SSH进行远程仓库的操作<push或者pull>,但是.podspec里面的source的git地址还是不行,并且source的git地址不支持SSH格式。
所以,我们还是不能逃避问题,还是得用http格式操作git仓库,不能使用SSH方式来操作。
解决这个git的多帐号密码冲突的问题,参考
我选用的是第一种方法,因为第二种方法,没有成功,如果你知道,记得告诉我。直接修改.podspec的地址形式为
s.source = { :git => 'http://yourname:password@git.oschina.net/name/project.git', :tag => s.version.to_s }
再次执行
pod spec lint
运行通过
image.png
5.1.2、将当前本地的.podSpec文件传到创建的私有远程仓库
检查当前所有的spec文件夹
pod repo
image.png
pod repo push PrivateSpecsGather DownLoader.podspec --allow-warnings
image.png
6>、测试一下,有没有上传到私有远程仓库的索引库中
image.png
检测一下查询结果
pod search DownLoader
image.png
找一个继承了CocoaPods的项目,进行更新操作,失败了
image.png失败的原因是因为,找不到我们的downloader的描述文件的位置。
因为我们没有指定相关的source地址,具体的修改操作见下图
image.png
可是这个时候,我们去更新一个AFNetWorking试一下,失败了。
image.png
原因是,因为AFNetWorking的位置是CocoaPods的公开spec仓库中的,而我们上面仅仅只是指定下面的pods的来源是我们自己私有的仓库,所以,需要添加上CocoaPods的公开spec仓库的git地址。
PS:Podfile文件上面不指定Source,默认就是CocoaPods的公开spec仓库的git地址
这样配置就好了
source 'git@git.coding.net:WANG19931123/PrivateSpecsGather.git'
source 'https://github.com/CocoaPods/Specs.git'
target 'PrivatePodsDemo' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for PrivatePodsDemo
pod 'DownLoader', '~> 0.1.0'
pod 'AFNetworking', '~> 3.1.0'
end
image.png
7>、后期的升级维护
7.1、后期先更新自己的本地私有库,更新完毕之后,推送到自己的远程私有仓库。
7.2、编辑对应的.podSpec文件,升级一个version,对应的,给最新的代码添加一个tag。当然了和对应的version对应。
7.3、推送到盛放私有spec的私有仓库
当然了,你想把你 封装的私有库给其他的小伙伴用,你至少得给别人权限,让别人能够访问你的两个私有库。
pod repo push $$$$ ####.podspec --allow-warnings
扩展:实现CocoaPods的subspec分支功能
扩展:使用CocoaPods集成的远程私有公有库如何使用图片资源
如有失误请各位路过大神即时指点,或有更好的做法,也请指点一二。在下不甚感激。