.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'] }//组件工程图片资源
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可以加载远程仓库,也可以加载本地仓库,一般加载远程仓库。
//.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文件直至通过验证。
这个命令会自动生成一套组件代码工程测试代码,并且有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工程代码
根据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];
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' 使用框架依赖,则使用此组件的时候自动导入第三方库
podspec文件中描述:s.dependency 'AFNetworking'
使用框架依赖,则使用此组件的时候自动导入第三方库
随着组件不断扩大,如果不划分子组件,我们的工程就会导入一些用不到的业务。因此使用划分子组件,别人在加载你的组件时,就可以根据自己的需求,加载对应的组件代码。 注意:如果使用subspec,别人引入你的框架,代码也会按照subspec划分文件夹结构,podspec不需要描述整个文件夹路径,否则会造成subspec划分的文件夹没有代码。 示例: SDWebImage.podspec
随着组件不断扩大,如果不划分子组件,我们的工程就会导入一些用不到的业务。因此使用划分子组件,别人在加载你的组件时,就可以根据自己的需求,加载对应的组件代码。
注意:如果使用subspec,别人引入你的框架,代码也会按照subspec划分文件夹结构,podspec不需要描述整个文件夹路径,否则会造成subspec划分的文件夹没有代码。
示例:
SDWebImage.podspec
//Podfile文件描述 pod 'SDWebImage/GIF'
//Podfile文件描述
pod 'SDWebImage/GIF'