iOS 组件化 CocoaPods操作

一、新建工程 GSComponent 作为壳工程

1、添加Podfile文件

cd 到你刚创建的工程目录下,执行以下语句

pod init

然后会发现你的工程目录下多了 Podfile 文件

2、生成 xcworkspace 工程

执行

pod install

3、新建一个Lib(自己起名)文件夹,用来存放组件库(其他独立工程)

然后 cd 到 Lib 下
执行

pod lib create GSNetworking

其中 GSNetworking 就是你自定义的一个工程名字,也就是你的其中一个组件或者业务模块

iOS ~> ObjC ~> Yes ~> None ~> Yes ~> GS

然后根据提示,生成 pod 工程模板

打开新建的 GSNetworking 工程里的 Example,可以看到 pods 里面,有个 ReplaceMe 的文件,意思就是要替换它,换成我们自己需要对外提供的类。

新建一个类,比如 GSNetworking,复制粘贴到 ReplaceMe 同级目录下,并删掉 ReplaceMe.m 文件

之后 cd 到 Lib/GSNetworking/Example/ 文件目录下,执行

pod install

这个时候在 Development Pods 文件下会多出这两个文件,这就是本地开发的 pods 文件

而 Podfile 的内容其实是

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

说明他获取的是本地路径
然后删除 Example for GSNetworking 里面的 GSNetworking 类,不然运行会因为类重复报错。
至此,一个组件的本地库就创建完成了。

二、壳工程使用本地组件库

首先 cd 到壳工程 GSComponent 目录下,修改 GSComponent 的 Podfile 文件,增加
pod 'GSNetworking', :path => 'Lib/GSNetworking'

执行

pod install

这样壳工程就 pod 到本地组件库的内容了,原理跟使用平时的第三方远程库一样。只不过这次使用的是本地的。只不过本地的 pod 放在了 Development Pods 文件夹里面,这个文件夹里的内容其实是可以修改的,修改后立刻生效,会比远程 pod 需要提交版本号,本地再 pod 对应的版本号方便得多。
我们再用同样方法创建另一个本地工程,登录模块 GSLogining
但是这个模块需要依赖 GSNetworking,所以我们得在两个地方添加依赖

由于依赖的 GSNetworking 在更上一层的文件中,所以需要../../
执行

pod install

之后应该能看到 Development Pods 里已经有2个文件夹了

这个时候就可以 import 里面的类,在本地使用了。

三、关联 git

完成了本地 pod 依赖,但是我们肯定不会是个人开发,否则弄这个组件化的意义也不大,所以我们首先得提交到远程,一般公司里都会搭建私有仓库诸如GitLab,这里就拿 GitHub 来做演示。

1)提交壳工程到远程

首先,在 GitHub 上 Create a new repository

然后,cd 回壳工程目录下,依次执行

git init

初始化 git

git add .

执行 git add . 的时候,会发现警告 warning: adding embedded git repository: Lib/GSLogining 之类的,是因为 GSLogining 目录下有它自己的 git 仓库,它俩是独立存在的,有另外一个 git 仓库专门管理他,因为它也是一个完整的独立工程,这里我们先忽略它。
然后,提交初始化工程

git commit -m "init project"

接下来,我们要让这个工程和刚才在 GitHub 上创建的 Repository 关联

git remote add origin https://github.com/GSNICE/GSComponent.git

然后,提交初始化工程到远端的 master,这里我们用了-f,表示强制提交,否则因为 GitHub 上还有 README 之类的文件,需要解决冲突再 pull,比较麻烦,基于是初始工程,直接强制 push 上去即可。

git push origin master -f

刷新一下 GitHub 上的 GSComponent,会看到已经提交上去了

image.png

2)提交子工程到远端

使用跟提交主工程一样的做法,分别在 GitHub 上 Create a new repository,然后把他们关联起来

唯一和壳工程不同的是,他们是组件,需要对外提供依赖关系。所以我们还得多做一步操作,那就是增加 podspec 文件。

以 GSNetworking 为例,cd 到 GSNetworking 目录下,执行

git tag 0.1.0
git push --tags

刷新一下 GitHub 上的地址,会看到多了一个 release

这个 tag 分支就是将来提供给别人依赖的版本号分支,有了它,别人使用你的组件的时候就可以根据版本号来控制了。

接下来,使用 trunk 方式将代码发布到 CocoaPods 上
首先先编辑一下 podspec 文件

因为是 Networking 我们这里会依赖 AFNetworking,所以顺带打开默认被注释的

s.dependency 'AFNetworking', '~> 2.3'

改好后,在上传之前,最好先本地检查一下 podspec 是否合法
执行下面语句

pod lib lint GSNetworking.podspec --verbose

如果出现 passed validation,说明通过,可以提交到 cocoapods 上了

在进行 trunk 操作 push 到 cocoapods 上前可以进行邮箱的注册来防止后面遇到邮箱相关的问题错误

  1. 执行命令:pod trunk register 'sdjngcb@gmail.com' 'Gavin' --description='MackBook Pro'

  2. 在自己邮箱里面去点击,那个邮件里面的连接,就可以了(如果找不到那个邮件,多等个几分钟的。或着去垃圾箱中找找,有可能是腾讯把他等垃圾邮件了)

执行

pod trunk push GSNetworking.podspec --verbose

成功后,就可以 pod search 到我们提交的库了
ps:如果搜不到,不是没传成功,是我们的本地搜索库没更新,可以先删除~/Library/Caches/CocoaPods 目录下的 search_index.json 文件或者 pod repo update 一下
终端执行

rm ~/Library/Caches/CocoaPods/search_index.json

再执行

pod search GSNetworking

这样,本地库就会变成远程库,我壳工程的 podfile 文件就可以改成
pod 'GSNetworking',而不再需要后面的 path 了

重新对壳工程 GSComponent 进行 pod install 之后,会发现,原来的 GSNetworking 文件已经从 Development Pods 里跑到 Pods 里去了

一些注意点:

1)如果 pod trunk push 上去的 podspec 文件,如果有依赖库,这个依赖库必须是在 cocoapods 上,即使是不能依赖本地库,而是远程库。所以说,比如刚才创建的 GSNetworking 和 GSLogining,如果要发布GSLogining 到 cocoapods,但是由于 GSLogining 是依赖于 GSNetworking 的,所以要首先将 GSNetworking 提上到 cocoapods 上,否则 GSLogining是提不上去的。

2)由于壳工程和子工程都有独立存在的 git,所以别人从壳工程的 git 地址 clone 下来的工程,是没有子工程的存在的。如果想运行起来壳工程,要么是所有的子工程都已经提到 cocoapods 上,要么是拿到子工程的 git 地址,checkout 到本地壳工程的 Lib 库下。

3)如果你不想每建立一个子工程,都要到 Github 或者 GitLab 上创建一个 repository 的话,又想把子工程 push 到壳工程的 git 上的话,可以先把子工程里的 git 删除,这样 push 上的壳工程代码,就会带上子工程了,等你需要单独管理子工程的时候,再把 git 加回去即可。

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

推荐阅读更多精彩内容