组件化开发 ——— 私有库上传更新遇到的问题及对图片资源的引用
上篇文章说了制作私有库的流程,这里接着说私有库上传更新遇到的问题,及对图片资源的引用。
私有库上传更新遇到的问题
1.组件里按功能“分组”显示
比如我们项目里的WMBaseComponent,就是个功能组合件,像自定义刷新加载,网络,图片选择器等… , 在组件里面按功能分组显示比较直观,也比较符合目前项目阶段的要求。
设置分组的话,需要在放文件的Classes里面 分组对应相应的功能文件,然后在podSpec里这样设置:
#s.source_files = 'WMBaseComponent/Classes/**/*' #子文件夹在此设置 s.subspec 'PopupUtil' do |ss| ss.source_files = 'WMBaseComponent/Classes/PopupUtil/**/*' ss.public_header_files = 'WMBaseComponent/Classes/PopupUtil/**/*.{h}' end复制代码
2.组件里引用第三方库,及组件之间引用
当某个组件或小的功能组件里需要引用第三方库时,
比如WMBaseComponent 这个大功能组件库,引用基础库时:
s.dependency 'AFNetWorking' //引用第三方库s.dependency 'WMCategoryKit', '~> 0.4' //引用私有组件库复制代码
当组件里的功能文件引用时:
s.subspec 'WMImagePickerHandle' do |ss| ss.source_files = 'WMBaseComponent/Classes/WMImagePickerHandle/**/*' ss.public_header_files = 'WMBaseComponent/Classes/WMImagePickerHandle/**/*.{h}' ss.dependency 'TZImagePickerController', '~> 2.2.3' //引用第三方库 ss.dependency 'WMBaseComponent/PopupUtil' //引用私有组件库 end复制代码
3.在pod spec lint 验证时 出现Error提示:
ERROR | [iOS] file patterns: The 'source_files' pattern did not match any file复制代码
此错误的原因是没有找到匹配的文件。
这个是在指定共享的类库时, 文件路径不对, 也就是设置s.source_files 字段时, 发生了错误。
注意是否有多级文件夹,ss.source_files 对应的路径是否正确。
查看后要是对应的是正确的,但运行还是出现这个错误的话,解决方案:
手动创建文件,具体操作方法如下
open /Users/climbwang/Library/Caches/CocoaPods/Pods/External/ <组件名> 复制代码 组件名>
open后,查看组件里面是否对应,若没有,在里面添加功能组件文件。
4.在组件引用基础组件时,pod spec lint 出现Error提示:
Encountered an unknown error 是因为校验podspec文件时默认只会到官方specs库()去校验,如果引用了其他组件,就需要同时指定自己创建的远程索引库地址库校验。
解决方案:
需要执行如下
pod spec lint WMBaseComponent.podspec --sources='git@192.168.1.209:WMComponent/WMSpecs.git,https://github.com/CocoaPods/Specs.git' --verbose --allow-warnings复制代码
5.当example项目运行正常,但验证时提示:
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code复制代码
这是组件里有的可能用到framework,而lint在执行的时候因为静态库无法通过验证。
解决方案 在命令后面追加:
--use-libraries复制代码
6.验证成功后,pod repo push 后面也加上上述所说
pod repo push WMSpecs WMBaseComponent.podspec --sources='git@192.168.1.209:WMComponent/WMSpecs.git,https://github.com/CocoaPods/Specs.git' --verbose --allow-warnings --use-libraries复制代码
说到这里,基本上上传 更新时遇到的问题都能解决了。
再添一个,删除tag的代码:
git tag //查看已有tag git tag -d 0.1 //删除本地tag git push origin :0.1 //删除远程tag复制代码
图片资源的引用
在WMBaseComponetn功能组件库里,我添加了WMRefresh自定义刷新加载图片,而这个组件里面 刷新加载是有图片显示的,为了脱离壳工程耦合,我就把图片相应组件需要的图片资源都放在相应的组件里,成为真正意义的独立。
组件里和Classes平级的是Assets,这个就是存放资源文件的位置。
把图片资源拖入Assets文件夹,需要修改.podspec文件,添加资源的加载路径:
s.resource_bundles = { 'WMBaseComponent' => ['WMBaseComponent/Assets/*.png'] }复制代码
然后执行pod install。然后会发现多了一个Resource的资源文件夹,你所放进Assets里的图片资源都会在这里能看到。
运行Example 却发现图片任然未显示,这是因为项目中是通过[UIImage imageNamed:@“图片名"]
方式加载本地图片,而这种方式默认是从mainBundle中去加载图片,这样会找不到图片。
而组件都会有个自己的bundle,比如WMBaseComponent就是WMBaseComponent.bundle, 而添加的图片资源都在这里面能看到,但引用的却是壳工程的mainBundle,所以引用不到。
**所以:**必须指明图片的全名和图片所在bundle的包名.
还有,因为涉及到@2x,@3x图片这里不能写成固定的,应该按照scale来设置,所以组件里设置图片的代码是:
// scale判断是几倍图NSInteger scale = [[UIScreen mainScreen] scale];// 指明图片所在bundle的包名NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];// 获取图片的全名NSString *imageName = [NSString stringWithFormat:@"refresh_%ld@%zdx.png",(unsigned long)i,scale];// 获取图片 NSString *path = [currentBundle pathForResource:imageName ofType:nil inDirectory:@"WMBaseComponent.bundle"];UIImage *image = [UIImage imageWithContentsOfFile:path];复制代码
再运行,发现图片可以正常显示了,有没有很激动~~~
到这里,上传时遇到的问题,加载图片资源也差不多完成了,WMBaseComponent也在持续更新中,项目里组件化使用也会越来越完善,下一篇会说——Mediator:组件之间跳转
To Be Continue ...