ios 创建一个私有库的目的

2019-07-24 10:46:09 u013602835 阅读数 335

      随着项目和业务的发展,项目中会有很多基础功能模块和通用业务模块可以抽象成独立的组件,这样方便给各个业务线提供共用的基础组件,进行组件化编程,不需要重新造轮子,提高开发效率。因此我们就需要一个方案来合理的管理公共的组件。

 

Spec Repo(配置仓库)的概念

      CocoaPods对于一名iOS开发来说再熟悉不过了,它的工作原理就是在GitHub上面有个Spec Repo,它里面包括成千上万的后缀名为.podspec的文件。我们在项目中集成第三方库(如SDWebImage)的时候其实就是通过CocoaPods的Spec Repo去找到我们需要的开源项目的.podspec文件,然后在.podspec文件中有具体的源码地址(放具体代码的地方),根据这个地址去下载代码。

      按照上面Spec Repo的理解,我们如果能自己创建一个类似CocoaPods的Spec Repo,然后把我们私有的公共组件的.podspec文件放在里面,然后集成的时候让CocoaPods帮我们集成那我们就能达到目的,就可以建立私有pod库了。

     一般项目经理都会把代码仓库和配置仓库都建好,这时候我们只需要把Spec Repo 加到本地就行了。(注意:需要管理员将你的账号加到里边,有访问权限并且有修改权限)。

 

一、添加'本地的私有仓库'(Spec Repo)文件 

1、使用下面的命令就可以在本地生成配置文件的仓库,建议这个本地的名字也和远程的一致,这样便于区分和后期的维护.
“baseSpecs”是你们团队远端创建的配置文件仓库的名字,后面是配置文件仓库远端的地址 .
注意此时不需要cd进入任何目录,从默认位置输入这个命令,即在点击终端快捷方式打开的状态下直接输入下面的命令即可

pod repo add baseSpecs http://***/***/specs.git

 

2、查看是否添加成功(查看本地的所有repo)

pod repo list

或者打开本地配置仓库管理文件夹进行查看

open ~/.cocoapods/repos

如果能看到自己团队的repo(本地的私有仓库),就OK了。注意:这个操作只需要执行一次就可以了,下次再打新的pod库的时候就不需要再执行了。

 

二、创建自己的pods公共组件库

1、创建项目和.podspec文件

方式1、可以利用pod提供的命令,直接创建一个pod库的标准模板。这个很方便,可以直接创建一个工程,可以省去很多操作。命令如下:
 pod lib create UIPoolSingleImage

方式2、自己在项目根目录创建podspec文件。该方式比较麻烦,需要自己创建项目。

2、编写.podspec文件。根据自己的pod库更改相关内容,文件内容大概是这样的:

//特别说明,里面的注释是博主为了大家知道什么意思加的,实际使用时一定要去掉
Pod::Spec.new do |s|
//文件名
s.name = 'UIPoolSingleImage'
//版本
s.version = '0.1.0'
//描述信息
s.summary = 'A short description of UIPoolSingleImage.'
//这里的主页自己随便写
s.homepage = 'https://github.com/623099552@qq.com/UIPoolSingleImage' 
//作者
s.authors = { '623099552@qq.com' => '623099552@qq.com' }
//资源路径
s.source = { :git => 'http://***/***/uipoolsingleimage.git', :tag => s.version.to_s }
//ARC模式
s.requires_arc = true
//license,一般我们用MIT
s.license = 'MIT'
//允许的最低系统使用版本
s.ios.deployment_target = '8.0'
//库文件路径,这个路径需要和你提供的库文件的目录相对应,否则会报错
s.source_files = 'UIPoolSingleImage/Classes/*'
end

 

三、创建自己的pods公共组件库

1、在可以创建私有库的地方创建一个code repository(代码仓库), 也就是存放要打的pod库中的代码文件。这里我使用的是gitlab。

 点击右上角的加号按钮,创建代码仓库名为UIPoolSingleImage

       

2.克隆code repository(代码仓库)到本地,并将上面创建好的私有库代码文件上传到code repository(代码仓库)中。注意:代码上传之后时候需要打一个tag ,并且每次更新tag都要和.podspec文件中的tag对应。

 

四、在命令行验证.podspec文件是否有效

注意:--allow-warnings :表示忽略警告。 --verbose:表示会输出详细的debug信息。

 1、本地校验:pod lib lint UIPoolSingleImage.podspec --allow-warnings
 2、线上校验:pod spec lint UIPoolSingleImage.podspec --allow-warnings

注意:如果你制作的pod库,会依赖spec repository(配置文件仓库)中其他的私有仓库,则需要加上 --use-libraries。并且将spec repository 的源加上。

pod spec lint  UIPoolSingleImage.podspec --sources='http://***/***/specs.git','https://github.com/CocoaPods/Specs.git' --use-libraries

 

 如果出现passed validating则表示spec文件验证通过了

   

 

五、将.podspec配置文件push到远端专门存储配置文件的仓库中 

1、将配置文件push到远端专门存储配置文件的仓库中 ,本地的也会同步更新
此时需要cd进入本地的.podspec所在的路径(否则会找不到podspec文件) 
然后使用下面的命令即可,baseSpecs 是你创建的spec repository的名字,后面是你本地创建的.podspec文件

注意:如果你制作的pod库,会依赖spec repository(配置文件仓库)中其他的私有仓库,则需要加上 --use-libraries。

注意:如果你在手动验证 Pod 时使用了 --use-libraries 或 --allow-warnings 等修饰符,那么发布的时候也应该使用相同的字段修饰,否则可能会报错。

pod repo push baseSpecs UIPoolSingleImage.podspec --allow-warnings --use-libraries --verbose

2、出现下面信息,则代表成功

  

  

或者查询本地私有spec管理文件夹,如果看到了UIPoolSingleImage则代表成功

   open ~/.cocoapods/repos

    

  3、可以在远端配置文件仓库中看到这个文件,如下:

  

 

到此,利用Cocoapods打私有的pod库就完成了。接下来,在项目中就可以直接引入私有库了。 

注意:引用私有库的时候,需要将Spec Repo源加到Profile文件中,如下:

source "https://github.com/CocoaPods/Specs.git" #cocoapods的
source "http://***/***/specs.git" #私有的

pod 'UIPoolSingleImage', '0.1.0'

 

更新:下次更新pod库的时候,在sourceTree需要打tag,比如从0.1.0升级到0.2.0,要先将代码推送到远端,然后再打tag,顺序不能反。而且打的tag要和.podspec文件中的tag要对应。

 

参考:

gitLab创建自己的私有库 

iOS 建立自己本地cocoapod库

在Github上创建自己的公有的Pod库(开源库,提供Pod导入)

[Cocoapods]项目添加Cocoapods支持遇到的坑

Cocoapods使用私有库中遇到的坑

2019-03-08 12:58:41 Tiramisu_LM 阅读数 126

引言

最近对组件化相关的知识比较感兴趣,翻看了好多大神的博客,算是对组件化有个大概的了解了。所谓的组件化,一方面是抽取私有Pod库,其实就是把我们的项目分成多个模块,例如基类模块、工具类模块、登陆模块、首页模块等等,然后把他们抽取成一个个私有Pod库,像平时利用cocopods导入三方库那样导入我们的这些私有库;另一个方面就是关于模块之间的通信问题,常常采用路由跳转。本文的主要目的是前者。

一. 公有Pod库的本质

公有Pod库大家应该都比较熟悉,项目中经常使用的三方库,如AFNetworking,Masonry,SDWebImage等都属于公有Pod库,任何一个开发者都可以把其导入自己的项目工程中进行使用。与之相对应的就是私有Pod库,它只能被有权限的人使用。其实公有和私有的区别不大,就是谁来管理.podspecs文件的问题,下面就说一下大家比较熟悉的公有Pod库的本质

  • 远程索引库:存在一个公共的远程索引库,包含所有三方框架的.podspec文件,在.podspecs文件中包括了框架名,框架源码地址,用户名,描述等信息。
  • 本地索引库:在安装pod,执行pod setup的时候,会将公共的远程索引库copy一份到本地,也即是公共的本地索引库。(可以查看此目录:/Users/xx/.cocoapods/repos, xx替换成你的电脑名,下同)
  • 检索文件: 公共的本地索引库会另外生成一个检索文件,以键值对的形式,方便以后查找。( 可以查看此目录:/Users/xx/Library/Caches/CocoaPods)
  • 导入三方库:执行pod install的时候,先去检索文件中查找,找到之后,在公共的本地索引库拿到框架源码地址进行导入。

二. 创建私有Pod库

上面已经提到了,公有Pod库是任何一个开发者都可以导入使用的,并且是能看到源码的,这显然不是我们想要的。我们的pod库应该是只能内部人员才能导入使用,所以我们应该把一个个模块抽取成私有的Pod库。
公有和私有Pod库的主要区别就是远程索引库不同,我们需要创建一个私有的远程索引库,用来管理私有库的.podspec文件,其他方面大同小异。
下面以Base模块为例,将其抽取成私有Pod库。

1.创建私有的远程索引库

(1) 在gitlab上创建一个私有的仓库QDFoundationSpec,克隆地址是:http://git.prod.qiaodata.lan/liumingming/QDFoundationSpec.git, QDFoundationSpec就作为上面提到的私有的远程索引库。

(2) 终端执行下面命令,将私有的远程索引库copy到本地。

pod repo add QDFoundationSpec http://git.prod.qiaodata.lan/liumingming/QDFoundationSpec.git

执行完毕后,在目录:/Users/xx/.cocoapods/repos 下会多出来一个QDFoundationSpec文件夹,至此私有的索引库部分就完成了。

2.创建私有Pod组件库

(1) 打开终端,进入到桌面目录下,执行下面命令来创建一个名为QDFoundation的Pod库空模板。

pod lib create QDFoundation

依次输入下图信息进行基础配置:
基础配置

配置完毕之后,Pod库空模板就创建成功了,系统会自动此模板。

(2) 在gitlab上创建远程仓库QDFoundation,克隆地址是:http://git.prod.qiaodata.lan/liumingming/QDFoundation.git,在终端QDFoundation目录下执行下面命令,关联本地仓库到远程仓库。

git remote add origin http://git.prod.qiaodata.lan/liumingming/QDFoundation.git

(3) 将原项目中需要封装的Base模块,复制到 QDFoundation/QDFoundation/Classes中,顺便删除ReplaceMe文件

(4) 终端进入 QDFoundation/Example 文件夹,执行 pod install

(5) 退回到上层目录

上面搞定之后,接着就是修改QDFoundation.podspec文件,如下图
修改spec

修改完成之后,将本地代码推送到远程仓库,设置tag并推送到远端(注意:tag要和上图中s.version版本一样),然后终端执行下面命令,来校验我们的 QDFoundation.podspec 文件

pod spec lint

等待片刻,终端出现 QDFoundation.podspec passed validation,则说明 QDFoundation.podspec 文件通过校验。

3. 将QDFoundation.podspec文件加入私有的远程索引库QDFoundationSpec

上面已经验证过 QDFoundation.podspec 文件没问题,接着就是要把 QDFoundation.podspec 文件添加到私有的索引库(也就是第一步中得到的索引库 QDFoundationSpec),在终端执行下面命令:

pod repo push QDFoundationSpec QDFoundation.podspec

上面命令对 QDFoundation.podspec 文件做了两个操作:一个是将其推送到私有的远程索引库,可以去 gitlab 的 QDFoundationSpec仓库中查看;另一个是将其copy到私有的本地索引库,这个可以去目录:/Users/xx/.cocoapods/repos/QDFoundationSpec 下查看到。
至此,Base模块抽取成私有的Pod库也就完成了,可以在终端执行pod search QDFoundation来查询它,接下来就是在原项目中使用它了。

4. 使用私有Pod库

在原项目的Podfile中,导入私有的Pod库的方式如下图
使用私有Pod库

接着执行 pod install命令进行安装,安装完毕之后,可以看到Pods文件夹中已经有QDFoundation了,然后把原项目中的Base文件夹给删除掉即可。

另外,公司内部其他成员在使用之前需要执行下面命令,将私有的远程索引库copy到本地,然后就可以正常使用了。

pod repo add QDFoundationSpec http://git.prod.qiaodata.lan/liumingming/QDFoundationSpec.git

5. 更新私有库

  • 修改私有库中相应的内容
  • 更新对应的 .spec 文件中的版本号
  • 执行pod lib lint命令本地校验
  • 上传修改内容到git,并打上tag, tag与版本号相同
  • 执行pod repo push QDFoundationSpec QDFoundation.podspec命令
  • 更新之后,公司内部其他成员使用私有库需要执行下面命令
pod repo update QDFoundationSpec

或

pod update

三、文件夹分层

1. 文件显示层级

cocoaPods创建私有库的时候,如果私有库中的文件很多,想做到和项目中的文件夹分层,就需要在podSpec文件里面用到s.subspec 'xxx' do |ss|语句来配置。

先看一个文件层级
文件层级

如图所示,现在我们要把 QDFoundation这个文件夹搭建私有库。

我们一般在用pod lib create QDFoundation创建完项目后,会生成相应的目录,只要把需要做成私有库的文件夹代码文件放到 classes里面就可以了。

首先先不考虑文件分层的写法,这样podspec文件里面是这样的
文件原始分层

在图中可以看出,就是普通的写法,按照图中这么写的话,会导致私有库搭建完成并pod导入后,所有的.h .m .xib .png等文件都在一个文件夹里面,并没有我们本地那样的文件夹Base、Network等文件夹了。

这样的pod私有库虽然在正常的使用中并没有任何问题,但是看起来很乱,这个时候我们就需要进行文件分层了。把UIView类都放在View里面,把Model类都放在Model里面。这里我们基于没有文件分层的基础上进行修改,需要使用到下面的语句

s.subspec ‘View’ do |ss|
ss.source_files = ‘’
end

下面我们参照图一给出的文件层级写相关的 subspec

classes文件夹下面,只有文件夹,并没有其他的.h .m等文件,这个时候,podspec文件里面的source_files就可以不用写了。
文件夹分级

这里需要注意的几个问题:

  • 一个就是如果有 A subspec 需要使用到其他的 B subspec ,就需要在 A subspec 下面添加对 B subspec 的依赖,这个依赖是针对 subspec 的,不需要写本地文件路径。
  • 依赖其他第三方公开pod库的话,可以写在使用到的 subspec 里面,也可以写在总的依赖里。
  • 如果 A subspec 里面有使用到 B subspec 下的文件,B subspec 又引用到 A subspec 下的文件,这样的话,分层实现起来比较困难,解决的思路可以在 classes 下面创建一个.h的头文件,引用各个头文件,并设置 s.souce_files = 'QDFoundation/Classes/UIView.h'

2. 资源文件的使用

pods私有库有时候会用到图片资源或者其他资源,这些资源应该怎么配置和获取使用呢?
在我们使用pod lib creat QDFoundation的时候,会在 Classes 同级目录下面生成一个 Assets 的文件夹,这个文件夹就是用来放资源文件的,如图:
Asset文件目录
将资源文件放到这个里面的时候,接下来要去设置QDFoundation.podspec文件,主要就是将原先下面这段注释的代码接触注释就好了:

资源文件修改

注意

执行pod spec lint时遇到warning, 校验通不过的话,尽量把warning解决了,如果不好解决就使用pod spec lint --allow-warnings
执行pod spec lint时遇到引入第三方库找不到第三方的头文件,可以使用pod spec lint --use-libraries来解决这个问题

总结

在整个过程中,需要到git服务器上创建两个仓库,一个作为索引库,一个作为pod组件库;接着就是创建模板并配置.podspec文件;然后就是让索引库管理.podspec文件,之后就是使用了,如果清楚了这几步,对于抽取私有Pod库应该很得心应手。

参考链接

iOS 组件化之抽取私有Pod库
cocoapods私有库文件分层和资源文件上传

2016-01-14 10:23:45 andanlan 阅读数 15115

一、前言

在iOS开发中,为了满足企业内部的一些组件化需求,往往需要创建一些公用的代码,这些公用代码往往是不希望被公开的,此时一般可以选择submodule或者CocoaPods库的形式。

如果选用submodule,直接上传到自己的私有远程代码仓库就能达到目的。对于CocoaPods库的使用,则需要创建自己的私有库。

二、创建私有库遇到的问题

私有库的创建这里不再赘述,在互联网上已经有许多博客你可以进行参考,当然你也可以查看官方文档

1.私有库的dependency找不到

假如你已经创建好私有库A,并想在私有库B中使用私有库A,在库B的.podspec文件中你需要制定依赖:

s.dependency 'pod projectName(A)', '~> version'

校验sepc可用性时,执行以下命令:

pod sepc lint 文件名.podspec

此时由于你当前工程B依赖的工程是私有库,于是会报错:

- ERROR | [iOS] unknown: Encountered an unknown error (Unable to find a specification for `XSLKeyChainCache (~> 0.1.0)` depended upon by `XSLOpenUDID`) during validation.

原因:

校验podspec文件时会到远程podspec库查找相关依赖,默认只会到官方specs库校验,此时需要指定远程specs库去校验。

解决:

  1. 指定pod spec文件校验地址

     pod sepc lint 文件名.podspec --sources='http://[privateLibName]/cocoaspecs.git,https://github.com/CocoaPods/Specs.git'
    
  2. 引用当前私有库的podFile中指定source为私有库地址

    source http://[privateLibName]/cocoaspecs.git'
    source 'https://github.com/CocoaPods/Specs.git'
    

2.将本地podspec推送到远程私有spec库时因为警告失败

当你想把本地.podspec文件推送到远程specs仓库时,你需要执行:

Pod repo push 本地spec库名 本地.podsepc文件

如果.podspec文件存在警告时不能成功push。

解决:

Pod repo push 本地spec库名 本地.podsepc文件 --allow-warnings

不过为了严谨,最好把产生的警告解决掉再推送到远程仓库,以免对你的同事造成困扰。

更多相关指令你都可以用–help查看:

pod repo push --help

参考

  1. https://github.com/CocoaPods/CocoaPods/issues/2543

  2. http://guides.cocoapods.org/making/private-cocoapods.html

  3. http://guides.cocoapods.org/syntax/podfile.html#source

2018-02-27 10:58:38 github_35041937 阅读数 763

项目在告一段落的时候,我想把已经拆成模块的项目文件

拆分到pod库里面去

当初我没拆分到pod库 ,最开始是因为pod库要上传到公开

后来知道了码云,知道了可以上传到私有的服务器,

但是公司的项目是svn维护的,并没有这样的权限,自己擅自做也不太好。

再后来偶然发现 pod库其实是支持本地pod的

创建一个pod库 只需要 编写命令

pod lib create

这时候 按照官方的提示 创建一个模板就好了,

会发现里面的路径就是本地的路径

  pod 'LDSBase', :path => '../'

比如说上面这个,就是说这个base的模块 的路径就在当前的上级文件夹。

pod 是一个一个的组件 ,每个之间存在相互依赖的关系

这些依赖关系 改怎么添加呢

这就提到了

.podspec

这个文件, 创建pod库的时候会把这个添加出来,

如果没有在这个文件夹中添加依赖关系,就算你pod 了 masonry 类的库,

但是你的pod 是找不到 masnory 的路径的,会爆红,编译不过。因为lib search path 里面没有

这层关系,所以必须在 .podspec 中写这个依赖s.dependency 'Masonry'

我们由此可以知道 这个 .podsepc的文件 是cocopod 在xcode 编译阶跑自定义shell脚本的阶段

需要用户自定义的一些参数设置,如果没有这些参数设置,那xcode 自然不会注入这些关系

你可以理解为 配置表,针对你要创建的pod库的单独一份的表

而你的资源 就放在source_files 这个文件夹下 也是配置表来决定的

我这里展示一个我的配置表的部分参数

  s.ios.deployment_target = '9.0' // 9.0以上的系统
  s.source_files = 'LDSBase/Classes/**/*' //资源在source 文件夹下
  s.resource_bundles = {
    'LDSBase' => ['LDSBase/Assets/*.{png,xib,plist}'] //bundle 资源包含了png xib plist
  }
    s.dependency 'Masonry' //依赖了第三方库 masnory 和beehive 
    s.dependency 'BeeHive'
    s.libraries  = 'icucore' //依赖系统的资源icucore

如果遇到问题 可以看看是不是参数配置出错了

注意到bundle 里面包含了png xib plist 文件,是因为pod库的xib 不会出现在mainbundle 里面了

所以需要 用 当前class 的bundle 里面去找,而xib 这些东西都需要打到bundle 包里面,才能在项目里

被识别,我讲这些 是粗略的思路 ,具体代码建议去搜索一下、

做pod库尽量减少xib ,避免过多的处理xib的工作。

 s.source_files = 'LDSBase/Classes/**/*' 

就是你pod库的文件夹 ,你的这里面的文件会被编译到pod里面,当然你可以自己改写这个路径,最好

统一按照这个格式来

接下来就是漫长的迁移过程,你需要不断的创建pod 库 然后 把代码移动过去,然后编译通过,再pod

到你的主工程目录,直到 主工程目录只剩下appdelegate 文件夹,这个过程大约需要3 天,因为 会遇

到各个pod 之间存在相互引用的情况,xib的修改。pch 因为无效了,所以需要到处添加masnory头文

件。然后迁移回去需要在主工程里面全部测试一遍。

pod库 首先是需要先创建 pod 的base库 的 这些包含了socket afn 弹框基础类, uibase类等等,其他

pod库需要依赖这个base pod库再继续使用,不然每个库自己折腾一份,会非常麻烦。

至此 整个本地库的迁移就完成了。

迁移完成的下一步 是将各个模块之间的耦合 改成 target action 来处理。

再谈一下 pod组件化的一些弊端

组件化最初出现的目的是 解除耦合,让团队的成员 各自维护自己的pod库,来避免相互依赖

从而做到不熟悉整个项目,而能够开发的目的。

我认为存在的弊端:

1.如果没有每个人懂得pod 组件化的过程,就很难各自维护,除非把整个pod的过程写成自动化脚本。

2.基础通用的base 类的艰难维护, 我们知道base类是增长型的,比如会增加很多不可预知的分类。

或者增加一些新的 网络协议的封装,而这些都是依据业务需求来建立的,像弹框可能存在多个版本,

这些不会在项目初期就建立起来。而是边做边出现的,遇到这种情况,就必须增加base 的部分,重

新pod install base 类 这时候,所有的业务pod 就都需要pod install 一遍 才好继续使用,这样base 类

就变得牵一发而动全身的问题。
3. a库放在那里的问题,通用的png 文件放在哪里的问题,有些。a的静态库 一开始 只是一个模块在使

用的 这样打到业务pod就好,但很有可能后期就需要打到其他业务里面,这样不得不打到base pod库

里面,这样会造成base pod库 越来越大, png 文件放在base pod里面其实不太好,可能下一个项目

变了,那应该怎么办呢,目前我也没想到合理的解决方案。

4.除此之外,最重要的一点是pod 拆分力度的问题。 pod 拆分如果过细,那就会造成 tabbar/ login/

home/甚至两三个页面就做成一个pod了 ,为啥呢,因为要各自开发各自的模块呗,一般团队开发各自

模块都是很小的部分了。这样会让整个pod 结构看不出来层次划分, 因为pod 都是平级的。但是不

划分,只划大的模块,那团队之间的项目 还是一个团队维护一个pod结构,和直接维护整个工程都没啥

不同,我认为应该是大模块再拆分小模块,就是pod 库套用pod库的方案,而从外层看不出来里层结构

来解决。

5.之前svn 上是不存pod 的文件的,做了本地的组件化,必须上传所有的pod文件夹,当然这是细节。

我的观点:

其实说到这里我已经说得差不多了,组件化要大团队大项目,然后从一开始就需要开始做起pod 化的部

分 target action 的部分,才能够后续良好的维护。并且要持续做脚本化整个过程的部分。

小团队 费力做这个 实在是吃力不讨好。组件化开发确实是趋势,但是很多我看到的都是伪组件化,或

只是个demo。真正要做好这些还需要很多的工作和心力。后续我还会继续做组件化的工作,也希望

看到这个文章的人想一想我上面提到的问题,不必过度迷信组件化,忘了使用时候带来的阵痛。就像

mvvm 固然好,但也增加了消息传递的成本,mvc 固然不够美感,但用起来顺手是一样的,mvvm 的跨

层通信需要引入 kvo 或者 rac来解决问题,如果rac使用不当 或者理解不深入,还是会引入更多问题,

好的方案 一定是侵入性小,改动小 而带来的效用巨大的,而不是需要耗费大量的人力 做出来 还需要

持续维护的,以上是 我对pod 组件化的理解

2017-01-23 15:28:22 rigel_xu 阅读数 5195

iOS组件化开发之Pod私有库

组件化的目的:

  • 依赖解耦
  • 开发灵活
  • 团队分工明确
  • 提高代码质量
  • 加快编译速度
  • 解决多团队开发相互影响问题

工具-必选:

  • cocoapods 1.x 之后版本
  • cocoapods-packager
  • gitlab

工具-可选:

  • zsh
  • item2

cocoapods 是支持 svn 的,但是 git 相对方便一些。
`
**注:**以
OTBase` 为例

一、创建私有库

1、创建标准工程

为方便快速生成统一工程结构的组件工程,使用如下命令来创建工程。如何使用 pod lib

`pod lib create OTBase` 

目录结构如下:

├── Example
│   ├── OTBase
│   ├── OTBase.xcodeproj
│   ├── OTBase.xcworkspace
│   ├── Pods
│   └── Tests
├── OTBase
│   ├── Assets
│   └── Classes
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj

主要有两部分组成

  1. OTBase: 组件源码
  2. Example:Demo 工程,会 pod OTBase 库到此 demo 工程,方便调试

pod lib会从 github 下载模版工程,创建完成会自动打开 Example 下的OTBase.xcworkspace,在 pod 的工程下有一个Development Pods目录,pod 把我们的源码做为 Demo 工程的一个 pod 库,这跟实际使用是一样的了。只不过我们要改源码。

2、修改 podspec

修改 OTBase.podspec内容,参考:

Pod::Spec.new do |s|
  s.name             = 'OTBase'
  s.version          = '0.1.0'
  s.summary          = 'Modular develope base module.'
  s.description      = <<-DESC
  Base module is required for other module.
                       DESC

  s.homepage         = 'http://git.rigelxu.com/iOS_Base_Framework'
  s.license          = { :type => 'Copyright', :text => 'Copyright 2016, All rights reserved.\n' }
  s.author           = { 'Rigel' => 'mrxurj@gmail.com' }
  s.source           = { :git => 'http://git.rigelxu.com/iOS_Base_Framework.git', :branch => 'master' }     # :tag => s.version.to_s }
  s.source_files = 'OTBase/Classes/**/*'
  s.ios.deployment_target = '8.0'
  s.frameworks = 'UIKit'
  s.dependency 'MGJRouter', '~> 0.9.1'
end

为了方便s.source 可以暂时指定 master分支或者所在的分支。

3、打包

pod package OTBase.podspec

cocoapods-packager会打好可用的 framework 包含模拟器和真机。包放在工程目录下的OTBase-0.1.0/ios.

注:pod package 默认使用的是 release 模式,如果需要打 debug,添加上参数--configuration

注意:如果需要切换源码和二进制库,需要将打好的.framework 上传到存放二进制库的单独仓库的与 podspec 版本对应的 tag 上。

4、提交组件至私有仓库

更详细的发布流程
上面已经打出 framework,可以直接手动导 framework 的方式使用。当然更好的方法是使用 pod.

  • 在 gitlab创建一个spec仓库
  • 所有需要使用此仓库的电脑上,添加pod私有仓库

    pod repo add 仓库名 仓库地址

  • 验证 podspec
    pod spec lint OTBase.podspec --allow-warnings

  • 提交 podspec文件到 spec 仓库

    pod repo push OTSpec OTBase.podspec

5、源码、静态库切换

我们使用的第三方库,pod到工程里的都是源码,pod 会在我们编译的时候打成静态库/动态库。但是组件开发的时候为了提高编译效率,默认使用静态库比较好,只有在需要的时候,比如遇到问题需要 debug,发布生产,再 pod 源码到工程。

那么如何快速方便的切换源码和静态库?有以下几个思路:

  • 方法一:使用不同的 podspec,一个指向源码,一个指向二进制库;使用时在 podfile 里修改对应库名即可。比如静态库是 pod 'OTBase',源码是pod 'OTBase_source_code'
  • 方法二:添加环境变量,podspec 里添加判断如下:

       if ENV['IS_SOURCE_CODE']
            s.source_files = 'OTBase/Classes/**/*'
        else
           s.ios.vendored_frameworks = 'OTBase-0.1.0/ios/OTBase.framework'
       end
    

需要使用源码时在命令前添加环境变量:如

IS_SOURCE_CODE=1 pod install

如果考虑源码保密问题,可以将 framework 单独放一个仓库管理。podspec 的配置如下:

      if ENV['IS_SOURCE_CODE'] || ENV['OTBase_SOURCE']
        puts 'OTBase is  source'
        s.source           = { :git => 'http://github.com/OurTeam/iOS_Base_Framework.git', :branch => 'master' } 
        s.source_files = 'OTBase/Classes/**/*'
      else
        puts 'OTBase is binary'
    s.source           = { :git => 'http://github.com/OurTeam_Binary/iOS_Base_Framework.git'  :tag => s.version.to_s}
        s.resource      = 'OTBase.bundle' #有资源时使用,注意将.framework 里的资源bundle 删除,`.bundle` 与 `.framework` 一起打包成.zip
        s.ios.vendored_frameworks = 'OTBase.framework'
      end

二、使用私有库

  1. 添加组件私有仓库

    pod repo add OTSpec http://github.com/OurTeam/spec.git
    
  2. 添加私有 repo 到 podfile,同时还需要添加原 pod master 仓库,如下:

    source https://git.xxx.com/spec.git
    source 'https://github.com/CocoaPods/Specs.git

  3. 将要使用的组件添加至 Podfile pod install

  4. 当需要 pod 源码的时候先清理,再 install

    pod cache clean OTBase
    rm -rf Pods/OTBase
    IS_SOURCE_CODE=1 pod install
    

三、一些坑

  1. 如果使用的是 git-lib,如果 group 是私有的,那么无法创建 public 仓库
  2. 之前直接把.framework上传到 git-lib,以 http 下载文件的方式经常解压失败,换到其它 http 服务器 ok 了,可能文件跟文件的有效期有关。二进制库也使用 git 仓库的形式也没这种问题了。
  3. 使用了环境变量后打包命令也要修改,IS_SOURCE_CODE=1 pod package OTBase.podspec
  4. 如果有资源,资源会打包到 Framework 目录里。在使用二进制文件时,需要删除Framework里的资源文件,将资源 .bundle.framework 一起打包成.zip,参考此文:Pod二进制化
  5. 在源码和二进制文件进行切换时,一定要先执行清理。pod cache clean xxx, 然后再删除 Pods目录
  6. 某个组件可以添加一个单独的环境变量,以方便此开发中的组件使用源码,其它组件使用二进制文件。否则Example 工程 pod install 的时候 OTBase target 就消失了,因为默认使用了二进制的库。