Cocoapod的使用(一)私有库构建

为了利用Cocoapod的进行私有仓库管理/打包/切换源码的功能,我们按照下图的规划一步一步进行实现


步骤

如何搭建一个私有仓库

在开发过程中,我们经常会将功能性代码抽取出来以便复用,但有时我们并不想开源,那么我们就可以创建私有仓库来进行管理,另外这也为我们项目的组件化做了准备。
私有仓库的实现能够很大程度上减少项目开发中的合并冲突,精简项目结构,而且有利于后期进行组件化。但是私有库管理相比较直接修复项目中的错误来说要复杂一些,不过为了简洁和复用,相信这点牺牲也是有必要的。
那么,究竟如何搭建一个私有仓库呢?接着往下看:

0.准备工作

首先我们要知道,使用私有仓库来管理我们需要维护两个库:
【1】一个私有的podRepo仓库,这就是我们的私有仓库管理中心,这个仓库用来存放我们所有私有库的.podspec文件
【2】我们实际的代码工程,用来存放实际的功能库代码
只有先理解了以上这一点才能进行我们之后的创建操作。

1.创建私有podRepo仓库

1.1首先当然是登录gitlab啦~

此时需注意,如果你并没有添加SSH的话,会有这样一个提示:


缺少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


添加SSH.png

添加完成即可

1.2创建新的项目

在gitlab首页点击创建图标


点击创建新的项目png

设置项目说明.png

点击创建


空项目创建成功

1.3克隆podRepo到本地

使用命令行克隆

git clone 项目地址 //例如 git clone git@gitlab.com:sunqy/SQYPodRepo.git

结果如下:


克隆podRepo到本地.png

2.创建实际代码工程项目 (实际过程中踩坑,想绕过可直接阅读步骤3)

创建过程与上一步一致,此处不再赘述。
然后针对实际代码工程,我们还需要做以下操作:

2.1添加readme文件

readme文件主要是为了给读者以大致介绍该项目能做哪些事情,具体书写规范就不再赘述了。添加readme文件有两种方法:
【1】直接在gitlab网页上点击添加:


点击添加Reademe文件.png

然后进入编写页面进行编写,编写完成后提交即可,当然gitlab还提供了多种模版可供快速完成多种设置文件:


点击添加Reademe文件.png

【2】使用命令行添加:


命令行添加Reademe文件.png

以下是我的添加记录:


提交Reademe文件.png

添加提交后的结果如下,可以看到已添加提交完成:


提交结果.png

2.2为项目添加LICENSE

在2.1中已经可以看到readme文件旁边有对应 add LICENSE的按钮,点击然后进行配置即可

2.3添加实际项目文件并提交

【1】将提取完成的代码文件添加到项目中,项目类文件放入Classes文件夹中


目录结构.png

【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,当然这两个配置项也可以不写

但是出现了如下错误:


错误.png

提示有未知错误导致验证失败,所以在提交.podspec文件之前最好先进行一下验证

3.0验证podspec文件

可以使用pod lib lint/pod spec lint 命令验证,两者的区别是pod lib lint = local, pod spec lint = local/remote,参考:lint

验证发现了如下错误:

验证出错.png

一个自己傻白并不甜导致的一个坑:
之前认为可以仅把该项目当作是一个代码管理仓库,所以可以并不创建工程project,仅放置功能代码文件即可,可是忽略了CocoaPods的定义。CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects.
摘自here
所以当我只是在项目中添加了功能代码文件,而并没有创建project的时候出现了如上图所示的错误。。。自己挖的坑。。。所以我们需要创建project,这样Cocoa才能帮助我们管理。所以步骤2中我们需要先创建项目:使用pod lib create SQYAlertView命令创建项目
各项配置.png

创建成功后的目录如下图:
目录.png

编辑.podspec文件和readme文件,以及功能代码文件后推送到remote即可,推送之前记得(如果推送失败,请注意这一句:Running pod install on your new library)

然后回到这一步骤最开始的把实际工程的.podspec文件推送到PodRepo私有库当中

推送.png

查看远程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,


编辑podfile文件.png

然后执行pod install


执行pod install.png

【3】现在在SQYPodTest这个项目中就可以使用我们的私有工具库SQYAlertView啦


具体使用.png

5.尝试使用资源文件.xcasset/.xib/.xcdatamodel/.bundle

我们在项目中加入.png/.xib,然后上传到远端,重新执行pod update,会发现虽然.png/.xib文件已经被上传到远端了,但是并没有被更新下来


上传结果.png

更新结果.png

这是为什么呢?原因是因为pod是按照.podspec描述进行更新的,但是我们的.podspec的s.source_files和s.resource_bundles只是包含了.h/.m文件,而并没有包含.png/.xib等类型的文件,所以导致了这样的情况,我们只需修改.podspec重新上传更新即可


fixPodSpec.png

更新.png

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已经存在了


tag1已存在

这个时候想在这个节点再打一个标签1会收到提示


tag1重复

这就告知我们该标签已存在,随意更改可能会造成混乱,所以不可随意更改。
但是假如打一个和tag1不同的标签是可以的,大家可以自从尝试。

8.2本身.podspec文件写错了

因为pod是按照.podspec去加载对应项目的,所以假如.podspec文件有错误,那么会导致不能正常加载正确的项目,例如s.version写错了就不加载正确版本,s.source_files写错了资源文件的访问就会有问题等等

剩下的内容看这里

Cocoapod的使用(二)

推荐阅读更多精彩内容