热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用cocoapods管理组件化开发

.podspec文件.podspec文件描述自己组件工程的代码目录和资源目录在哪儿,还有自己组件工程所依赖其他框架,根据pod命令:podspeccreatespec文件名
.podspec文件

.podspec文件描述自己组件工程的代码目录和资源目录在哪儿,还有自己组件工程所依赖其他框架,根据pod命令:pod spec create spec文件名 创建podspec文件。

//创建pod索引库,固定写法,并且定义索引库的名字为s,后续通过s,就能拿到索引库

Pod::Spec.new do |s|

s.name = "HttpManager"//设置名称

s.version = "0.0.1"//设置版本号

s.summary = "A short description of HttpManager."//设置摘要

s.description = "A long description of HttpManager."//设置详情

s.homepage = "http://Example/HttpManager"//设置仓库主页

s.license = "MIT"//设置许可证

s.author = { "author-name" => "author-account" }//设置作者

s.source = { :git => "git-address", :tag => "#{s.version}" }//设置仓库源,表示在哪可以找到组件工程

s.source_files = "HttpManager/Classes/**/*.{h,m}"//设置源文件路径(不是整个工程的文件,而是自己封装的代码,以后别的工程引入,就会引入这里的代码)

s.dependency "AFNetworking", "~>2.3"//组件工程依赖哪些第三方框架

s.frameworks = "UIKit", "MapKit" //组件工程依赖哪些原生框架

s.resource_bundles = { 'HttpManager' => ['HttpManager/Assets/*.png'] }//组件工程图片资源

end

//.podspec文件注意点

1.s.description不能为空

2.s.license不能乱填,必须是有这样的协议,例如MIT

Podfile文件指定主工程加载哪些组件库,source指定组件库对应的podspec文件地址。

创建命令:pod init

cocoapods可以加载远程仓库,也可以加载本地仓库,一般加载远程仓库。

创建私有索引库

GitHub上新建一个工程,例如XMGSpec,本地添加私有远程索引库:pod repo add XMGSpec http://git.dev.sh.ctripcorp.com/XMGSpec.git,后面是索引库远程地址。Finder前往文件夹~/.cocoapods/repos,可以看到XMGSpec文件夹,只有.git文件,没有任何私有库索引。

创建组件工程

方式一:直接创建工程XMGLib,把组件代码放在Class中,只要spec描述好,就会自动加载Class中组件代码,使用pod spec create XMGLib 生成spec描述文件,指定加载组件工程的组件代码在哪。

方式二:使用cocoapods命令:pod lib create XMGLib

            这个命令会自动生成一套组件代码工程测试代码,并且有Git管理,包含podspec文件,描述好组件代码位置。

    编辑组件工程的.podspec文件,如上所示,使用pod spec lint XMGLib.podspec命令验证,验证成功后提示:XMGLib.podspec passed validation,验证失败则根据失败提示修改.podspec文件直至通过验证。

组件化(私有远程仓库)

      把自己私有库的索引添加到自己索引库中:pod repo push XMGSpec XMGLib.podspec --allow-warnings,本地索引库就会有自己的私有库的.podspec文件,Finder进入/.cocoapods/repos/XMGSpec,可以看到XMGLib文件夹,包含0.1.0文件夹,子文件中包含XMGLib.podspec文件。而且远程也会有,pod repo push 会帮我们推送到远程索引库,查看远程仓库,可以看到一次提交。

使用自己的私有索引仓库

  • 创建一个新的工程,执行命令 pod init,生成Podfile文件
  • 在Podfile文件顶部添加一个源,表明私有索引库地址,例:source ‘git@git.dev.sh.ctripcorp.com:IBU_App_Tour/TourSpecs.git’  。
  • 在Podfile文件中pod 'XMGLib', '0.1.0'
  • 执行pod install,在Pods文件夹下成功导入XMGSpec工程代码

Cocoapods原理

根据Podfile描述,找到所用组件库的描述文件podspec。

podspec中,s.source指定代码库地址,找到代码库,根据s.source_files指定copy哪些文件到自己的工程中。

组件化升级

各个组件库不断经历完善,需要更新升级组件库。

  • 把最新的版本代码绑定tag,更新podspec文件,重新上传到版本索引库 pod repo push XMGSpec XMGLib.podspec --allow-warnings
  • 工程文件在使用过程中,使用pod update就能加载最新版本组件代码

组件化资源

  • 使用pod lib create创建的组件工程,有个Assets文件夹,把图片放这
  • podspec文件中s.resource_bundles指定资源文件路径
  • 仓库代码重新pod install,自动生成bundle文件。代码中如何使用资源文件,之前获取图片都是在主bundle中:[NSBundle mainBundle],但是组件工程资源,不是在主bundle中,是在自己框架的bundle中。获取自己的bundle,NSBundle *selfBundle = [NSBundle bundleForClass:self]; 

 NSLog(@"%@", selfBundle);

//获取bundle还不够,图片在XMLib.bundle文件中

//图片用全名

NSString *path = [selfBundle pathForResource:@"XMGLib.bundle/img@2x.png" ofType:nil];

UIImage *image =  [UIImage imageWithContentsOfFile:path];

//注意:xib同样属于资源,需要跟图片一样使用自己的bundle

//获取当前bundle名称 

NSBundle *bundle = [NSBundle bundleForClass:[self class]];

NSString *bundleName = bundle.infoDictionary[@"CFBundleName];

bundleName = [NSString stringWithFormat:@"%@.bundle",bundleName];

//xib名称需要拼接Bundle名称

NSString *nibName = [NSString stringWithFormat:@"%@/XMGHomeRecommendCell",bundleName];

[self.tableView registerNib:[UINib nibWithNibName:nibName bundle:[NSBundle bundleForClass:[self class]]] forCellReuseIdentifier:ID];

框架依赖

podspec文件中描述:s.dependency 'AFNetworking' 

使用框架依赖,则使用此组件的时候自动导入第三方库

划分子组件

随着组件不断扩大,如果不划分子组件,我们的工程就会导入一些用不到的业务。因此使用划分子组件,别人在加载你的组件时,就可以根据自己的需求,加载对应的组件代码。

注意:如果使用subspec,别人引入你的框架,代码也会按照subspec划分文件夹结构,podspec不需要描述整个文件夹路径,否则会造成subspec划分的文件夹没有代码。

示例:

SDWebImage.podspec


使用子组件

//Podfile文件描述

pod 'SDWebImage/GIF'


推荐阅读
author-avatar
ll平安是福简单是快乐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有