使用Cocoapods为模块化创建私有pods笔记
学习新知识必然是一个踩坑的过程,这两天看了下pod私有库的创建,总体来说还是比较简单的,但是中间踩了一个坑,也不能说是坑吧,只是自己技术不扎实,花了两个下午才完全熟练。
私有库的创建网上教程很多,但是对于基础知识欠缺而且专业名词知道的甚少的我来说还是有很大的困难的,所以记录一下,毕竟我的记性那么不好
创建一个私有的podspec包括如下那么几个步骤:
1.创建一个私有的Spec Repo。
2.创建Pod的所需要的项目工程文件,并且有可访问的项目版本git地址。
3.创建并修改Pod所对应的podspec文件。
4.本地测试配置好的podspec文件是否可用。
5.提交项目和podspec配置到Git仓库,并打标签。
6.向私有的Spec Repo中提交podspec。
7.在个人项目中的Podfile中增加刚刚制作的好的Pod并使用。
8.更新维护podspec。
整体流程就是这8个步骤,其中前7个步骤是开始,第8个步骤是使用更新,毕竟我们的库也不是写好后就不会更改的
1创建一个私有的Spec Repo
这里叫做创建一个私有的
仓库源
或者仓库列表
,或者直接叫做仓库
,或者是叫索引
。
Spec Repo
是Pods
的仓库列表,我们pod install
或者pod update
的时候会从仓库列表中查找当前最新的版本,然后进行下载更新。如果我们要做私有库,就不能放在官方的仓库列表中,所以要创建一个私有的仓库列表,来存放我们私有库的列表。
如果你使用过pod,本地会有一个仓库列表,每次pod install
或者pod update
会对仓库列表进行更新。在~/.cocoapods/repos
目录下,master就是官方的仓库列表,里面的都是开源的,我们通过pod search XXX
命令就可以搜索到这些开源库
比如pod search 1210
,可能是某个同学写的私有库的测试小demo,这里建议大家不要随便往共用仓库列表里面添加无用的开源库,这个仓库列表可是分发到全世界的!
进入正题,创建一个私有Spec Repo
,私有仓库列表就是一个普通的空的git仓库(后面会添加内容的),在你们的git服务器上面创建一个新的仓库就行,不需要里面有任何文件,然后你可以拿到你的git仓库的一个地址,比如我coding网站上面创建一个名字为DDSpecs
的仓库,git地址是:https://coding.net/Yasin/DDSpecs.git
(你是访问不通的),然后在终端下执行命令,将新创建的私有仓库添加到本地Pods
里面,这样就相当于使用pod的时候多了一个仓库列表,多了一个数据源。
$ pod repo add DDSpecs https://coding.net/Yasin/DDSpecs.git
这个命令可能会进行一些账号的验证,成功后就像上图1里面一样会多一个pod仓库列表。现在可以看到DDSpecs文件夹下面是空的,这是正常的,因为是一个全新的仓库列表。添加公司已有的仓库列表也是这个命令,但是里面可能会有私有库列表。
2创建Pod的所需要的项目工程文件,并且有可访问的项目版本git地址
这个步骤的目的:创建我们的模块项目(一般是一个可运行的demo,个别比较特殊的只有模块的文件),把模块的文件按照真实文件夹放好,并且上传到git服务器,得到git地址。(附带可以在这一步创建后面所需要的
podspec
文件和license
文件)
这里我们也需要模块项目的git地址,这个地址是下载代码用的,可能你的模块已经创建好了git,也可能没有,这都不重要,重要的是要有一个代码的git地址。
这里提供三个方法,自己选择喜欢合适的就行了:
- 使用命令创建一个新的项目工程
找到一个存放项目的文件夹,输入下面的命令
$ pod lib create UserModelDemo
POD私有3
这里会创建一个名为UserModelDemo的项目,里面包含了我们下面要用到的
podspec
文件和license
文件,可以对项目进行修改,变成我们想要的样子。
- 使用命令接入已有的模块项目
找到一个存放项目的文件夹,输入下面的命令
$ pod spec create PodTestLibrary git@coding.net:Yasin/UserModelDemo.git
这个命令我没有试过,留个坑给大家吧。应该也会创建podspec
文件和license
文件
- 正常手动创建一个项目
就是平常我们创建项目的流程,创建一个普通的项目,或者说是已有的,然后修改成我们需要的样子。
这三种方法都可以,关键是要有git地址,请再次确认我们这一步骤的目的达到了。真实文件夹存放
、git地址
。
3创建并修改Pod所对应的podspec文件
上面第二步可能已经创建好了
podspec
文件和license
文件,也可能没有,这一步重点介绍一下这两个文件。
podspec
文件是pods私有库的描述文件,是Ruby格式的,里面包含了下载地址,私有库的版本等信息。没有的可以创建一个,比如“DDUserModel.podspec”
Pod::Spec.new do |s|
s.name = "DDUserModel" #私有库名称
s.version = "1.0.0" #版本号
s.summary = "Just Testing." #简短介绍,下面是详细介绍
s.description = <<-DESC
Testing Private Podspec.
* Markdown format.
* Don't worry about the indent, we strip it!
DESC
s.homepage = "https://coding.net/Yasin/UserModelDemo"
#主页,这里要填写可以访问到的地址,不然验证不通过
# s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" #截图
s.license = { :type => 'MIT', :file => 'LICENSE' } #开源协议
s.author = { 'Yasin' => 'yasinzhou@foxmail.com' } #作者信息
s.source = { :git => "https://coding.net/Yasin/UserModelDemo.git", :tag => s.version.to_s }
#项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
# s.social_media_url = 'https://twitter.com/<twitter_username>' #多媒体介绍地址
s.platform = :ios, '7.0' #支持的平台及版本
s.requires_arc = true #是否使用ARC,如果指定具体文件,则具体的问题使用ARC
s.source_files = 'Pod/Classes/**/*'
#代码源文件地址,**/*表示Classes目录及其子目录下所有文件,
#如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
s.resource_bundles = {
'PodTestLibrary' => ['Pod/Assets/*.png']
} #资源文件地址
s.public_header_files = 'Pod/Classes/**/*.h' #公开头文件地址
s.frameworks = 'UIKit' #所需的framework,多个用逗号隔开
s.dependency 'AFNetworking', '~> 2.3'
#依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency
end
这个文件基本上就这些内容,可以下载几个开源库(不是pod安装,而是直接去下载带有demo的项目库)对照参考一下,加深理解。我也是看了好几个开源库的才看懂的。
license
文件就是上面描述文件里面提到的开源协议,是一个文本文件,直接拷贝一份,修改一下里面的年份和作者信息就行了,命名为“LICENSE”,没有后缀
Copyright (c) 2016 Yasin <yasinzhou@foxmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
4本地测试配置好的podspec文件是否可用
测试一下
podspec
文件是否书写正确
这一步只是简单的测试一下是否有格式错误,使用命令
$ pod lib lint
如果有错误根据提示修改就好了,一般来说问题不大
5提交项目和podspec配置到Git仓库,并打标签
将没有错误的项目上传到git,和podspec
文件和license
文件一起上传。
上面的podspec
文件中提到一个版本号,这个是git仓库标签,打标签的方法就不说了,不会的查一下吧,这里需要注意的是打标签需要推送到远端
这个版本号和xcode中的那个版本没有联系的,不过一般为了查看方便,会修改为一致。
其他的也没有什么了
6向私有的Spec Repo中提交podspec
完成这一步就可以使用
pod install
命令进行安装了
只有将podspec
文件提交到仓库列表后才能像平常一样使用pods安装管理,不过因为是私有的仓库列表,换台机器要重新添加仓库列表
$ pod repo push DDSpecs DDUserModel.podspec #前面是本地Repo名字 后面是podspec文件
这一步可能也会报错,比如你的项目地址不能访问啦、没有开源协议啦、git远程仓库没有打标签啦...等等,如果报错根据提示修改,修改之后从步骤5重新走一下,要修改版本号和重新打标签,或者你可以把原来的标签删了,再加在最新的节点上,但是一般不建议这样做。
这个地方感觉挺麻烦的,不知道是不是我理解的有问题,有理解更好的可以交流一下,大家都是一起学习的嘛😄
7在个人项目中的Podfile中增加刚刚制作的好的Pod并使用
完成后可以新建一个工程,就像使用普通pod库一样试验一下
这里再说一个坑:swift的类和成员变量在pod里面都是私有的😂,所以在定义可以给外面引用的类和成员变量的时候要加上public属性,不然你会看到文件pod下来了,但是引用类和成员变量的时候会提示找不到。我艹了,当时在这个地方卡了一个下午,各种配置都是对的,就是引用不了,试了各种方法,后来才发现是权限的问题😂,只能说自己好傻,基础知识太欠啊
8更新维护podspec
私有库也是会更新的,基本上都是把更新后的内容push到远端git服务器,然后重走5和6的步骤,重新打标签,重新推送到pod仓库列表,然后在项目里面pod install
或者pod update
总结
首先有几个疑问:
1.模块化如果使用pods私有库的话,那每次修改岂不是都要更新维护podspec?特别是在改BUG的时候,那种是不是太痛苦?
2.感觉模块化pods私有库更适合大一点的团队使用,每个人负责一个私有库的维护,如果是一两个人,每个模块一个pods私有库,那是不是太痛苦?
另外说一下如果pod私有库有依赖关系的话,上传git服务器的时候可以对依赖库进行忽略。
如果是使用SourceTree可以在设置-高级里面添加忽略路径,比如/Example/Pods
,更多更高级的用法可以更深入的学习哈