一、組件化啓蒙文章:html
iOS應用架構談ios
二、經過Cocoapods實現組件化:git
Cocoapods 創建私有庫 - 官方github
三、組件化相關資料:ide
Cocoapods 系列教程
post
以個人切身經從來說:
一、隨着業務增長,需求迭代。整個項目的文件愈來愈多,Build愈來愈慢,按下 Command + R,而後喝杯卡布奇諾再蹲個坑回來,項目尚未跑完。。。
二、幹外包,啊不,在外包公司作項目。通用的基礎功能代碼,如:菊花、網絡訪問組件、下拉刷新、數據持久化、基礎類的分類。若是不把它們弄成私有庫,那麼咱們只能選擇:
言歸正傳,我對項目進行組件化我幹了兩件事:
私有庫固然要用私有Spec Repo,固然可使用官方的Repo,但若是隻想添加本身的Pods,那仍是使用私有的Repo把。打開:~/.cocoapods/repos。你會看到一個master文件夾,這個是 Cocoapods 官方的 Spec Repo。
這裏建立 DYDemoSpecs 倉庫。
# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
$ pod repo add DYDemoSpecs https://github.com/liyunxin/DYDemoSpecs.git複製代碼
此時若是成功的話,到:~/.cocoapods/repos 目錄能夠看到DYDemoSpecs。
經過官方文檔:Using Pod Lib Create,建立一個DYDemoTools項目。cd到想要建立項目的目錄而後執行:
$ pod lib create DYDemoTools複製代碼
接着在命令行須要你確認一些參數:
根據命令行的輸入會建立不同的工程
這裏建立 DYDemoTools 倉庫,並clone到本地。
把2.1步驟生成的項目的相關文件複製到DYDemoTools倉庫目錄下
這裏你也能夠直接給2.1生成的項目設置遠端倉庫
podspec是Ruby文件,能夠打開Example的項目工程查看。
這是我在DYDemoTools中使用的podspec文件:
相關字段能夠到 官方文檔 查閱
Pod::Spec.new do |s|
s.name = 'DYDemoTools'
s.version = '0.0.1'
s.summary = 'DYDemoTools.'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/liyunxin/DYDemoTools'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'liyunxin' => '447674668@qq.com' }
s.source = { :git => 'https://github.com/liyunxin/DYDemoTools.git', :tag => s.version.to_s }
s.platform = :ios, "10.0"
s.frameworks = 'UIKit'
s.source_files = 'DYDemoTools/Classes/**/*'
end複製代碼
從 podspec 中,source_files字段的設置能夠知道,該組件的源文件都要放在倉庫中DYDemoTools文件夾中。
這裏我添加一個自定義Button到Pod/Classes,而後進入Example文件夾執行 pod update 命令。再次打開Example項目工程能夠看到:
每一次修改了pod或者之後更新了podspec版本都須要從新執行一遍 pod update 命令
使用示例:
在Example工程的ViewController中直接導入 KHBarButton,這裏要先給Main.storyboard添加導航控制器
#import "ViewController.h"
#import "KHBarButton.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.rightBarButtonItem = [[KHBarButton rightBtnWithTitle:@"德瑪西亞" Color:[UIColor blackColor] ClickOption:^{
NSLog(@"德瑪西亞,永世長存");
}] getBarItem];
}
@end複製代碼
Pod::Spec.new do |s|
s.name = 'DYDemoTools'
s.version = '0.0.1'
s.summary = 'DYDemoTools.'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/liyunxin/DYDemoTools'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'liyunxin' => '447674668@qq.com' }
s.source = { :git => 'https://github.com/liyunxin/DYDemoTools.git', :tag => s.version.to_s }
s.platform = :ios, "10.0"
s.frameworks = 'UIKit'
s.source_files = 'DYDemoTools/**/*'
s.resource_bundles = {
'DYDemoTools' => ['DYDemoTools/Base/*.xcassets']
}
end複製代碼
獲取DYDemoToolsAsset中的圖片有不少中方法,這裏採起的方法:
在DYDemoYools中添加一個類方法,專門獲取DYDemoToolsAsset中的圖片
#import <Foundation/Foundation.h>
@interface DYDemoTools : NSObject
///獲取KHealthTools這個Bundle的圖片
+ (UIImage *)getToolsBundleImage:(NSString *)imageName;
@end
複製代碼
#import "DYDemoTools.h"
@implementation DYDemoTools
///獲取DYDemoTools這個Bundle的圖片
+ (UIImage *)getToolsBundleImage:(NSString *)imageName {
static NSBundle *bundle;
if (bundle == nil) {
bundle = [NSBundle bundleWithPath:[[NSBundle bundleForClass:NSClassFromString(@"DYDemoTools")] pathForResource:@"DYDemoTools" ofType:@"bundle"]];
}
UIImage *image = [UIImage imageNamed:imageName inBundle:bundle compatibleWithTraitCollection:nil];
if (image == nil) {
image = [UIImage imageNamed:imageName];
}
return image;
}
@end
複製代碼
使用示例:
在Example工程的ViewController中直接導入DYDemoTools
#import "ViewController.h"
#import "KHBarButton.h"
#import "DYDemoTools.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
__weak typeof(self) weakSelf = self;
self.navigationItem.rightBarButtonItem = [[KHBarButton rightBtnWithTitle:@"德瑪西亞" Color:[UIColor blackColor] ClickOption:^{
[weakSelf addImageDemo];
}] getBarItem];
}
- (void)addImageDemo {
UIImage *img = [DYDemoTools getToolsBundleImage:@"img1"];
UIImageView *iV = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, img.size.width, img.size.height)];
iV.image = img;
[self.view addSubview:iV];
}
@end複製代碼
效果圖:
這個未來有大用
在Base裏面添加:DYDemoToolsHeader.h
Pod::Spec.new do |s|
s.name = 'DYDemoTools'
s.version = '0.0.1'
s.summary = 'A short description of DYDemoTools.'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/liyunxin/DYDemoTools'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'liyunxin' => '447674668@qq.com' }
s.source = { :git => 'https://github.com/liyunxin/DYDemoTools.git', :tag => s.version.to_s }
s.platform = :ios, "10.0"
s.frameworks = 'UIKit'
s.subspec '0_Base' do |sb|
sb.source_files = "DYDemoTools/0_Base/**/*.{h,m}"
sb.resource_bundles = {
'DYDemoTools' => ['DYDemoTools/0_Base/*.xcassets']
}
end
s.subspec '1_Tools' do |st|
st.source_files = "DYDemoTools/1_Tools/**/*.{h,m}"
end
s.subspec '2_View' do |sv|
sv.source_files = "DYDemoTools/2_View/**/*.{h,m}"
end
end
複製代碼
終於來到這裏了,提交以前要驗證 podspec 是否無誤。不然沒辦法提交。而後還要給 git 打上一個 tag,該 tag 要與 podspec 的 version 相同。
#cd到DYDemoTools文件夾,執行下面的命令
pod lib lint --allow-warnings複製代碼
若是出現:DYDemoTools passed validation. 那恭喜我,本地校驗經過:
#cd到DYDemoTools文件夾,執行下面的命令
pod repo push DYDemoSpecs DYDemoTools.podspec --allow-warnings複製代碼
查看:~/.cocoapods/repos/DYDemoSpecs,你會看到新增了一個DYDemoSpecs
到此,第一個組件庫建立完成
這裏建立 DYDemo666 倉庫。
建立一個DYDemo666工程。添加podfile文件以下:
use_frameworks!
platform :ios, '10.0'
source 'https://github.com/CocoaPods/Specs.git' # 官方庫
source 'https://github.com/liyunxin/DYDemoSpecs.git' # 私有庫
target 'DYDemo666' do
pod 'DYDemoTools'
end複製代碼
執行成功後打開項目:
在 DYDemo666 中的 ViewController 使用組件的東西:
#import "ViewController.h"
#import "DYDemoToolsHeader.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
__weak typeof(self) weakSelf = self;
self.navigationItem.rightBarButtonItem = [[KHBarButton rightBtnWithTitle:@"哈哈哈" Color:[UIColor blackColor] ClickOption:^{
[weakSelf addImageDemo];
}] getBarItem];
}
- (void)addImageDemo {
UIImage *img = [DYDemoTools getToolsBundleImage:@"img1"];
UIImageView *iV = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, img.size.width, img.size.height)];
iV.image = img;
[self.view addSubview:iV];
}
@end複製代碼
使用效果:
接下來的筆記在下一篇文章:iOS組件化 - 項目組件化