注意事項(xiàng):本文針對(duì)的是已經(jīng)對(duì)pods私有庫(kù)的流程有所了解或想了解這塊內(nèi)容的人群
有想了解pods私有庫(kù)搭建相關(guān)的,可以點(diǎn)擊下面鏈接
pods私有庫(kù)搭建
一、文件顯示層級(jí)
cocoaPods創(chuàng)建私有庫(kù)的時(shí)候,如果私有庫(kù)中的文件很多,想做到和項(xiàng)目中的文件夾分層,就需要在podSpec
文件里面用到s.subspec 'xxx' do |ss|
語(yǔ)句來(lái)配置。
先看一個(gè)文件層級(jí)
如圖所示,現(xiàn)在我們要把 Login
這個(gè)文件夾搭建私有庫(kù)。
我們一般在用pod lib create Login
創(chuàng)建完項(xiàng)目后,會(huì)生成相應(yīng)的目錄,只要把需要做成私有庫(kù)的文件夾代碼文件放到 classes
里面就可以了。
首先先不考慮文件分層的寫(xiě)法,這樣podspec
文件里面是這樣的
在圖中可以看出,就是普通的寫(xiě)法,按照?qǐng)D中這么寫(xiě)的話,會(huì)導(dǎo)致私有庫(kù)搭建完成并pod導(dǎo)入后,所有的.h .m .xib .png等文件都在一個(gè)文件夾里面,并沒(méi)有我們本地那樣的文件夾Api、View等文件夾了。
這樣的pod私有庫(kù)雖然在正常的使用中并沒(méi)有任何問(wèn)題,但是看起來(lái)很亂,這個(gè)時(shí)候我們就需要進(jìn)行文件分層了。把UIView類(lèi)
都放在View
里面,把Model類(lèi)
都放在Model
里面。這里我們基于沒(méi)有文件分層的基礎(chǔ)上進(jìn)行修改,需要使用到下面的語(yǔ)句
s.subspec 'View' do |ss|
ss.source_files = ''
end
下面我們參照?qǐng)D一給出的文件層級(jí)寫(xiě)相關(guān)的 subspec
在classes
文件夾下面,只有文件夾,并沒(méi)有其他的.h .m等文件,這個(gè)時(shí)候,podspec
文件里面的source_files
就可以不用寫(xiě)了。
首先 classes
下面有Api
、Targets
、View
、ViewController
、ViewModel
文件夾,要實(shí)現(xiàn)搭建的私有庫(kù)顯示這樣的文件夾層級(jí),就需要分別將這個(gè)五個(gè)文件夾全部寫(xiě)錯(cuò) subspec
的形式。
- Api文件夾
s.subspec 'Api' do |ss|
ss.source_files = 'Login/Classes/Api/*.{h,m}'
end
- ViewModel 文件夾
ViewModel
里面的.m
文件會(huì)引用到Api
里面文件的頭文件,所以要寫(xiě)在Api
下面,并且要添加依賴(lài)
s.subspec 'ViewModel' do |ss|
ss.source_files = 'Login/Classes/ViewModel/*.{h,m}'
ss.dependency 'Login/Api'
end
- View文件夾
View
文件夾中的文件會(huì)引用到Api
和ViewModel
里面文件的頭文件,所以要寫(xiě)在它們的subspec
下面并添加依賴(lài)
s.subspec 'View' do |ss|
ss.source_files = 'Login/Classes/View/*.{h,m}'
ss.dependency 'Login/Api'
ss.dependency 'Login/ViewModel'
end
- ViewController文件夾
ViewController
下的文件會(huì)引用到View
里面文件的頭文件,所以寫(xiě)在View
的subspec
下面并添加依賴(lài)
s.subspec 'ViewController' do |ss|
ss.source_files = 'Login/Classes/ViewController/*.{h,m}'
ss.dependency 'Login/View'
end
- Targets文件夾
Targets
下的文件會(huì)引用到ViewController
里面文件的頭文件,所以寫(xiě)在ViewController
的subspec
下面并添加依賴(lài)
s.subspec 'Targets' do |ss|
ss.source_files = 'Login/Classes/Targets/*.{h,m}'
ss.dependency 'Login/ViewController'
end
這里需要注意的幾個(gè)問(wèn)題:
一個(gè)就是如果有
A subspec
需要使用到其他的B subspec
,就需要在A subspec
下面添加對(duì)B subspec
的依賴(lài),這個(gè)依賴(lài)是針對(duì)subspec
的,不需要寫(xiě)本地文件路勁。依賴(lài)其他第三方公開(kāi)pod庫(kù)的話,可以寫(xiě)在使用到的
subspec
里面,也可以寫(xiě)在總的依賴(lài)?yán)铩?/p>如果
A subspec
里面有使用到B subspec
下的文件,B subspec
又引用到A subspec
下的文件,這樣的話,分層實(shí)現(xiàn)起來(lái)比較困難,解決的思路可以在classes
下面創(chuàng)建一個(gè).h的頭文件,引用各個(gè)頭文件,并設(shè)置s.souce_files = 'Login/Classes/Login.h'
二、資源文件使用
pods私有庫(kù)有時(shí)候會(huì)用到圖片資源或者其他資源,這些資源應(yīng)該怎么配置和獲取使用呢?
在我們使用pod lib creat Login
的時(shí)候,會(huì)在Classes
同級(jí)目錄下面生成一個(gè)Assets
的文件夾,這個(gè)文件夾就是用來(lái)放資源文件的,如圖:
將資源文件放到這個(gè)里面的時(shí)候,接下來(lái)要去設(shè)置Login.podspec
文件,主要就是將原先下面這段注釋的代碼接觸注釋就好了:
s.resource_bundles = {
'Login' => ['Login/Assets/*.png']
}
接下來(lái)怎么使用呢?
因?yàn)?code>s.resource_bundles生成的資源文件,會(huì)生成一個(gè)bundle文件,使用的時(shí)候就是要先獲取到這個(gè)bundle,然后獲取到里面的資源。
- 獲取bundle
calssType
是指當(dāng)前使用圖片的控件所在的類(lèi)
+ (instancetype)mineBundle:(id)classType{
static NSBundle *mine = nil;
if (mine == nil) {
classType = [classType isKindOfClass:NSString.class] ? NSClassFromString(classType) : classType;
NSString * path = [[NSBundle bundleForClass:classType] pathForResource:@"Mine" ofType:@"bundle"];
mine = [NSBundle bundleWithPath:path];
}
return mine;
}
- 根據(jù)圖片名獲取圖片
target
是指使用圖片的控件所在的類(lèi)
+(UIImage *)configImg:(id)target imageName:(NSString *)imageName{
UIImage *img = nil;
if (img == nil) {
img = [UIImage imageNamed:imageName inBundle:[self mineBundle:target] compatibleWithTraitCollection:nil];
}
return img;
}
還有一種資源文件上傳的方式就是設(shè)置resources
,如下圖:
# 設(shè)置資源文件路徑
s.resources = 'HGGridView/Classes/resource/*.png'
這樣寫(xiě)的話,文件格式展示出來(lái)的就是:
這種方式添加的資源文件,使用起來(lái)就簡(jiǎn)單了,直接就可以用:
UIImage *image = [UIImage imageNamed:@"back"];
資源文件如果不多的話,使用第二種比較方便,如果資源文件多的話,就需要使用bundle來(lái)管理了。