cocoapods组件化-创建你的公有库/私有库

为什么要用?

1.合作方便:项目越来越大,开发人员越来越多,功能点互不干扰的情况,要加载整个项目运行起来是耗时的,比如天猫淘宝支付宝。组件化就是把功能模块拆分,你只要负责自己实现的部分做成库就好,有需要的人就可以拉取加载。就算你更新了某些功能,其他使用者只要pod update xxxx(你的库)就好了不要太方便。
2.自己方便:可以把常用的功能封起来,供自己的其他项目使用。

是什么?

CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over 71 thousand libraries and is used in over 3 million apps. CocoaPods can help you scale your projects elegantly.

译:
CocoaPods是Swift和Objective-C Cocoa项目的依赖管理器。它拥有超过71000个库,被300多万个应用程序使用。CocoaPods可以帮助你优雅地扩展你的项目。

文件解释:
  1. \color{#ea4335}{podspec:} Pod描述文件,一般来说表征你的项目地址,项目使用的平台和版本等信息
  2. \color{#ea4335}{Podfile:} 用户编写的对于期望加载的pod以及对应Target信息
  3. \color{#ea4335}{Podfile.lock:} 记录了之前pod加载时的一些信息,包括版本、依赖、CocoaPods版本等
  4. \color{#ea4335}{Mainfest.lock:} 记录了本地pod的基本信息,实际上是Podfile.lock的拷贝。大部分开发者最熟悉的cocoaPods指令就是pod install,那具体在执行pod install时发生了什么呢?
    • 分析Dependency。对比本地pod的version和podfile.lock中的pod version,如果不一致会提示存在风险。对了,cocoapods可以多版本存在,只要在pod _x.x.x_ install就能指定版本初始化。
    • 对比podfile是否发生了变化。 如果发生变化,会生成两个列表,一个是需要Add的Pod(s),一个是需要Remove的Pod(s)。
    • 添加需要的Pod(s)。如果是常规的基于GiCocoaPods库,则:
      a. Spec下查找对应的Pod文件夹
      b. 找到对应的tag
      c. 定位其Podspec文件
      d. copy到Pod文件夹中
      e. 运行pre-Install hook
    • 生成Pod Project
      a. 将该Pod中对应文件添加到工程中
      b. 添加对应的framework、.a库、bundle等
      c. 链接头文件(link headers),生成Target
      d. 运行 post-install hook
    • 生成podfile.lock。生成此文件副本manifest.lock,放到Pod文件夹内。The sandbox is not sync with the podfile.lock 这种错误,则表示manifest.lock和podfile.lock文件不一致),此时一般需要重新运行pod install命令。
    • 配置原有的project文件(add build phase)
      a. 添加了 Embed Pods Frameworks
      b. 添加了 Copy Pod Resources

pre-install hookpost-install hook可以理解成回调函数,是在podfile里对于install之前或者之后(生成工程但是还没写入磁盘)可以执行的逻辑,逻辑为:

pre_install do |installer| 
    # 做一些安装之前的hook
end

post_install do |installer| 
    # 做一些安装之后的hook
end

再具体的就不说了,大家去看看这个大佬写的文章,我的文章也摘了一些他写的部分,非常的好和详细,推荐给你们:
《基于CocoaPods的组件化原理及私有库实践》

怎么做?

此处以ZYUIToolsPod为例。

1. 通过CocoPods的官方命令来进行Pod项目的创建,

pod lib create HelloXXXPod

1.What platform do you want to use? [ iOS / macOS ]
应用在哪个平台上,一般我们选iOS

2.What language do you want to use? [ Swift / ObjC ]
使用何种语言,可以根据项目是OC还是Swift自行选择

3.Would you like to include a demo application with your library? [ Yes / No ]
问是否需要一个Demo工程,方便调试Pod。

2. ZYUIToolsPod.podspec
Pod::Spec.new do |s|
  s.name             = 'ZYUIToolsPod'
  s.version          = '0.2.0'
  s.summary          = 'Some UI Methods'
  s.description      = <<-DESC
Some encapsulated UI extension methods, and the usual String methods。
                       DESC

  s.homepage         = 'https://github.com/NULLGIRL/ZYUIToolsPod'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'NULLGIRL' => '422453403@qq.com' }
  s.source           = { :git => 'https://github.com/NULLGIRL/ZYUIToolsPod.git', :tag => s.version.to_s }
  s.ios.deployment_target = '10.0'

  s.source_files = 'ZYUIToolsPod/Classes/**/*.swift'
  s.swift_version = '4.2'

  s.frameworks = 'UIKit', 'CoreText', 'Foundation'
  s.dependency 'SVProgressHUD','2.2.5'
end

重点的几个:

s.name : 库名
s.version : 版本号,每次更新的时候需要更改
s.homepage : 主页路径
s.source : 仓库地址
s.source_files : 文件(如果不放在Classes下,记得要改)
s.swift_version : swift 版本号, 本来没写这行出错了
s.frameworks : 依赖的苹果库
s.dependency : 依赖的第三方库

3. 本地调试:

把需要用到的库文件,拉到ZYUIToolsPod/ZYUIToolsPod/Classes下。

如果是通过pod lib create命令创建的Pod,会在Example中自动配置好该pod的本地调试脚本,如下:

use_frameworks!

target 'ZYUIToolsPod_Example' do
  pod 'ZYUIToolsPod', :path => '../'

  target 'ZYUIToolsPod_Tests' do
    inherit! :search_paths
  end
end

pod 'ZYUIToolsPod' :path => '../' ,在上层目录来下载ZYUIToolsPod这个pod。这是本地调试Pod的一种。

来到ZYUIToolsPod/Example/ 路径下 执行:pod install后打开工程,这时候你的文件就被加载啦。

库文件

库使用

注意: swift的class权限用用public修饰。

以上没问题后,本地验证:

pod lib lint ZYUIToolsPod.podspec
4. 上传到github上

在github上创建一个仓库,https://github.com/NULLGIRL/ZYUIToolsPod.git

来到项目的根目录:

git add .
git commit -m "Init"
git remote add origin xxxxxxx  //(替换为自己的实际git地址)
git push --set-upstream origin master

\color{red}{注意:}podSpec文件需要版本控制信息,所以我们要打一个Tag.

git tag -m  "v0.1.0"  0.1.0
git push --tags
5. 向Spec Repo提交podspec

引用cocoapods官网:

pod trunk push [NAME.podspec] will deploy your Podspec to Trunk and make it publicly available. You can also deploy Podspecs to your own private specs repo with pod repo push REPO [NAME.podspec].

验证库:

 pod spec lint [NAME.podspec]

如果你只是做一个私有库:

 pod repo push ZYUIToolsPod ZYUIToolsPod.podspec --allow-warnings

如果你要做一个公有库,用pod trunk

pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook air' 
# 先注册 , 会给邮箱发一封邮件,点击链接激活
  //查看有没有注册,有的话就是相关的注册账号的信息
pod trunk me
pod trunk push  [NAME.podspec]
pod trunk add-owner ARAnalytics kyle@cocoapods.org
 #添加其他管理者

成功:


成功上传
6.查查看

pod search ZYUIToolsPod


搜索结果
7.更新版本
 #`s.version`    : 版本号,每次更新的时候需要更改
s.verion = 0.2.0
git add .
git commit -m "更新"
git push 
git tag -m  "v0.2.0"  0.2.0
git push --tags
pod trunk push  [NAME.podspec]
8.使用

在podfile文件内记得加上source源地址(私有库的使用需要)

source 'https://github.com/CocoaPods/Specs.git'
source 'https://xxxxxxxx'

platform :ios, "9.3"
inhibit_all_warnings!

target "NinthWallet" do
  use_frameworks!
  
  pod 'ZYUIToolsPod'
end

问题集锦

  1. Unable to find a pod with name, author, summary, or description matching
    首先去https://cocoapods.org 首页查找是否有你的库,
    如果没有就真是没有,如果可以搜索的话,说明这个库是成功上传的。因为pod的缓存问题,把缓存的索引文件删除。
 rm ~/Library/Caches/CocoaPods/search_index.json
pod search ZYUIToolsPod

2.An unexpected version directory 'Classes' was encountered for the
来到~/.cocoapods/repos/目录下,把你的库文件ZYUIToolsPod给删除了,这是在example例子里,被拷贝进来的。可能会和search_index里的冲突了(我猜的,有知情的人可以讲讲)。之后

rm ~/Library/Caches/CocoaPods/search_index.json
pod search ZYUIToolsPod
  1. pod trunk push成功,也给出了链接路径,但是在cocoapods官网就是search不到。
    比如我之前,https://cocoapods.org/pods/ZYUIToolsPod ,明明已经存在,但是在https://cocoapods.org搜不到,百思不得其解,所有的步骤都跟官网的一样。后来才发现,是因为我在pod trunk regeist这一步,官网给我发了个邮件,我点击链接,但是当时失效了,我没有在意,毕竟失效了我的库还是传上去了,(没想到变成了一个“野库”)。
    屏幕快照 2020-03-27 下午2.59.14.png

后来我又pod trunk regiest了一遍,又给我发了一新的邮件,我点击,这回激活成功了,我的库也能搜索到了。


屏幕快照 2020-03-27 下午2.59.22.png
  1. Unable to find the 'specs' repo. If it has not yet been cloned, add it via 'pod repo add'.
    解决方法:
pod repo add [库名称] [库地址]
#eg :  pod repo add ZYUIToolsPod https://github.com/NULLGIRL/ZYUIToolsPod.git
闲人庄大姐

我干了,你随意🍺🍺🍺

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

推荐阅读更多精彩内容