为了利用Cocoapod的进行私有仓库管理/打包/切换源码的功能,我们按照下图的规划一步一步进行实现
如何搭建一个私有仓库
在开发过程中,我们经常会将功能性代码抽取出来以便复用,但有时我们并不想开源,那么我们就可以创建私有仓库来进行管理,另外这也为我们项目的组件化做了准备。
私有仓库的实现能够很大程度上减少项目开发中的合并冲突,精简项目结构,而且有利于后期进行组件化。但是私有库管理相比较直接修复项目中的错误来说要复杂一些,不过为了简洁和复用,相信这点牺牲也是有必要的。
那么,究竟如何搭建一个私有仓库呢?接着往下看:
0.准备工作
首先我们要知道,使用私有仓库来管理我们需要维护两个库:
【1】一个私有的podRepo仓库,这就是我们的私有仓库管理中心,这个仓库用来存放我们所有私有库的.podspec文件
【2】我们实际的代码工程,用来存放实际的功能库代码
只有先理解了以上这一点才能进行我们之后的创建操作。
1.创建私有podRepo仓库
1.1首先当然是登录gitlab啦~
此时需注意,如果你并没有添加SSH的话,会有这样一个提示:
也就是由于缺少SSH key所以你不能使用SSH来拉取/推送代码,这就需要你将SSH key添加到gitlab啦,怎样添加呢?
【1】打开终端,使用如下命令生成ssh公钥和私钥对
ssh-keygen -t rsa -C 'xxx@xxx.com' 然后一路回车(-C 参数是你的邮箱地址)
【2】打开~/.ssh/id_rsa.pub文件,这个文件中的内容就是你的SSH key
【3】打开gitlab,找到User Settings-->SSH Keys--->Add an SSH Key
添加完成即可
1.2创建新的项目
在gitlab首页点击创建图标
点击创建
1.3克隆podRepo到本地
使用命令行克隆
git clone 项目地址 //例如 git clone git@gitlab.com:sunqy/SQYPodRepo.git
结果如下:
2.创建实际代码工程项目 (实际过程中踩坑,想绕过可直接阅读步骤3)
创建过程与上一步一致,此处不再赘述。
然后针对实际代码工程,我们还需要做以下操作:
2.1添加readme文件
readme文件主要是为了给读者以大致介绍该项目能做哪些事情,具体书写规范就不再赘述了。添加readme文件有两种方法:
【1】直接在gitlab网页上点击添加:
然后进入编写页面进行编写,编写完成后提交即可,当然gitlab还提供了多种模版可供快速完成多种设置文件:
【2】使用命令行添加:
以下是我的添加记录:
添加提交后的结果如下,可以看到已添加提交完成:
2.2为项目添加LICENSE
在2.1中已经可以看到readme文件旁边有对应 add LICENSE的按钮,点击然后进行配置即可
2.3添加实际项目文件并提交
【1】将提取完成的代码文件添加到项目中,项目类文件放入Classes文件夹中
【2】提交,并且为当前提交打上tag,因为Cocoapods管理的库是根据git的tag来区分的不同版本的。
$ git tag 0.0.1 # 在本地仓库打上tag
$ git push --tags # 将tag标记推送到远程仓库
2.4添加.podspec文件
【1】创建.podspec文件
pod spec create 项目名称 //例如:pod spec create SQYAlertView
【2】编辑.podspec文件,进行相对应的配置,然后提交该文件
此处需注意:
1 .podspec文件中的s.version应和tag的版本一致;
2 .podspec文件中的s.source_files和s.resource_bundles参数应与项目中的路径匹配
3.把实际工程的.podspec文件推送到PodRepo私有库当中
使用
pod repo push SQYPodRepo SQYAlertView.podspec --allow-warnings
--use-libraries //--allow-warnings表示允许warning,--use-libraries表示使用了libraries,当然这两个配置项也可以不写
但是出现了如下错误:
提示有未知错误导致验证失败,所以在提交.podspec文件之前最好先进行一下验证
3.0验证podspec文件
可以使用pod lib lint/pod spec lint 命令验证,两者的区别是pod lib lint = local, pod spec lint = local/remote,参考:lint
验证发现了如下错误:
一个自己傻白并不甜导致的一个坑:
之前认为可以仅把该项目当作是一个代码管理仓库,所以可以并不创建工程project,仅放置功能代码文件即可,可是忽略了CocoaPods的定义。CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects.
摘自here
所以当我只是在项目中添加了功能代码文件,而并没有创建project的时候出现了如上图所示的错误。。。自己挖的坑。。。所以我们需要创建project,这样Cocoa才能帮助我们管理。所以步骤2中我们需要先创建项目:使用pod lib create SQYAlertView命令创建项目
创建成功后的目录如下图:
编辑.podspec文件和readme文件,以及功能代码文件后推送到remote即可,推送之前记得(如果推送失败,请注意这一句:Running pod install on your new library)
然后回到这一步骤最开始的把实际工程的.podspec文件推送到PodRepo私有库当中
查看远程SQYPodRepo项目可以看到
因为涉及到删除项目新建所以这里附带说一下
如何删除项目:
点开需要删除的项目-Setting-General-Advanced setting-点击Expand-Remove project-在弹框中输入项目名称-点击confirm即可删除
4.如何创建一个合法的项目,并且可以使用pod加载到工程中
4.1创建一个项目SQYPodTest用来测试上述我们创建的pod私有仓库是否可用
创建过程不再赘述
4.2添加podfile文件,开始真正的使用
【1】使用pod init添加podfile文件
【2】编辑podfile文件,需要添加source和pod,
然后执行pod install
【3】现在在SQYPodTest这个项目中就可以使用我们的私有工具库SQYAlertView啦
5.尝试使用资源文件.xcasset/.xib/.xcdatamodel/.bundle
我们在项目中加入.png/.xib,然后上传到远端,重新执行pod update,会发现虽然.png/.xib文件已经被上传到远端了,但是并没有被更新下来
这是为什么呢?原因是因为pod是按照.podspec描述进行更新的,但是我们的.podspec的s.source_files和s.resource_bundles只是包含了.h/.m文件,而并没有包含.png/.xib等类型的文件,所以导致了这样的情况,我们只需修改.podspec重新上传更新即可
6.尝试将所有资源文件打包到一个bundle
我们可以使用git bundle create命令来进行将整个项目打包。
命令git bundle create repo.bundle HEAD master,其中repo.bundle为你打出来的bundle名称,如果你希望这个仓库可以在别处被克隆,你应该像例子中那样增加一个 HEAD 引用。master代表master分支
然后对于这个.bundle文件,可以使用
git clone repo.bundle repo
命令克隆出整个项目以供你或者你的合作开发者使用。更详细的请参考以下文档:git打包
7.不使用git的任何工具推送一个仓库,并且通过校验
如果指的是使用命令行推送的话那么如下图所示操作即可:
8.上传错了一个版本该如何处理
8.1重复打一个tag,这在手动操作情况下经常出现
在同一个节点,如果标签1已经存在了
这个时候想在这个节点再打一个标签1会收到提示
这就告知我们该标签已存在,随意更改可能会造成混乱,所以不可随意更改。
但是假如打一个和tag1不同的标签是可以的,大家可以自从尝试。
8.2本身.podspec文件写错了
因为pod是按照.podspec去加载对应项目的,所以假如.podspec文件有错误,那么会导致不能正常加载正确的项目,例如s.version写错了就不加载正确版本,s.source_files写错了资源文件的访问就会有问题等等