前言
今天想写一下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
2: 在github上建立仓库TestCompA.git
3:组建代码上传到仓库新建的仓库中
意料之中吧,要是这么简单我还需要写这一篇文章吗,哈哈哈
4:查看本地repo仓有哪些,增加新建的组建到本地仓库
pod repo
pod repo add TestCompA https://github.com/zhengchuxin/TestCompA.git
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(检查远程仓库是否有误(需要网络))
7:TestCompA目录下的Classes下增加我们需要的文件,例如Controller或View
8:你要导入文件,需要在/Example目录下pod install
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 '版本号'
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文件出来
14: pod install 走else逻辑显示出.h文件出来
15:直接push这样方法,xib上控件显示不出来,如图左边是xib的控件
需要换种写法才能显示
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];
代码加载图片显示
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];
16: 创建一个空的TogetherAllComp项目,CocoaPods用来集合组件A和组件B
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
18: 看上图 TestCompA,TestCompB已经显示出来了,由于是pod install ,所以组件B只显示出,h文件出来,需要显示.m文件可以使用IS_SOURCE=1 pod install
19: 直接在测试项目使用pod install 库并没有更新当前最新版,需要清除缓存
pod cache clean TestCompA