背景说明
之前一段时间因为公司需要帮客户定制自己的App,但是基本逻辑都是跟我们现有App差不多,如果直接copy一份项目出来改名,无疑会为将来的维护成本添加难度,倒不是说解决困难,而是需要copy重复的代码,项目少的时候还好说,一旦多起来......
因此,将公共部分的代码抽离出来变得很有必要,抽取出来的这部分公共代码使用Cocoapod进行管理无疑是当下最好的选择,下面分享在使用Cocoapod创建私有库的一些经验,希望能够帮到你。
利用Cocoapod创建私有库
一、创建podspec文件
在终端上cd到需要创建的目录文件夹下,然后执行命令pod spec create xxx
,其中xxx
就是对应的podspec文件名,应保持与当前统计文件夹名字一致,例如:
pod spec create Tool // 此时生成的podspec文件就是 Tool.podspec
二、配置podspec文件
基本用法
下面是基本的一些配置,想要使用可以直接copy然后替换其中的内容为自己的即可。具体意义是什么我就不解释了,看字面就可以看得出来,在生成的podspec文件里面也有对应的注释,想了解的话可以看注释。
Pod::Spec.new do |s|
s.name = "Tool"
s.version = "0.0.1"
s.summary = "A short description of Tool."
s.description = "我的一些工具类组件"
s.homepage = "https://gitee.com/hanten"
s.license = "MIT"
s.author = { "Hanten" => "zhiqiangit@126.com" }
s.platform = :ios
s.ios.deployment_target = '8.0'
s.source = { :git => "https://gitee.com/hanten/swift_pod.git", :tag => "#{s.version}" }
s.source_files = "Tool/**/*.{h,m}}" # 如果是swift就将.{h,m}换为.swift
end
高级用法
1、依赖
// 依赖第三方框架
s.dependency 'AFNetworking'
// 依赖第三方存放本地的.framework,Resource是与Tool同级的文件夹,我用来放资源的地方,路径可以根据自己具体配置
s.ios.vendored_frameworks 'Resource/*.framework'
// 依赖第三方存放本地的.a
s.ios.vendored_libraries = "Resource/*.a"
// 依赖系统.framework
s.frameworks = 'SystemConfiguration','CoreGraphics','CoreTelephony'
// 依赖系统.a
s.libraries = 'iconv','sqlite3','stdc++'
2、资源文件(包括图片、plist文件、xib文件)
一般情况下私有库图片等资源文件是放在bundle下的,在使用的时候需要从bundle中拿取出来,比如:
// 我新建了一个叫myShare.bundle文件夹,里面存放图片,然后我需要引用它,在podspec文件中
s.resource = "Resource/myShare.bundle"
// 在OC代码中,在使用的时候,如果不指定bundle的话会找不到该图片资源
NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"myShare" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
UIImage *image = [UIImage imageNamed:@"my_share_session" inBundle:bundle compatibleWithTraitCollection:nil];
// 需要注意的是xib文件的引用,在podspec中配置,就会在pod install后自动生成ShareXibBundle,或者你把xib放在自己建的bundle下,在引用的时候也需要指定该bundle
s.resource_bundles = {
'ShareXibBundle' => ['Tool/Share/**/*.xib']
}
// 在OC中引用,比如注册cell,这样才能正确引用到xib文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"ShareXibBundle" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:path];
[_tableView registerNib:[UINib nibWithNibName:@"ShareCell" bundle:bundle] forCellReuseIdentifier:@"Cell"];
3、使用subspec分模块引入
有的时候我们并不希望将所有的模块都一起被引入到项目中,因为某些模块我们压根就用不到,但是却因为其他需要的模块被一起引入进来了,这个就很烦了。
这时候我们就需要分模块引入了,分模块引入我知道的两种方式:
1、建立多个podspec,每一个模块对应一个podspec文件,这样的话就会新建很多个podspec去对应,麻烦且看起来不优雅,不建议使用;
2、使用subspec,只需要添加一个主的podspec即可,这是目前我在使用的,下面是我的配置:
Pod::Spec.new do |s|
s.name = "Tool"
s.version = "0.0.1"
s.summary = "A short description of Tool."
s.description = "我的一些工具类组件"
s.homepage = "https://gitee.com/hanten"
s.license = "MIT"
s.author = { "Hanten" => "zhiqiangit@126.com" }
s.platform = :ios
s.ios.deployment_target = '8.0'
s.source = { :git => "https://gitee.com/hanten/swift_pod.git", :tag => "#{s.version}" }
# s.source_files = "Tool/**/*.{h,m}}" # 如果是swift就将.{h,m}换为.swift
# 基础依赖
s.subspec "Base" do |ss|
ss.source_files = "Tool/Base/**/*.{h,m}}"
end
# 日期控件
s.subspec "Date" do |ss|
ss.source_files = "Tool/Date/**/*.{h,m}"
end
# 分享组件
s.subspec "Share" do |ss|
ss.source_files = "Tool/Share/**/*.{h,m}"
ss.dependency 'Tool/Base'
end
end
只需要简单的配置就可以分模块引入了,相关的依赖在subspec上写就可以了。
需要注意的是父spec需要把source_files给去掉,因为我们使用了subspec来引用
三、项目引用
正常引用
如果没有使用分模块引用,那么在Podfile中应该这样引用:
pod 'Tool', :path => '../swift_pod'
分模块引用
使用了分模块引用,在Podfile中如下引用:
pod 'Tool', :path => '../swift_pod', :subspecs => [
'Date', # 日期控件
'Share' # 分享组件
]
后记
最近有时间会把之前的一些项目经验分享出来,有什么写得不对的欢迎大家指正,共同进步!点击跳转Cocoapod官方链接