iOS组件化 (pod私有库,包含静态库)

因项目业务的不断发展,应用的代码体积越来越大,代码耦合也较为严重,所以考虑先对各模块进行解耦,然后通过pod私有库来进行管理,如此每一个模块都可以单独运行。这篇文章就详细介绍如何建立远程pod私有库,以及使用。

创建远程私有库有以下几个步骤:

  • 创建一个远程仓库,作为私有的repo索引库
  • 创建一个远程仓库,作为我们需要封装的模块组件仓库(存放待封装的项目文件,需要拆分成几个模块就要需要几个仓库,这里以一个为例)
  • 添加文件到组件仓库,配置 pod.spec 文件,并上传至pod远程私有库
  • 添加tag,并推送至远端私有库(tag要与.podspec文件中的version保持一致)
  • 向私有的Repo索引库提交podspec
  • pod私有库的使用
  • pod私有库的更新

1. 创建两个远程仓库

创建YMSpecRepo远程仓库,用来作为索引库。
创建YMCommonViewLib远程仓库,用来存放项目工程文件。(YMSpecRepo和YMCommonViewLib是我为了让大家看的更清楚设的名字)

2. 创建spec Repo 本地索引

打开终端,在终端切换到 ~/.cocoapods/repos 目录下,然后进行pod repo add repoName http://******* 操作 (repoName为索引库名称,自定义即可,我这里就是YMSpecRepo,后面的链接为刚创建的远程索引库地址)
在终端输入:

添加本地索引库.png

这时本地的索引库已经创建好了


本地索引库.png

3. 创建pod私有库的所需的项目工程文件

cd 到一个你需要创建项目的目录下,执行pod lib create YMCommonViewLib
这里应该会提示让你设置几个问题,简单设置下即可

创建pod私有库

显示成功之后应该会自动打开创建好的项目。
打开下图目录,可删除自动生成的ReplaceMe文件,然后手动拖入项目文件
添加项目文件.png

接下来cd 到Example目录下,执行pod install,如果跳过这一步,会出现很多问题。
image.png

然后就是对podspec文件进行配置,如下图
podspec文件

配置podspec文件

配置podspec文件

主要有name,version,homepage,license,author,source,deployment_target, source_files,依赖库等

注意:homepage和source要设置成创建好的私有库的远程仓库地址,并非索引库的仓库地址

修改完成后,cd 到YMCommonViewLib目录下,即Example所在目录,再次执行pod install,然后验证podspec文件
pod lib lint YMCommonViewLib.podspec //进行本地验证文件有效性。


验证podspec文件

可能会有警告导致失败,说的是描述信息过短,可以在执行时添加跳过警告即可
pod lib lint YMCommonViewLib.podspec --allow-warnings


跳过警告
  • 验证及推送常用的补充命令
    --allow-warnings //Allows push even if there are lint warnings
    --use-libraries //Linter uses static libraries to install the spec
    --swift-version=VERSION T//he SWIFT_VERSION that should be used to lint the spec.
    This takes precedence over a .swift-version file.
    --skip-import-validation //Lint skips validating that the pod can be imported
    --skip-tests //Lint skips building and running tests during validation
    --silent //Show nothing
    --verbose //Show more debugging information
    --no-ansi // Show output without ANSI codes
    --help // Show help banner of specified command

接下来就要将本地的项目与远端库建立连接,使用git remote add origin 远程仓库地址 // 将本地项目与远程仓库关联


与远程库建立连接

这里推送可能会失败
可能会出现下图情况


image.png

重新输入如下命令:
git pull origin master --allow-unrelated-histories,如果有冲突,就修改下冲突再提交,修改冲突可到sourceTree中修改,较直观,之后就再次提交。

这里先git add . 添加文件跟踪,然后git commit -am "提交" 提交本地暂存,然后再推送远端git push,可能会出现
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

git push --set-upstream origin master

那就根据提示git push --set-upstream origin master


推送远端

推送到远端之后我们还要打tag,具体如下图,不过推荐使用sourceTree,两种方式择其一


挖来的命令行

SourceTree

接着执行 pod spec lint YMCommonViewLib.podspec //命令进行本地和远程验证文件有效性。
注意:
如果私有库中依赖私有库,则验证podspec文件的时候需要加上–sources参数,否则会出现找不到你依赖的私有库。
如果上面打tag关键一步没有做,这里会出现以下问题。


image.png

4.向私有的Repo索引远程仓库中提交podspec

注意还是在刚才私有库组件的目录下,使用 pod repo push YMSpecRepo YMCommonViewLib.podspec 命令把私有库添加到私有repo索引中


向索引远程仓提交podspec

这时候repo里已经有我们刚才创建的私有库了,前往文件夹 ~/.cocoapods/repos查看,0.1.0就是我们刚才打的tag


image.png

这时候使用pod search YMCommonViewLib 已经可以搜索到
私有库搜索

5. pod私有库使用

打开项目的podfile文件
引入 pod 'YMCommonViewLib',并且在podfile最上面要指定source(索引库地址),否则会报找不到的错误,执行pod install之后,在pod文件夹下就可以看到我们自己的私有库了

注意source为索引库的地址,而不是私有库地址,索引库里面已经有了私有库的podspec了。
pod私有库使用

6. pod私有库的更新

如果私有库有文件更新,那么就必须要修改podspec文件中的version,同时tag也还是要和version保持一致,然后按之前的方法推送到私有库远端和索引库,否则将会失败。

7. pod私有库包含.a或.framework静态库的处理

如果依赖有静态库,需要像以下方式添加依赖

  s.vendored_libraries  = 'YMCommonViewLib/Classes/Lib/*.{a}'    //该目录下的.a静态库
  s.vendored_framework  = 'YMCommonViewLib/Classes/Framework/***.framework'  //Framework目录下的***.framework静态库
  s.static_framework = true  //指定pod加静态库标签

包含静态库在做验证和推送到索引库时时也要添加拼接一些命令

pod repo push YMSpecRepo YMCommonViewLib.podspec --allow-warnings --skip-import-validation --use-libraries --verbose

如果依赖的第三方有自己的私有库,在校验的时候需要指定source,后面要添加你索引库的地址

pod lib lint --sources=https://github.com/CocoaPods/Specs.git,http://******/ymspecrepo.git --allow-warnings --verbose --skip-import-validation

8. 私有库的子模块

如果你想引用一个私有库里面的一小部分功能,但是又不想把整个库导入,那么私有库的子模块正和你意
这里举例定义一个宏定义的子模块,里面是一些宏定义文件,外部可单独依赖这个子模块

  #子模块的定义,也还是在.podspec文件中
  #子模块 —— 宏定义
  s.subspec 'Macro' do |submacro|
      submacro.source_files = 'YMCommonViewLib/Classes/Macro/*.{h,m}'
  end
  #使用子模块时只需在podfile中添加  pod 'YMCommonViewLib/Macro' 即可

8. 使用私有库组件开发技巧

在实际项目开发过程中,因为有些私有库在推送到索引库时时间可能会有10-20分钟,频繁的提交到索引库并不现实,而且不适合做私有库版本控制,所以这边建议主工程可依赖私有库的分支,而不是索引库对应的tag版本,到最后项目上线或者私有库需要定个版本的时候再打tag提交到索引库。

//主工程podfile
  pod 'YMCommonViewLib',:git => 'http://****/ymcommonviewlib.git', :branch => 'branchName' #直接使用远程厂库的branchName最新提交,而不是通过ymspecrepo索引库中的tag标签
  //还有一种方式,直接使用本地的仓库
#  pod 'YMCommonViewLib',:path => '/Users/max/Project/YMCommonViewLib' #直接使用本地厂库, '/Users/max/Project/YMCommonViewLib' 是私有库在本地的目录,这种更方便于开发,在当前主工程项目里即可编译运行看到修改的效果。

如果想在私有库中添加像在PCH中导入的头文件,直接在Support Files下的prefix.pch中导入头文件,一旦在私有库工程中执行pod install操作,就会被重置,所以需要在.podspec文件中进行配置

   s.prefix_header_contents = '#import <Masonry/Masonry.h>','#import "YYCategories.h"'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • 最近在学习vue.js的时候发现,vue的组件化的思想对于编写代码是一个非常有用的事情。 首先为什么需要组件化? ...
    拂晓的云阅读 7,158评论 6 23
  • 首先,也许有人觉得,开发使用远程私有库很麻烦,还不如直接写好,拖到项目中直接使用来的方便。可我想说的是,在一个小的...
    悠闲自在的蜗牛阅读 2,180评论 0 10
  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 21,604评论 0 39
  • 偷偷, 爱住进了心, 心把自己撕碎, 盖起一间小屋, 风和雨敲打房门, 心却在笑, 笑爱嫩绿的芽和娇艳的花。 悄悄...
    发霉的木头阅读 325评论 1 2
  • 一个人坐在星巴克,一杯咖啡,一首《好久不见》,一个人,一段静谧的岁月。不知何时起,我渐渐习惯了这样的生活方式。一个...
    MARSHAL灬OVE阅读 265评论 0 1