基于cocoapods的App模块化

随着产品的迭代升级,增加的模块越来越多,项目也会越来越复杂.随之也就带来的一个非常头疼的问题:代码量庞大(动辄上百M),更让人难以忍受的是蜗牛般的编译速度.为了解决这个问题,我们试着对项目进行基于功能的模块拆分,也就是近来一直提出的模块化.
前期我们参考了豆瓣的开源模块化和github上一个star数字较多的框架,它们都是对一个项目中代码的分离,利用NSClassFromString方法,通过对路径处理或者直接传递字符串,创建所需要的类型.这样能对不同模块的代码进行解耦,但是仍然无法将项目拆解成不同功能的小项目.经过不断的讨论,我们最终选择了基于cocoapod的模块化.
将不同的模块独立成一个项目,让后再主工程中通过cocoapod对不同的项目进行管理和集成,使负责人员专注于自己的模块进行开发,而主工程通过不同的tag对模块进行引用,避免了在所有人都要在主工程运行全部代码的头疼问题.
基于cocoapod,所以需要对cocoapod有较全面的理解,请参考我上篇写的:
从零创建cocoapods私有仓库

下面以一个简单的Demo,详细介绍实现思路.
项目中"我的"模块,一般都会带有登录验证,儿其他模块也有可能会用到登录部分,所以我们可以把登录独立出一个模块.
首先在gitlub新建一个repository,命名为LoginModule,如下图:

Snip20170505_9.png

具体选择请参考上图.
然后通过SourceTree将工程下载到本地,添加Xcode新建的LoginModule工程,最后的文件层级图应该是下图这样的:

文件层级.png

为了更方便的创建.podsepc文件,如果不是上述文件层级,请手动调整.其中.podspec文件,是cocoapods引用时的识别文件,由于需要与文件层级很严格的配置,建议直接拷贝,下面是我经过测试正确的配置:

Pod::Spec.new do |s| #s代表文件夹位置为一级,ss代表文件夹位置为二级

  s.name         = "LoginModule"
  s.version      = "0.0.16"
  s.summary      = "LoginModule for iOS project."
  s.description  = <<-DESC
                  LoginModule
                  DESC
  s.homepage     = "https://github.com/zhudong10/LoginModule"
  s.license      = { :type => "MIT", :file => "LICENSE" }
  #导入工程的pch文件
  s.prefix_header_file = 'LoginModule/ZDPrefixHeader.pch'
  s.author             = { "zhudong" => "zhudongdong@91guoxin.com" }
  s.source       = { :git => "https://github.com/zhudong10/LoginModule", :tag => "#{s.version}" }
  s.source_files  = "LoginModule/LoginModule.h" #此处需要在本级目录下找到文件
              # 目的文件夹名称 #
  s.subspec 'LoginModule' do |ss| 
                      # 文件来源 #
    ss.source_files = 'LoginModule/LoginUI/**/*.{h,m}'
                      # 资源文件 #
    ss.resources = ['LoginModule/Login.xcassets', 'LoginModule/LoginUI/**/*.xib']
    #ss.resources = 'LoginModule/LoginUI/**/*.xib'
    #ss.resources = 'LoginModule/**/*.xcassets'
  end
s.subspec 'Category' do |ss| 
              # 文件来源 #
    ss.source_files = 'LoginModule/Category/**/*.{h,m}'
    end

end

.podspec文件识别的是实体文件夹,为了便于对文件管理,在LoginModule中建立了如下的文件夹和文件,和上述的配置相匹配.

文件夹和文件.png

由于cocoapod引用时,如果没有tag的区分,只会引用第一次提交的代码,所以需要对提交的代码分支,添加tag,方法如下图:

添加tag.png

而且需要推动到远程分支:

推动到远程分支.png

经历上面的步骤,就完成了LoginModule工程的创建.下面让我们在主工程中对其用cocoapod进行引用.

新建工程MineModule,对其进行pod init,创建podfile文件,对podfile文件进行如下配置:

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'MineModule' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!
    pod 'LoginModule', :git => 'https://github.com/zhudong10/LoginModule', :tag =>'0.0.16', :inhibit_warnings => false
  
end

其中的tag就是对LoginModule项目引用的区分.
执行pod install命令后,就能顺利引如LoginModule模块,如果出现错误:

zhudongdeMacBook-Pro:MineModule zhudong$ pod install
Analyzing dependencies
Pre-downloading: `LoginModule` from `https://github.com/zhudong10/LoginModule`, tag `0.0.3`
[!] Unable to find a specification for 'LoginModule'.

[!] Unable to load a podspec from `LoginModule.podspec`, skipping:

Pod::DSLError

是LoginModule工程中.podspec文件配置错误,请详细检查;
如果pod install成功引用LoginModuel,但是编译时出现:

/Users/zhudong/Documents/Demo/Later2017.5.5/MineModule/MineModule/Pods/LoginModule/LoginModule/LoginUI/LoginSuccessController.m:17:1: Cannot synthesize weak property because the current deployment target does not support weak references

则是因为xib文件没有正确引用,需要在MineModule的podfile中添加修改代码,最终的语句如下:

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'MineModule' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!
    pod 'LoginModule', :git => 'https://github.com/zhudong10/LoginModule', :tag =>'0.0.16', :inhibit_warnings => false
  
  post_install do |installer|
      installer.pods_project.targets.each do |target|
          target.build_configurations.each do |config|
              config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '8.0'
          end
      end
  end

end

如果大功告成,文件层级结果应该如下图:

结果.png

最终运行MineModule,我们看到:

MineModule03.gif

如果开发过程中,登录内容有所变化,那就只要在LoginModule中进行更改,然后在主工程中更新pod就行了,感觉是不是超棒?

点击收藏和喜欢都是对我的支持和鼓励

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

推荐阅读更多精彩内容