需求
由于公司项目需要,想把目前项目中,每个模块作为相对独立的组件,已达到合理分工的目的,同时,利用cocoapods实现组件化开发,可以很好的达到版本控制,提高编译效率。
1)首先对现有模块进行拆分,分为:业务组件、基础依赖组件、自定义UI组件、支付组件、启动服务组件、登录首页组件等。
2)其次需要搭建私有的Spec库,用来管理每个组件的podspec文件。拆分的模块作为私有Pod上传至私有Spec仓库、提交私有Pod和更新私有Pod.
具体操作流程如下
创建一个新的组件库流程如下:
具体操作流程截图啦
我现在想创建一个Launch组件库,它的功能描述是:这个组件库里面的功能主要是用于项目的启动服务。
比如:第三方组件服务的注册、推送服务的注册、bugly服务注册、token失效回调注册、版本检测升级、键盘启动服务。
第一步 执行pod lib create apple-app-launch 命令(这个名字自己起,能够说明组件目的即可)
此时完成到这里面就已经创建好一个组件库了。
第二步
通过github,gitlab 或者其他代码管理工具上建立空的cocoapods 的索引库(索引库就是普通的代码仓库)
已建立好的地址如下:
管理组件代码的库
https://code.sqbj.info/apple-ios/apple-app-launch.git
代码管理仓库 管理spec文件的私有仓库
https://code.sqbj.info/apple-ios/apple-cocoapods-spec.git
私有 Spec 仓库和 CocoaPods 官方结构一致,用于存放各个开源库的 spec 文件。安装 CocoaPods 是会将官方库 clone 至本地,当执行 pod update 时更新此本地仓库。
私有 Spec 仓库需要在 git 托管平台托管,现有的免费私有仓库有 Coding、CSDN 以及自己搭建 Gitlab,我用的是公司自己搭建的Gitlab为例。
第三步
打开刚刚创建好的项目。目录接口如下
下面我们来修改一下.podspec文件
保存之后,我们的准备工作就基本上完事了,下面要做的就是
1、验证pod库是否可用 pod lib lint
2、验证远程库 pod spec lint
2、添加远端仓库和提交到远端的操作了。具体操作如下:
接下来讲解一下每行代码的含义
s.name:名称,pod search 搜索的关键词,注意这里一定要和.podspec的名称一样,否则报错
s.version:版本号
s.ios.deployment_target:支持的pod最低版本
s.summary: 简介
s.homepage:项目主页地址
s.license:许可证
s.author:作者
s.social_media_url:社交网址,这里我写的微博默认是Twitter,如果你写Twitter的话,你的podspec发布成功后会@你
s.source:项目的地址
s.source_files:需要包含的源文件
s.resources: 资源文件
s.requires_arc: 是否支持ARC
s.dependency:依赖库,不能依赖未发布的库
s.dependency:依赖库,如有多个可以这样写
例如
s.dependency = 'AFNetworking'
> s.license= { :type => "MIT", :file => "LICENSE" }
> 这里建议大家这样写,如果写别的会报警告,导致后面一直提交失败.
* source_files:写法及含义建议
大家写第一种或者第二种
"YJSettingTableView/*"
"YJSettingTableView/YJSettingTableView/*.{h,m}"
"YJSettingTableView/**/*.h"
* “*” 表示匹配所有文件
* “*.{h,m}” 表示匹配所有以.h和.m结尾的文件
* “**” 表示匹配所有子目录
* **s.source 常见写法**
s.source = { :git => "https://github.com/coderYJ/YJSettingTableView.git", :commit => "68defea" }
s.source = { :git => "https://github.com/coderYJ/YJSettingTableView.git", :tag => 1.0.0 }
s.source = { :git => "https://github.com/coderYJ/YJSettingTableView.git", :tag => s.version }
* commit => "68defea" 表示将这个Pod版本与Git仓库中某个commit绑定
* tag => 1.0.0 表示将这个Pod版本与Git仓库中某个版本的comit绑定
* tag => s.version 表示将这个Pod版本与Git仓库中相同版本的comit绑定
##### ③.创建LICENSE(许可证/授权)文件,此文件必须要有
创建一个文件名字命名为LICENSE,内容为:只需要把前面的版权改一下就行了,后面的都一样
> Copyright (c) 2011-2016 YJSettingTableView Software Foundation (https://github.com/coderYJ/YJSettingTableView/)Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, 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 INTHE SOFTWARE.
##### ④.上传到Git
将包含配置好的 .podspec, LICENSE 的项目提交 Git
##### ⑤.打tag
> 因为cocoapods是依赖tag版本的,所以必须打tag,以后再次更新只需要把你的项目打一个tag然后修改.podspec文件中的版本接着提交到cocoapods官方就可以了,提交命令请看下面
执行命令//
```为git打tag, 第一次需要在前面加一个vgit tag "v1.0.0"
//将tag推送到远程仓库
git push --tags```
7.验证.podspec文件
* 到此检查一下你工程下面的文件, 你的项目, .podspec文件, LICENSE文件
* 验证会先测试本地 .podspec 文件是否存在语法错误.![](http://upload-images.jianshu.io/upload_images/2384741-992f55282e8aaf21.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)文件目录
然后执行命令
// --verbose 如果验证失败会报错误信息
pod spec lint UIButton-Vertical.podspec --verbose
验证过程中:
-> UIButton-Vertical
验证成功后:UIButton-Vertical.podspec passed validation.
![](http://upload-images.jianshu.io/upload_images/2384741-bdfe04539dbb6fbd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)如图
验证失败:[!] The spec did not pass validation, due to 1 error.
这个过程会出现很多错误,这里不一一列举,大家按照错误信息自行修改,不过一般不会出现错误,只要你按照军哥说的做,基本上是没有问题的,因为军哥走过的坑已经告诉你们了
#### 4.本地测试podspec文件
我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。 在Podfile中我们可以这样编辑,有两种方式
platform :ios, '7.0'
pod 'UIButton-Vertical', :path => '~/code/Cocoapods/podTest/UIButton-Vertical' #指定路径
pod 'UIButton-Vertical', :podspec => '~/Desktop/lizhi0123Github/UIButton-Vertical/UIButton-Vertical.podspec' #指定podspec文件
然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/PodTestLibrary中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。
在项目中编写代码,测试库文件无误后就可以开始下一步了,提交podspec到Spec Repo中。
#### 5.向Spec Repo提交podspec
向Spec Repo提交podspec需要完成两点一个是podspec必须通过验证无误,在一个就是删掉无用的注释(这个不是必须的,为了规范还是删掉吧)。 向我们的私有Spec Repo提交podspec只需要一个命令
$ pod repo push Specs-Repo UIButton-Vertical.podspec #前面是本地Repo名字 后面是podspec名字
完成之后这个组件库就添加到我们的私有Spec Repo中了,可以进入到~/.cocoapods/repos/Specs-Repo目录下查看
> ├── LICENSE
> ├── UIButton-Vertical
> │ └── 0.1.0
> │ └── UIButton-Vertical.podspec
> └── README.md
再去看我们的Spec Repo远端仓库,也有了一次提交,这个podspec也已经被Push上去了。
至此,我们的这个组件库就已经制作添加完成了,使用pod search命令就可以查到我们自己的库了
$ pod search UIButton-Vertical
-> UIButton-Vertical (0.1.0)
Just Testing.
pod
'UIButton-Vertical'
,
'~> 0.1.0'
- Homepage: https:
//coding.net/u/wtlucky/p/podTestLibrary
- Source: https:
//coding.net/wtlucky/podTestLibrary.git
- Versions: 0.1.0 [WTSpecs repo]
这里说的是添加到私有的Repo,如果要添加到Cocoapods的官方库了,可以使用trunk工具,具体可以查看[官方文档](http://guides.cocoapods.org/making/getting-setup-with-trunk.html)。
#### 6. 使用制作好的Pod
在完成这一系列步骤之后,我们就可以在正式项目中使用这个私有的Pod了只需要在项目的Podfile里增加以下一行代码即可
每次提交组件库的podspec文件具体操作流程
Pod 提交
打tag
git tag
git tag -m "获取用户的租户的应用是否存在(pass)" 0.2.20
git push origin --tags
172-11-0-189:smart-app-fmp hnbl008$
cd .. 退到上一个目录
##把库文件smart-app-fmp.podspec添加到 Specs-Repo 私有库中 这个过程非常久,也非常重要哦
pod repo push scbu smart-app-fmp.podspec --allow-warnings --verbose --use-libraries
第四步
使用组件库
1.新建一个项目,在podfire文件中指定资源地址:
https://code.sqbj.info/apple-ios/apple-cocoapods-spec.git
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
source 'https://code.sqbj.info/apple-ios/apple-cocoapods-spec.git'
target 'apple-app-shell'do
pod 'apple-app-launch'
end
必须写source要不然search的时候找不到cocoapods里的库
然后执行pod update
,更新库依赖,然后打开项目可以看到,我们自己的库文件已经出现在Pods子项目中的Pods子目录下了。
pod update 更新所有的库,然后再执行 pod search 时 就会显示 你自己建的库。
更新 Pod
如果在开发过程中发现某基础组件存在 bug 需要更新 Pod,具体操作步骤如下:
1、修改 podspec 文件中的 s.version;
2、修复 bug 并对项目打 tag,tag 名称和 s.version 一直并 push 到远程仓库。
3、验证 podspec 文件的有效性;
4、推送 podspec 文件到远程仓库;
5、执行 pod search apple-app-launch 验证结果;
参考文献
- Private Pods
- The Podfile
- 利用Pod进行组件化开发
- 私有库管理和模块化管理
- 基于 CocoaPods 和 Git 的 iOS 工程组件化实践
6、手动创建podspec文件到发布过程遇到的问题