CocoaPods的组件化和私有二进制

前言

今天想写一下CocoaPods的组件化和私有二进制,将项目的不同部分切分成不同的模块,有的模块还有父子依赖关系,再上传到私有库上,定期维护这些库就可以了,这样可以有效和划分人员和代码的职责,方便管理。

1: 创建组建 TestCompA

pod lib create TestCompA
选择你需要的信息
Press return to continue.
What platform do you want to use?? [ iOS / macOS ]
 > iOS
What language do you want to use?? [ Swift / ObjC ]
 > Objc
Would you like to include a demo application with your library? [ Yes / No ]
 > Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > None
Would you like to do view based testing? [ Yes / No ]
 > No
What is your class prefix?
 > ZCX
Comp_Creata_01.png

2: 在github上建立仓库TestCompA.git

Comp_Creata_02.png

3:组建代码上传到仓库新建的仓库中

Comp_Creata_03.png
意料之中吧,要是这么简单我还需要写这一篇文章吗,哈哈哈

4:查看本地repo仓有哪些,增加新建的组建到本地仓库

 pod repo
 pod repo add TestCompA  https://github.com/zhengchuxin/TestCompA.git
Comp_Creata_04.png

5: 组件有更新,我们本地可以更新下索引

pod repo update TestCompA

6:TestCompA.podspec文件说明

s.name 需要想好,最好有公司或者单位前缀,不然有大坑,而且不好改,后面细说
s.version指定了这个pod的版本,非常重要。
s.homepage和s.source,指定了仓库的地址,需要填写正确
s.source_files 指向我们的代码路径,这里统配了这个路径下的所有文件
s.resource_bundles 是说明我们的pod所包含的资源文件用的,在工程中,这些资源会被打包成bundle,放在这个pod名的framework下,所以不需要担心资源重名问题
s.frameworks和s.dependency是pod的系统依赖和对其他pod的依赖,这里有点需要注意,如果依赖的其他pod是私有库的话,我们也不能在这里说明,需要在外部处理,见下文。
 这些属性的验证可以通过命令pod lib lint检查,实际上这个命令也是检查项目代码能否顺利编译。
 首先向pod远程仓库提交代码,用pod lib lint验证 会提示一些警告,可以忽略加上--allow-warnings
pod lib lint --allow-warnings( 检查本地仓库是否有误(无需网络))   
pod spec lint –private --allow-warnings(检查远程仓库是否有误(需要网络))
Comp_Creata_05.png

7:TestCompA目录下的Classes下增加我们需要的文件,例如Controller或View

Comp_Creata_06.png

8:你要导入文件,需要在/Example目录下pod install

Comp_Creata_07.png

9: 在Git中代码仓库,并将TestCompA上传,设置tag版本

比如从0.1.0升级到0.2.0,要先将代码推送到远端,然后再打tag,顺序不能反。而且打的tag要和.podspec文件中的tag要对应
git add .
git commit -m"提交信息"
git push origin master 
git tag tag号  (tag号一定要和fileLib.podspec里的版本号一致,不然后面验证报错)
git push --tags
删除tag    git tag -d '版本号'
Comp_Creata_08.png

10: 用同样方法创建TestCompB

11: 配置 *.podspec文件配置便于打包

通过变量控制哪些需要显示的文件出来,已TestCompB为例

  if ENV['IS_SOURCE'] || ENV['TestCompB']

       s.public_header_files = 'TestCompB/Classes/**/*.h'
       #s.source_files = 'MyTest/Classes/**/*.{h,m,mm,c}'

        s.subspec 'Controller' do |ss|
           ss.source_files = 'TestCompB/Classes/Controller/*.{h,m}'
         end
        s.subspec 'View' do |ss|
           ss.source_files = 'TestCompB/Classes/View/*.{h,m}'
        end
        s.subspec 'Model' do |ss|
           ss.source_files = 'TestCompB/Classes/Model/*.{h,m}'
        end
        s.resource_bundles = {
                 'TestCompB' => ['TestCompB/Assets/*.png','TestCompB/Classes/**/*.{xib,nib,plist,lsc}'],
              }

        # s.frameworks = 'UIKit', 'MapKit'
         s.dependency 'AFNetworking', '~> 2.3'
         s.dependency 'BeeHive'
  else
        # s.source_files = 'MyTest/Classes/**/*.{h}'

        s.subspec 'Controller' do |ss|
        ss.source_files = 'TestCompB/Classes/Controller/*.{h}'
        end
        s.subspec 'View' do |ss|
        ss.source_files = 'TestCompB/Classes/View/*.{h}'
        end
        s.subspec 'Model' do |ss|
        ss.source_files = 'TestCompB/Classes/Model/*.{h}'
        end
        s.resources = 'TestCompB/Products/TestCompB.bundle','TestCompB/Classes/**/*.bundle'
        s.public_header_files = 'TestCompB/Classes/**/*.h'
        s.vendored_frameworks = 'TestCompB/Products/TestCompB.framework'
        # s.frameworks = 'UIKit', 'MapKit'
        s.dependency 'AFNetworking', '~> 2.3'
        s.dependency 'BeeHive'
  end

12: 需要导入第三方框架,可以使用如

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

13: IS_SOURCE=1 pod install

通过IS_SOURCE 变量走if逻辑显示出.h,.m文件出来


Comp_Creata_09.png

14: pod install 走else逻辑显示出.h文件出来

Comp_Creata_10.png

15:直接push这样方法,xib上控件显示不出来,如图左边是xib的控件

Comp_Creata_11.png

需要换种写法才能显示

NSBundle * currentBundle = [NSBundle bundleWithURL:[[NSBundle bundleForClass:[self class]] URLForResource:@"TestCompB" withExtension:@"bundle"]];
ZCXCompBMyControllerViewController *vc = [[ZCXCompBMyControllerViewController alloc] initWithNibName:NSStringFromClass([ZCXCompBMyControllerViewController class]) bundle:currentBundle];
[self.navigationController pushViewController:vc animated:YES];
Comp_Creata_12.png

代码加载图片显示

NSBundle * bundle = [NSBundle bundleForClass:[self class]];
NSBundle * currentBundle = [NSBundle bundleWithPath:[[bundle resourcePath]                                            stringByAppendingPathComponent:@"TestCompB.bundle"]];
UIImage *image = [UIImage imageNamed:@"aa.png" inBundle:currentBundle compatibleWithTraitCollection:nil];
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
imageView.frame =CGRectMake(50, 120, 100, 100);
[self.view addSubview:imageView];
Comp_Creata_13.png

16: 创建一个空的TogetherAllComp项目,CocoaPods用来集合组件A和组件B

Comp_Creata_14.png

17: Podfile配置下, pod install

source 'https://github.com/CocoaPods/Specs.git'  #官方仓库的地址
source 'https://github.com/zhengchuxin/TestCompA'
source 'https://github.com/zhengchuxin/TestCompB'

platform :ios,'9.0'
inhibit_all_warnings!

target 'TogetherAllComp' do
   pod 'cordova-plugin-device'
   pod 'TestCompA',:git => 'https://github.com/zhengchuxin/TestCompA'
   pod 'TestCompB' , :git => 'https://github.com/zhengchuxin/TestCompB'
end
Comp_Creata_15.png

18: 看上图 TestCompA,TestCompB已经显示出来了,由于是pod install ,所以组件B只显示出,h文件出来,需要显示.m文件可以使用IS_SOURCE=1 pod install

19: 直接在测试项目使用pod install 库并没有更新当前最新版,需要清除缓存

pod cache clean TestCompA

20: 删除Podfile.lock文件,再执行安装才可以生效

21: 组件之间需要结偶可以使用阿里的BeeHive

结束end

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