iOS组件化(一)-利用CocoaPods拆分项目和私有化

Cocoapods 执行流程

其实利用CocoaPods拆分项目就是根据业务和项目情况,就是把项目分成一个一个子项目,然后通过CocoaPods去将子项目打包成子工程,在主工程里面去引入子工程。

在利用CocoaPods实现拆分项目,并私有化组件之前先说一下CocoaPods 和 远程仓库的关系


QQ20200514-220501.png

CocoaPods中有一个Spec Repo的概念,Spec Repo 就是一个索引库。里面有很多podSpec索引,podSpec 是库的描述文件,里面记录着库的描述,版本,地址,依赖库等信息。注意不要混淆Spec Repo和podSpec的概念

在我们安装CocoaPods的时候,会把远程索引库master拉到本地,所以我们本地会有一个索引库master。当我们执行pod install的时候会去索引库master查找Podfile文件里面库对应的PodSpec,找到后会根据PodSpec找到对应的远程仓库。找到远程仓库后会把代码clone到本地缓存起来,然后copy到我们的工程中。


利用CocoaPods 生成模块以及将模块私有化

利用CocoaPods私有组件其实就是把远程共有索引库这一部分去掉


QQ20200524-164335.png

利用CocoaPods 拆分项目并私有化的流程如下

  1. 本地新建一个索引库,并上传到远程仓库上

  2. 利用Cocoapods命令创建子模块,把业务代码搬到子模块上,把子模块上传到远程仓库取

  3. 验证子模块是否符合Cocoapods的规范,如果符合,则推送到索引库

接下来一步一步去说明

1. 本地新建一个索引库,并上传到远程仓库上

首先上git新建一个索引库


QQ20200514-232541.png

注意上图中红色箭头所指向的地方要勾选上,不然后面推送索引库有可能报以下错误

Your configuration specifies to merge with the ref 'refs/heads/master'
from the remote, but no such ref was fetched.

克隆到本地后执行 pod repo add[索引库名称][索引库地址],如下


pod repo add SFRepoCenter https://github.com/samstring/SFRepoCenter.git

这时候 进入 ~/.cocoapods/repos 中就可以看到与远程仓库关联的本地索引库


QQ20200514-233759.png

这时候一个私有的索引库就创建完毕

2 利用Cocoapods命令创建子模块,把业务代码搬到子项目上,把子项目上传到远程仓库取

在GitHub上新建一个子模块SFCommonKit

利用Cocoapods官方命令 pod lib create [模块名称] 创建子模块


pod lib create SFCommonKit

这时候会问你几个问题


1.What platformdoyou want to use?[iOS/macOS] //将模块应用到什么平台上

2.What languagedoyou want to use?[Swift/ObjC] // 模块的开发语言

3.Would you like to include a demo applicationwithyour library?[Yes/No] //是否生成demo应用,这里建议生成,因为你可以在这里进行测试

4.Which testing frameworks will you use?[Specta/Kiwi/None] //是否集成测试框架

5.Would you like todo view based testing?[Yes/No]

6.What is your class prefix?  //开发前缀

执行完毕会生成以下文件


QQ20200514-235817.png

源文件里面的文件结构是这样的


QQ20200515-000802.png

这时候把我们讲子模块的类放到Classes文件夹,在Example工程里面pod install后就可以进行开发测试了,另外注意一下pod install后的导入Example里面的pod会放在Development Pods这个目录如下
QQ20200515-001124.png

开发完成后,我们需要查看SFCommonKit.podspec这个文件了,文件内容如下

#
# Be sure to run `pod lib lint SFCommonKit.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
  s.name            = 'SFCommonKit'
  s.version          = '0.1.1'
  s.summary          = 'A short description of SFCommonKit.'
# This description is used to generate tags and improve search results.
#  * Think: What does it do? Why did you write it? What is the focus?
#  * Try to keep it short, snappy and to the point.
#  * Write the description between the DESC delimiters below.
#  * Finally, don't worry about the indent, CocoaPods strips it!
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC
  s.homepage        = 'https://github.com/samstring/SFCommonKit'
  # s.screenshots    = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author          = { 'samstring' => '1264986115@qq.com' }
  s.source          = { :git => 'https://github.com/samstring/SFCommonKit.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/'
  s.ios.deployment_target = '8.0'
  s.source_files = 'SFCommonKit/Classes/**/*'

  # s.resource_bundles = {
  #  'SFCommonKit' => ['SFCommonKit/Assets/*.png']
  # }
  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
   s.dependency 'AFNetworking', '~> 2.3'
end

其中,下面几个内容需要注意的

s.name  模块名称,将来pod install的名称是依据这个来的
s.version 模块版本,将来pod install的版本是依据这个来的
s.homepage 模块的主页
s.source 模块的远程仓库地址
s.frameworks 引用的系统库,如果用了静态库 ,验证的时候需要加--use-libraries
s.dependency 引用的第三方,如有多个,可以重复声明

检查完podspec确认无误后就可以就可以上传到远程仓库上了

git add .
git commit -m "初始化"
git remote add origin [远程仓库地址]
git push --set-upstream origin master

上传成功后需要加tag标志,注意一下这个tag标志需要与上面说到的s.version里面的版本号保持一致

git tag 0.1.0
git push --tags

3. 验证子模块是否符合Cocoapods的规范,如果符合,则推送到索引库

上传到成功后,我们就可以使用CocoaPods命令 pod lib lint 验证这个工程是否符合

pod lib lint SFCommonKit.podspec --allow-warnings

如果有依赖的静态库需要添加 --use-libraries

pod lib lint --use-libraries --allow-warnings

如果有依赖的其他私有库,需要加上--sources,如下

pod lib lint --sources='https://github.com/samstring/SFRepoCenter.git,https://github.com/CocoaPods/Specs.git' --allow-warnings 

其中sources='https://github.com/samstring/SFRepoCenter.git,https://github.com/CocoaPods/Specs.git'中有两个值,一个是CocoaPods的索引库,一个是引用的私有库所在的私有化的索引库。

如果有依赖的私有库,sources里面需要加上索引库的仓库地址,这里是https://github.com/samstring/SFRepoCenter.git

如果你的库不是私有库,是发布到了Cocopods的trunk(可以供所有人下载),或是你的这个私有库里面包含了一些像AFNetworking的第三方,sources里面需要添加https://github.com/CocoaPods/Specs.git

其实,上面验证这一步可以不做,可以直接向Spec Repo提交podspec的命令pod repo push [索引库] [库配置文件] --allow-warnings,因为这样做的话会自动帮我们去验证是否合法

pod repo push SFRepoCenter SFCommonKit.podspec --allow-warnings

到此,CocoaPods私有化已经完成,通过pod search SFCommonKit就可以搜索到我们刚才提交的私有库了


怎样使用刚才所生成的私有库

如果要在外部工程中使用刚才的私有库,需要指定索引库,否则只会默认在Cocopods 的master索引库去找,但是由于是私有库,所以会找不到我们所以库。那怎么制定所以库呢?其实只需要在Podfile中加入索引库即可,例子如下

use_frameworks!
platform :ios, '9.0'
source 'https://github.com/samstring/SFRepoCenter.git'
source'https://github.com/CocoaPods/Specs.git'
target 'SFMainProject' do
pod 'SFCommonKit'
pod 'SFUserModule'
end

注意,添加私有库索引的时候最好把master索引库也加上,否则会找不到master索引库里面的工程,如后期需要加入AFNetworking等第三方的时候会报找不到库的错误。

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