使用 CocoaPods 对公有库开源和私有库组件

引言

年前在研究使用 CocoaPods 对 iOS 工程组件化,请教了各路大神,基本掌握了使用 CocoaPods 建立公有 Pod 库和私有 Pod 库方法。年后,打算正式将项目进行组件化重构,为了方便整理和学习就整理了这篇文章。html

AaIDTx.png

建立公有 Pod 库或者私有 Pod 库,实际上原理是同样的,都是基于 git 服务和 repo 协议,不同的是,二者的版本索引查询方式不同,公有库的 podspec 由 CocoaPods/Specs 管理,而内部私有使用的 pod 库须要本身创建一个仓库来管理 podspec。ios

实用:开源公有库

例子: 我有封装过一个工具CollectionIndexTools,CollectionIndexTools 能够给 Collection 添加一个相似 TableView 右侧的索引条,我想经过 Podfile 中添加 pod 'CollectionIndexToolsLib' 便可使用.git

1.注册 CocoaPods 帐户信息

想要建立一个开源 pod 库,首先咱们须要注册 CocoaPods, 这里使用 trunk 方式,做为一个 iOS 开发人员你必定安装了 CocoaPods,那么只须要在终端执行:github

pod trunk register 邮箱地址 '用户名' --verbose
复制代码

这里咱们通常使用 Github 邮箱和用户名,而后在你的邮箱中会收到确认邮件,在浏览器中点击连接确认即注册成功,成功以后能够终端执行:json

pod trunk me
复制代码

查看本身的注册信息,之后当你有了本身的开源Pod库,也能够用此方式随时查看本身发布过的Pods: swift

2.建立共享库文件并上传到公有仓库

共享库须要三个必不可少的部分:xcode

  • 1.共享文件夹(文件夹存放着你要共享的内容, 也就是其余人pod获得的文件, .podspec文件中的source_files须要指定此文件路径及文件类型);浏览器

  • 2.LICENSE文件(默认通常选择MIT);ruby

  • 3.库描述文件.podspec(本库的各项信息描述, 须要提交给CocoaPods, pod经过这个文件查找到你共享的库, .podspec文件的格式见第3点).bash

这一步分两种场景:

场景一:若是你已经有了现成的想要共享的文件,你只须要知足上面三个部分,便可上传到公有仓库便可继续其余的步骤;

场景二:你想要建立一个全新的工程去作本身的共享, 可使用终端命令:

pod lib create CollectionIndexToolsLib
复制代码

须要输入一些模板参数:

Cocoapods 会自动生成一个模板项目,目录结构:

CollectionIndexToolsLib
├── Example                                  #demo APP
│  ├── CollectionIndexToolsLib
│  ├── CollectionIndexToolsLib.xcodeproj
│  ├── CollectionIndexToolsLib.xcworkspace
│  ├── Podfile                              #demo APP 的依赖描述文件
│  ├── Podfile.lock
│  ├── Pods                                  #demo APP 的依赖文件
│  └── Tests
├── LICENSE                              #开源协议 默认MIT
├── Pod                                      #组件的目录
│  ├── Assets                            #资源文件
│  └── Classes                              #类文件
├── PodCollectionIndexToolsLib.podspec          #第三步要建立的podspec文件
└── README.md                                #markdown格式的README
复制代码

3.编辑.podspec文件

以CollectionIndexToolsLib.podspec为例:

Pod::Spec.new do |s|
  s.name             = 'CollectionIndexToolsLib'
  s.version          = '0.1.0'
  s.summary          = 'Custom IndexTools similar to TableViews index bar'

  s.description      = <<-DESC I believe you must have thought about adding an index like Table View to Collection View. I will give you one today. DESC

  s.homepage         = 'https://github.com/ReverseScale/CollectionIndexToolsLib'
  s.license          = 'MIT'
  s.author           = { 'ReverseScale' => 'reversescale@icloud.com' }
  s.source           = { :git => 'https://github.com/ReverseScale/CollectionIndexToolsLib.git', :tag => s.version.to_s }

  s.ios.deployment_target = '8.0'

  s.source_files = 'CollectionIndexToolsLib/Classes/**/*'
  
  s.requires_arc = true

end
复制代码

理论上前面的设置就能够经过验证,下面是注释参照:

Pod::Spec.new do |s|
  s.name            = "PodTestLibrary"    #名称
  s.version          = "0.1.0"            #版本号
  s.summary          = "Just Testing."    #简短介绍,下面是详细介绍
  s.description      = <<-DESC Testing Private Podspec. * Markdown format. * Don't worry about the indent, we strip it! DESC
  s.homepage        = "https://coding.net/u/wtlucky/p/podTestLibrary"                          #主页,这里要填写能够访问到的地址,否则验证不经过
  # s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" #截图
  s.license          = 'MIT'              #开源协议
  s.author          = { "wtlucky" => "wtlucky@foxmail.com" }                  #做者信息
  s.source          = { :git => "https://coding.net/wtlucky/podTestLibrary.git", :tag => "0.1.0" }      #项目地址,这里不支持ssh的地址,验证不经过,只支持HTTP和HTTPS,最好使用HTTPS
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' #多媒体介绍地址

  s.platform    = :ios, '7.0'            #支持的平台及版本
  s.requires_arc = true                  #是否使用ARC,若是指定具体文件,则具体的问题使用ARC

  s.source_files = 'Pod/Classes/**/*'    #代码源文件地址,**/*表示Classes目录及其子目录下全部文件,若是有多个目录下则用逗号分开,若是须要在项目中分组显示,这里也要作相应的设置
  s.resource_bundles = {
    'PodTestLibrary' => ['Pod/Assets/*.png']
  }                                      #资源文件地址

  s.public_header_files = 'Pod/Classes/**/*.h'  #公开头文件地址
  s.frameworks = 'UIKit'                  #所需的framework,多个用逗号隔开
  s.dependency 'AFNetworking', '~> 2.3'  #依赖关系,该项目所依赖的其余库,若是有多个须要填写多个s.dependency
end
复制代码

编写完成后, 咱们须要验证.podspec文件的合法性, 这里须要终端cd到.podspec文件所在文件夹, 执行: 忽视警告:--allow-warnings

pod lib lint CollectionIndexToolsLib.podspec
复制代码

若有警告或者错误请从新检查你的编写正确性,若是没有问题会出现:

-> CollectionIndexToolsLib (0.1.0)

CollectionIndexToolsLib passed validation.
复制代码

4.打tag, 发布一个release版本

一切准备就绪后, 咱们须要在你的git仓库里面存在一个与.podspec文件中一致的version, 这里你能够在你的git仓库中的releases一项去手动发布, 也能够在当前文件夹下使用终端命令:

git tag -m '🔖:Releasing tags.' '0.1.0'
git push --tag #推送tag到远端仓库
复制代码

成功以后便可在你的 releases 里面看到这个 tag 的版本.

5.发布本身的库描述文件podspec给cocoapods

一样在这个文件夹下, 终端执行: 忽视警告:--allow-warnings

pod trunk push CollectionIndexToolsLib.podspec
复制代码

将你的库文件.podspec文件提交到公有的specs上面, 这一步作的操做是验证你的podspec文件是否合法+提交到specs中(等同于fork;commit;push)+将上传的podspec文件转成json格式文件),成功后会出现Congrats信息。

成功上传后等待片刻就能够用查找命令找到你的库:

pod search CollectionIndexToolsLib
复制代码

6.往后维护更新开源库

若是有错误或者须要迭代版本,修改工程文件后推送到远端仓库后, 须要修改podspec中的版本号, 并从新打tag上传, 再进行新一轮的验证和发布. 若是在开发过程当中发现某基础组件存在 bug 须要更新 Pod,具体操做步骤以下:

  • 修改 podspec 文件中的 s.version;
  • 修复 bug 并对项目打 tag,tag 名称和 s.version 一直并 push 到远程仓库。
  • 验证 podspec 文件的有效性;
  • 推送 podspec 文件到远程仓库;
  • 执行 pod search RRCache 验证结果;

实用:组件化私有库

组件化的实用之处请参考《移动端 iOS 年终工做总结-纯干货请自备酒水》(juejin.im/post/5a934d…

私有Pod库和公有Pod库的建立方式没有什么区别, 不同的是管理他们的 spec repo 不同.

因此咱们须要本身建立一个跟CocoaPods/Specs相似的仓库来管理内部建立的Pod库的podspec文件, 供内部人员更新和依赖使用内部Pod组件库.

私有repo的构建形式有两种, 一种是私有git服务器上面建立,一种是本机建立.

本机建立请参考官方文档:Private Pods,

这里介绍的是在公司内部搭建的git服务器上面建立整个服务的方式.

1.建立一个git仓库用来作内部私有库的Spec Repo

在私有服务器一个仓库,一个用来存放全部共享库的podspec, 这里建立好以后的内部SSH协议地址是:gitee.com/WhatsXie/Li…, 花钱买git的私有仓库或者使用其余免费的第三方git服务(如Bitbucket等)建立的私有仓库给到的http/https地址也同样.终端输入命令:

pod repo add LibComponent https://gitee.com/WhatsXie/LibComponent.git
复制代码

将LibComponent添加到本地repo, 添加成功后能够在/.cocoapods/repos/目录下能够看到官方的specs:master和刚刚加入的specs:LibComponent

若是有其余合做人员共同使用这个私有Spec Repo的话在他有对应Git仓库的权限的前提下执行相同的命令添加这个Spec Repo便可.

2.建立私有Pod组件库

继续建立一个私有仓库,用来创建须要共享的内部组件, 以RSGuidePageLib为例:gitee.com/WhatsXie/RS… 能够建立示例工程, 像建立公有的库同样, 填写本身的podspec文件

Pod::Spec.new do |s|

s.name = 'RSGuidePageLib'

s.version = '0.3.0'

s.summary = 'Custom guide page package'

s.description = <<-DESC Swift implementation of the guide page package, support for multiple pictures and video guide page DESC

s.homepage = 'https://gitee.com/WhatsXie/RSGuidePageLib.git'

s.license = { :type => 'MIT', :file => 'LICENSE' }

s.author = { 'ReverseScale@icloud.com' => 'reversescale' }

s.source = { :git => 'https://gitee.com/WhatsXie/RSGuidePageLib.git', :tag => s.version.to_s }

s.ios.deployment_target = '8.0'

s.swift_version = '3.2'

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

s.requires_arc = true
复制代码

值得注意的是:podspec文件中的homepage和source不支持ssh协议地址,因此咱们得放入http/https地址.

与公有库的建立方式同样, pod lib lint Category.podspec验证成功以后push到仓库, 而后打tag发布release版本.

3.而后将podspec加入私有Sepc repo中

公有库使用trunk方式将.podspec文件发布到CocoaPods/Specs, 内部的pod组件库则是添加到咱们第一步建立的私有Spec repo中去, 在终端执行: --allow-warnings 忽略警告 --private 私有库

pod repo push LibComponent RSGuidePageLib.podspec
复制代码

添加成功以后LibComponent中会包含RSGuidePageLib库的podspec信息, 能够前往~/.cocoapods/repos下的LibComponent文件夹中查看, 同时git服务器中的远端也更新了.

移除私有Repo

pod repo remove [name]
复制代码

4.查找和使用内部组件库

执行pod search Category就能查到刚刚建立好的Category库了, 而后在想要使用此组件的工程的Podfile中加入pod 'Category', '~>1.0.1'便可使用内部组件啦!

值得注意的是:必须在Podfile前面须要添加你的私有Spec repo的git地址source, pod install时, 才能在私有repo中查找到私有库, 像这样:

# Uncomment the next line to define a global platform for your project

source 'https://github.com/CocoaPods/Specs.git'
source 'https://gitee.com/WhatsXie/LibComponent.git'

# platform :ios, '9.0'
target 'Demo' do

pod 'RSGuidePageLib', '~>0.3.0’ end 复制代码

通过测试, 这种方式能够把你的全部能够拆分出来的组件, 甚至是业务都来使用Pod管理, 这样达到了解耦和单项更新优化。 某些组件不影响老版本的依赖使用, 出现问题修改Podfile中的依赖版本便可随时回滚, 给开发了带来极大的便利。

参考连接:

相关文章
相关标签/搜索