cocpods实现组件化:流程、命令、注意点等

一、前言

在日常项目开发过程中,不管是单一产品线还是多个产品线的开发团队项目,都需要统一对通用的工具类、通用的业务模块进行解耦抽离,这样才能保证项目结构的健壮性以及可重塑造性。那么对于这些模块,如何才能更好的实现管理? 就需要借助是iOS平台当前最流行的包管理工具- Cocoapods

本文主要介绍如何通过cocoapods的方式实现工具类私有库、公有库、和Framework的过程。

本文图解:


image.png

条件准备:

二、注册Cocoapods账户

想要创建一个开源pod库, 首先我们需要注册CocoaPods,基于Cocoapods已经安装好的前提下,这里是使用trunk 方式,只需要在终端执行:

pod trunk register 邮箱地址 '用户名' --verbose

如: pod trunk register xxxxxx@qq.com 'allenlas' --verbose
复制代码

一般会使用GitHub邮箱和用户名,当然这个可以自由选择,注册之后,在邮箱中会收到确认邮件,在浏览器中点击链接确认即注册成功, 成功之后可以终端执行:

pod trunk me    //检测是否注册成功
复制代码

查看注册信息,以后可以使用该开源Pod库发布工具,也可以通过此方式查看已经发布过的pods:

AllenLASdeMac-Pro:~ allenlas$ pod trunk me
  - Name:     yourname
  - Email:    youremail@qq.com
  - Since:    December 11th, 2017 02:29
  - Pods:
    - XKCocoapods
  - Sessions:
    - December 11th, 2017 02:29 -     April 24th, 2018 20:34\. IP: 113.119.196.232 Description:
    macbook mini
AllenLASdeMac-Pro:~ allenlas$ 
复制代码

二、公有库和私有库

公有库和私有库差异化:
创建公有Pod库或者私有Pod库, 实际上原理是一样的, 都是基于git服务和repo协议。
不一样的是, 两者的版本索引查询方式不一样,公有库的podspec由CocoaPods/Specs管理,而内部私有使用的pod库需要自己建立一个仓库来管理podspec.
复制代码
2.1 搭建公有仓库
Cocoapods是托管在Github平台上的,所有的Pods也都是托管在github上,所以本文也基于Github平台的方式制作公有库,目前Github也支持免费创建私有仓库,其用法和公有库大体相同
复制代码
创建仓库
image.png
信息详解:
   1\. Repository name:  开源库的名字 (必填)

   2\. Description : 开源库的功能作用描述

   3\. Public: 开源仓库

   4\. Private: 私有仓库,收费(如果是公司内部使用的话这里推荐大家使用私有的仓库)

   5\. Initialize this repository with a README: readme文件,建议勾选进行创建,这是对该库完整的一个说明文档

   6\. gitgnore: 看情况自行选择类型

   7\. License类型: MIT License (建议使用)
复制代码
添加tag:
创建仓库成功后,可以在其主页,选择release,添加tag

Repository主页 -> release -> create tag
复制代码

如下:

image.png

所有信息准备完全之后,可以通过客户端GitHub Desktop,将项目clone到本地。

2.2 基于cocoapods 自动创建工程
命令:
pod lib create 项目名称
复制代码

在clone下来的项目目录路径下,打开终端,执行:

AllenLASdeMac-Pro:~ allenlas$ cd /Users/allenlas/Documents/GitHub/XKCocoapods
AllenLASdeMac-Pro:~ allenlas$ pod lib create XKCocoapods
复制代码

执行结果如下:

image.png

<figcaption></figcaption>

问题模版详解:
# 你想使用哪个平台?
1、What platform do you want to use?? [ iOS / macOS ]
iOS
# 库语言选择?
2、What language do you want to use?? [ Swift / ObjC ]
ObjC
# 是否需要一个demo工程,用于调试Pod?
3、Would you like include a demo application with your library? [ Yes / No ]
Yes
# 你要使用哪个测试框架?
4、Which testing frameworks will you use? [ Specta / Kiwi / None ]
None
# 是否要UI测试?
5、Would you like to do view based testing? [ Yes / No ]
NO
# 类名前缀?
6、What is your class prefix?
XK
复制代码
项目结构如下:
image.png

当然对于项目结构包含多一层模版文件,基于结构简洁,可以将项目的所有文件上升一个级别,直接在本地仓库的根路径下:

image.png
2.3 配置podspec

信息详解:

Pod::Spec.new do |s|
  #库名称
  s.name             = 'XKCocoapods'

  #指定支持的平台和版本,不写则默认支持所有的平台,如果支持多个平台,则使用下面的deployment_target定义
  spec.platform = :ios

  #版本号
  s.version          = '1.0.0'

  #库简短介绍
  s.summary          = 'iOS 公有库'

  #开源库描述 
  s.description      = <<-DESC
TODO: iOS 公有库制作
                       DESC

  #开源库地址,或者是博客、社交地址等
  s.homepage         = 'https://github.com/ryanmans/XKCocoapods'

  #开源协议
  s.license          = { :type => 'MIT', :file => 'LICENSE' }

  #开源库作者
  s.author           = { 'ALLen、LAS' => 'xxxxxx@gmail.com' }

  #开源库GitHub的路径与tag值,GitHub路径后必须有.git,tag实际就是上面的版本
  s.source           = { :git => 'https://github.com/ryanmans/XKCocoapods.git', :tag => s.version }

  #社交网址
  s.social_media_url = 'https://juejin.cn'

  #开源库最低支持
  s.ios.deployment_target = '8.0'

  #源库资源文件
  s.source_files = 'XKCocoapods/Classes/**/*'

  #是否支持arc
  s.requires_arc = true

  #依赖系统库
  s.frameworks = 'Foundation'

  #开源库依赖库
  # s.dependency "Masonry", "~> 1.0"

  #添加系统依赖静态库
  #s.library = 'sqlite3', 'xml2'

  #添加依赖第三方的framework
  #s.vendored_frameworks = 'XXXX/XXXX/**/*.framework'

  #静态库.a
  s.vendored_library = 'XXXX/XXX/XXX.a', 'YYY/YYY/Y.a'

  #添加资源文件
  #s.resource = 'XXX/XXXX/**/*.bundle'

  #在 podspec 文件中添加 s.static_framework = true,CocoaPods 就会把这个库配置成static framework。同时支持 Swift 和 Objective-C
  #s.static_framework = true
end
复制代码

正式信息如图示:

image.png
引入工具类(即我们要打包的组件工程文件)
进入根路径下的`XKCocoapods`下的Classes文件,将需要使用的XKCocoapods.h/m文件放入其中
复制代码

并在Example目录路径下,打开终端:

image.png

从上述信息中,可以看到工具类以及其所依赖的类库,已成功的添加到 演示的demo 项目中使用。

配置完 podspec的信息 且引入类库之后,需要更新提交到Github上,不然会验证上一次提交的信息
复制代码
2.4 验证podspec
命令:
1\. pod lib lint --allow-warnings

2\. pod spec lint --allow-warnings
复制代码

验证结果如图示:

image.png

验证过程中,可能会遇到常见错误:

- ERROR | [iOS] file patterns: The `source_files` pattern did not match any file
复制代码

此错误的原因是没有找到匹配的文件

解决办法:

1\. 终端执行命令:

open /Users/allenlas/Library/Caches/CocoaPods/Pods/External/XKCocoaPods

2\. 进入最近一个日志文件,将工具类放置和source_files文件路径对应的Classes目录中

  XKCocoapods文件-> classes目录 -> 添加XKCocoapods类
复制代码

如图示:

image.png

此问题原因:
很可能是自己的source_files路径错了。比如工程路径上面还有一层文件夹。
如果路径没错,则去更新库的版本号(不要一直在一个版本号上验证),并推到远端仓库。重新进行验证,一般都可通过。

更新提交代码,重新验证 podspec 文件的可行性。

2.5 推送podspec到远程仓库
命令:
pod trunk push xxxxx.podspec 
复制代码

如果尚未注册过Cocoapods账户,则需要参考上述方式,进行注册:

pod trunk register 邮箱地址 '用户名' --verbose

pod trunk me
复制代码

然后再将podspec 推送至远程仓库

如图示:

image.png
2.6 检查项目podspec是否上传成功
命令:
pod search xxxx(上传的项目名称)

如: pod search XKCocoapods
复制代码
常见错误:
[!] Unable to find a pod with name, author, summary, or description matching `XKCocoapods`
复制代码

解决方式:

需要更新本地的repo
执行命令 pod setup 或者 删除本地的搜索索引 rm ~/Library/Caches/CocoaPods/search_index.json
,再次执行 pod search XKCocoapods
复制代码

搜索成功后如图示:

image.png

三、制作framework

在制作公有库的过程,如果需要将添加进去的工具类打包成可运行的framework,则需要借助插件cocoapods-packager

安装命令:
sudo gem install cocoapods-packager
复制代码
3.1 打包podspec文件
命令:
# pod package 项目名.podspec  --library --force    打包成.a文件。--force是指强制覆盖

# pod package 项目名.podspec  --force              打包成.framework文件
复制代码
配置podspec文件:
//添加需要集成的framework
s.ios.vendored_frameworks = 'XKCocoapods/Classes/XKCocoapods.framework'
复制代码

如图示:

image.png

进入项目的根路径下,打开终端执行命令:

AllenLASdeMac-Pro:~ allenlas$ cd /Users/allenlas/Desktop/XKCocoapods
AllenLASdeMac-Pro:~ allenlas$ pod package XKCocoapods.podspec
复制代码

执行结果如图示:

image.png

打包之后,本地会多出一个XKCocoapods-1.0.0 文件

image.png

在其目录下ios文件中,拷贝XKCocoapods.framework , 将其放置 Classes 下,提交更新代码

image.png
注意: 每次有新的内容修改,记得在github新增tag,并修改podspec中的版本号,才验证podspec
复制代码

重新验证podspec

补充:

公司私有库如不想放在github,可在相应的地方(如公司私有gitlab),创建自己的podspec工程仓库(一个空仓库,假设名字叫做myspec),假设它的地址是https:a。
则需要使用命令添加spec源:
pod repo add myspec https:a

然后使用以下命令把spec文件推到这个仓库中(假设我们的SDK的spec文件名字叫mysdk.podspec):
pod repo push myspec mysdk.podspec --allow-warnings --use-libraries --verbose

pod install使用时,添加源地址https:a 到 podfile 中即可。

另外:对于gitlab,如果只允许ssh的方式访问,则需要注意相关地址都要使用ssh的地址,包括spec文件中的s.source 地址 和上面 add 时的地址、podfile中的私有源地址。

本来想总结一片比较全的cocopods流程,不过查到了此文,感觉不能出其右。遂copy之,以作笔记。仅对私有库做了补充。
原文地址:https://juejin.cn/post/6844903925695381518

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容