这篇有点乱,简洁版请点击CocoaPods建立私有仓库 spec repo 整理篇
介绍
好多项目里都有公共的组件,copy来,copy去很容易出错,而且不容易维护,所以就想到用用cocoapods 建自己的私有库,Carthage用法虽然相对简单,但是它是把公共组件都放在framework里不容易单步调试,所以我还是选择用Cocoapods 来建立私有仓库
参考使用Cocoapods创建私有podspec
用法
1. 创建私有Spec Repo
先来说第一步,什么是Spec Repo?它是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,它实际是一个Git仓库remote端在GitHub上,但是当你使用了Cocoapods后它会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到master文件夹就是这个官方的Spec Repo了。这个master目录的结构是这个样子的
├── Specs
└── [SPEC_NAME]
└── [VERSION]
└── [SPEC_NAME].podspec
因此我们需要创建一个类似于master的私有Spec Repo,这里我们可以fork官方的Repo,也可以自己创建,个人建议不fork,因为你只是想添加自己的Pods,没有必要把现有的公开Pods都copy一份。所以创建一个 Git仓库,这个仓库你可以创建私有的也可以创建公开的,不过既然私有的Spec Repo,还是创建私有的仓库吧,需要注意的就是如果项目中有其他同事共同开发的话,你还要给他这个Git仓库的权限。因为GitHub的私有仓库是收费的,我还不是GitHub的付费用户,所以我使用了其他Git服务,我使用的是CODING,当然还有其他的可供选择开源中国、Bitbucket以及CSDN Code.
创建完成之后在Terminal中执行如下命令
# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
$ pod repo add Specs-Repo https://github.com/lizhi0123/Specs-Repo.git
此时如果成功的话进入到~/.cocoapods/repos目录下就可以看到Specs-Repo(只是个名字,会根据你设置的名称而不同) 这个目录了。至此第一步创建私有Spec Repo完成。
如下图所示 ↓,但是刚开始的时候你的Specs-Repo应该是空的,只是多个Specs-Repo文件夹而已
执行 pod repo list 查看repo列表
$pod repo list
PS:如果有其他合作人员共同使用这个私有Spec Repo的话在他有对应Git仓库的权限的前提下执行相同的命令添加这个Spec Repo即可。
2. 创建Pod项目工程文件
参考CocoaPods私有库配置笔记
说白了,就是你项目所用的公共类,你以后项目里所要引用的,类似于AFNetworking
这个我已经建好了 UIButton-Vertical (UIButton title 和image 垂直显示)
你步就是根据你们自己的需要,自己设置了。(__) 嘻嘻……
如果是有现有的组件项目,并且在Git的版本管理下,那么这一步就算完成了,可以直接进行下一步了。
如果你的组件还在你冗余庞大的项目中,需要拆分出来或者需要自己从零开始创建一个组件库,那么我建议你使用Cocoapods提供的一个工具将第二步与第三步结合起来做。
现在来说一下这个工具,相关的文档介绍是Using Pod Lib Create 就拿我创建的podTestLibrary为例子具体讲一下这里是如何操作的,先cd到要创建项目的目录然后执行
$ pod lib create UIButton-Vertical
之后他会问你四个问题,1.是否需要一个例子工程;2.选择一个测试框架;3.是否基于View测试;4.类的前缀;4个问题的具体介绍可以去看官方文档,我这里选择的是1.yes;2.Specta/Expecta;3.yes;4.PTL。 问完这4个问题他会自动执行pod install命令创建项目并生成依赖。
$ tree PodTestLibrary -L 2
PodTestLibrary
├── Example
demo APP
│ ├── PodTestLibrary
│ ├── PodTestLibrary.xcodeproj
│ ├── PodTestLibrary.xcworkspace
│ ├── Podfile
demo APP 的依赖描述文件
│ ├── Podfile.lock
│ ├── Pods
demo APP 的依赖文件
│ └── Tests
├── LICENSE
开源协议 默认MIT
├── Pod
组件的目录
│ ├── Assets
资源文件
│ └── Classes
类文件
├── PodTestLibrary.podspec
第三步要创建的podspec文件
└── README.md
markdown格式的README
9 directories, 5 files
以上是项目生成的目录结构及相关介绍。
接下来就是向Pod文件夹中添加库文件和资源,并配置podspec文件,我把一个网络模块的共有组件放入Pod/Classes中,然后进入Example文件夹执行pod update命令,再打开项目工程可以看到,刚刚添加的组件已经在Pods子工程下Development Pods/PodTestLibrary中了,然后编辑demo工程,测试组件,我并没有使用提供的测试框架进行测试,这里就先不介绍了。
注:这里需要注意的是每当你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新执行一遍pod update命令。
测试无误后需要将该项目添加并推送到远端仓库,并编辑podspec文件。
通过Cocoapods创建出来的目录本身就在本地的Git管理下,我们需要做的就是给它添加远端仓库,同样去GitHub或其他的Git服务提供商那里创建一个私有的仓库,拿到SSH地址,然后cd到PodTestLibrary目录
$ git commit -s -m
"Initial Commit of Library"
$ git remote add origin git@coding.net:wtlucky/podTestLibrary.git #添加远端仓库
$ git push origin master #提交到远端仓库 ```
因为podspec文件中获取Git版本控制的项目还需要tag号,所以我们要打上一个tag,
```$ git tag -m
"first release"
"0.1.0"
$ git push --tags #推送tag到远端仓库```
做完这些就可以开始编辑podspec文件了,它是一个Ruby的文件,把编辑器的格式改成Ruby就能看到语法高亮,下面我贴上我的podspec文件,并在后面以注释的形式说明每个字段的含义,没有涉及到的字段可以去[官方文档](http://guides.cocoapods.org/syntax/podspec.html)查阅
Pod::Spec.new do |s|
s.name = 'UIButton-Vertical' #名称
s.version = '0.1.0' #版本号
s.summary = 'UIButtom 垂直显示Title 和 Image' #简短介绍
s.description = <<-DESC
OC,UIButtom 垂直显示Title 和 Image,
DESC
s.homepage = 'https://github.com/lizhi0123/UIButton-Vertical' #主页
s.license = { :type => 'MIT', :file => 'LICENSE' } #开源协议
s.author = { 'lizhi0123' => 'zhang_zhi_li@163.com' } #作者信息
s.source = { :git => 'https://github.com/lizhi0123/UIButton-Vertical.git', :tag => s.version.to_s } #git地址
s.ios.deployment_target = '8.0' #最低支持的ios版本
s.source_files = 'UIButton-Vertical/Classes/*/' #开源类
end
编辑完podspec文件后,需要验证一下这个文件是否可用,如果有任何WARNING或者ERROR都是不可以的,它就不能被添加到Spec Repo中,不过xcode的WARNING是可以存在的,验证需要执行一下命令
$ pod lib lint
当你看到
-> PodTestLibrary (0.1.0)
PodTestLibrary passed validation.
时,说明验证通过了,不过这只是这个podspec文件是合格的,不一定说明这个Pod是可以用的,我们需要在本地做一下验证。
> 验证远程库
pod spec lint
#### 3.创建podspec文件
**[3分钟让你的框架支持cocoapods,podspec文件讲解 ](//www.greatytc.com/p/8a7b9232cbab)** 我们需要执行此博客的 第1-7步,就可以了,不需要执行第8,9,10步。
##### ①.创建.podspec
然后cd到你项目的目录,执行命令 `你也可以使用vim创建,只要创建就可以了 `
// 注 UIButton-Vertical 这个是你框架的名称
$ pod spec create UIButton-Vertical
##### ②.编辑.podspec
创建好后打开,删除注释, 前面有#的为注释,如果你想知道每个东西的含义可以了解一下整理之后的文件
Pod::Spec.new do |s|
s.name = 'UIButton-Vertical' #名称
s.version = '0.1.0' #版本号
s.summary = 'UIButtom 垂直显示Title 和 Image' #简短介绍
s.description = <<-DESC
OC,UIButtom 垂直显示Title 和 Image,
DESC
s.homepage = 'https://github.com/lizhi0123/UIButton-Vertical' #主页
s.license = { :type => 'MIT', :file => 'LICENSE' } #开源协议
s.author = { 'lizhi0123' => 'zhang_zhi_li@163.com' } #作者信息
s.source = { :git => 'https://github.com/lizhi0123/UIButton-Vertical.git', :tag => s.version.to_s } #git地址
s.ios.deployment_target = '8.0' #最低支持的ios版本
s.source_files = 'UIButton-Vertical/Classes/*/' #开源类
end
接下来讲解一下每行代码的含义
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里增加以下一行代码即可
source 'https://github.com/CocoaPods/Specs.git'
私有Spec Repo
source 'https://github.com/lizhi0123/Specs-Repo.git'
pod 'MBProgressHUD', '~> 0.9'
pod 'AFNetworking', '~> 3.1.0'
私有库
pod 'UIButton-Vertical', '~> 0.0.1'
注意:
`source 'https://github.com/CocoaPods/Specs.git' #必须写要不然search的时候找不到cocoapods里的库`
然后执行`pod update`,更新库依赖,然后打卡项目可以看到,我们自己的库文件已经出现在Pods子项目中的Pods子目录下了,而不再是Development Pods。
pod update 更新所有的库,有时不需要更新master 库,可以用 `
$ pod repo update [NAME]`
然后再执行 pod search 时 就会显示 你自己建的库
常用命令
把库文件QKChineseVerifyCode.podspec添加到 Specs-Repo 私有库中
$ pod repo push Specs-Repo QKChineseVerifyCode.podspec --allow-warnings
source 'https://github.com/lizhi0123/Specs-Repo.git'
source 'https://github.com/CocoaPods/Specs.git'