本篇主要讲解组件化架构思想,从零教你如何组件化一个项目,当然组件化也遇上许多坑,这里非常感谢小码哥王顺子老师的帮助。
使用cocoapods管理组件化开发
podspec
:描述自己组件工程的代码目录和资源目录在哪,还有自己组件工程所依赖其他框架,到时候就会根据podspec的指引去引入自己的仓库代码.
pod spec create spec文件名
// 创建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 = "Good"
// 设置仓库主页
s.homepage = "http://EXAMPLE/HttpManager"
// 设置许可证
s.license = "MIT"
// 设置作者
s.author = { "iThinkerYZ" => "690423479@qq.com" }
// 设置仓库源,表示在哪可以找到组件工程
s.source = { :git => "", :tag => "#{s.version}" }
// 设置 源文件路径 => 不是整个工程的文件,而是自己封装的代码,以后别的工程引入,就会引入这里的代码。
s.source_files = "HttpManager/Classes/**/*.{h,m}"
// s.dependency = '' 组件工程依赖哪些第三方框架
// s.frameworks = 'UIKit', 'MapKit' 组件工程依赖哪些原生框架
// s.resource_bundles = {} 组件工程图片资源
end
s.source_files
仅仅描述组件代码就好,不要描述整个工程名文件,会把所有文件集成上去,错误写法:s.source_files = "HttpManager"
**:表示所有文件
:因为*表示通配符,可有可无.
s.source_files = "HttpManager/Classes/**/*.{h,m}"
,表示组件代码在podspec目录下HttpManager/Classes中的所有文件,默认会自动追踪到到podspec文件的目录路径下,因为当前处于podspec文件中,处于哪个文件,就自动追踪哪个文件。HttpManager/Classes/a.h
匹配到的应该是HttpManager/Classes/**
,表示HttpManager/Classes/a.h
后没有东西,就不会在找,直接匹配到。s.description
:不能为空
s.license
:不能乱填,必须是有这样的协议,比如(MIT)podFile文件
:指定主工程加载哪些组件库,里面描述好组件库对应的podspec文件在哪,就知道去哪加载组件代码。
创建命令:pod init
cocoapods可以加载远程仓库也可以加载本地仓库,一般加载远程仓库.
如何加载本地仓库代码?
本地仓库代码搞一个podspec文件描述去哪加载组件代码
谁需要引入本地仓库代码,就创建Podfile
Podfile:指定podspec文件在哪
pod 'HttpManager' , :path => '../HttpManager'
../HttpManager
:回到Podfile上一级目录,进入HttpManager就能找到podspecPodfile文件.png
podspec文件.png
pod lib create 组件代码名称
* 1. 根据Podfile描述,找到对应代码库的描述文件podspec
* 2. podspec中描述,去哪(s.source)才能找到代码库,并且找到之后,需要拷贝哪些文件(s.source_files)到自己的工程中。
pod path.png
gitignore
文件,因为pod lib
创建了git status
: 查看状态,如果有不想要的文件,可以用gitignore忽略掉git commit -m ''
git remote
(查看有没有远程地址)git remote add origin
远程仓库地址git push origin master
git tag -a 0.0.1 -m '0.0.1'
,仅仅是本地git push --tags
pod trunk register EMAIL [NAME]
pod trunk push HttpManager.podspec --allow-warnings
s.version
版本号要跟最新Tag一致s.source
仓库地址也不能写错search_index.json
文件search_index.json
文件文件删除,重新执行pod search,就会重新更新索引.问题:有些公司核心的代码不想开源,就不能放在cocoapods公共的索引库中,也不能放在本地,因为以后需要多人开发,cocoapods支持创建自己的私有索引库,只需要把自己的代码仓库放在自己的私有索引库就好了.
如何创建私有远程仓库索引库
pod repo add XMGSpec
pod repo push XMGSpec XMGLib.podspec --allow-warnings
,本地索引库就会有自己的私有库,并且远程也会有,pod repo push会帮我们推送到远程索引库.怎么使用自己的私有索引仓库
pod search 搜索自己库描述
pod install,发现找不到,因为默认是去共有的索引库查找
需要在Podfile文件顶部添加一个源,表示去哪个地方查找。
source 'https://git.coding.net/iThinkerYZ520/XMGSpec.git'
但是有问题,如果以后要添加公有的索引库,比如AFN,就找不到了
source 'https://github.com/CocoaPods/Specs.git'
# 表示先去找私有,在找公有
source 'https://git.coding.net/iThinkerYZ520/XMGSpec.git'
source 'https://github.com/CocoaPods/Specs.git'
target '测试私有索引库' do
pod 'XMGLib'
pod 'AFNetworking', '~> 3.1.0'
end
pod repo push XMGSpec XMGLib.podspec --allow-warnings
pod update --no-repo-update
pod lib create
创建的组件工程,有个Assets文件夹,把图片放这s.resource_bundles
Snip20170213_2.png
Snip20170213_4.png
NSBundle mainBundle
,但是组件资源代码,不是在主bundle中,是在自己框架的bundle中Snip20170213_5.png
```
NSBundle *selfBundle = [NSBundle bundleForClass:self];
NSLog(@"%@",selfBundle);
// 获取bundle还不够,图片在bundle的XMGLib.bundle文件中
// 注意图片要全名
NSString *path = [selfBundle pathForResource:@"XMGLib.bundle/图片@2x.png" ofType:nil];
UIImage *image = [UIImage imageWithContentsOfFile:path];
```
s.dependency 'AFNetworking'
Snip20170213_7.png
s.subspec 'GIF' do |gif|
gif.ios.deployment_target = '7.0'
gif.source_files = 'SDWebImage/FLAnimatedImage/*.{h,m}'
// 设置依赖,依赖自己组件的子组件Core
gif.dependency 'SDWebImage/Core'
gif.dependency 'FLAnimatedImage', '~> 1.0'
gif.xcconfig = {
'USER_HEADER_SEARCH_PATHS' => '$(inherited) $(SRCROOT)/FLAnimatedImage/FLAnimatedImage'
}
end
如何加载子组件
// 只会引入GIF组件
pod 'SDWebImage/GIF'