组件化中遇到的问题--篇章一
如何依赖码云,创建私有库
快点我👉🏻:戳我告诉你怎么创建
基本名词
name:框架名
version:当前版本(注意,是当前版本,假如你后续更新了新版本,需要修改此处)
summary:简要描述,在pod search ZCPKit的时候会显示该信息。
description:详细描述
homepage:页面链接
license:开源协议
author:作者
source:源码git地址
platform:支持最低ios版本
source_files:源文件(可以包含.h和.m)
public_header_files:头文件(.h文件)
resources:资源文件(配置的文件都会被放到mainBundle中)
resource_bundles:资源文件(配置的文件会放到你自己指定的bundle中)
frameworks:依赖的.framework系统框架
libraries:依赖的.a系统库
vendored_frameworks:依赖的.framework非系统框架
vendored_libraries:依赖的.a非系统的静态库
dependency:依赖的三方库
spec 文件的基本认识
- 私有库:指的是我们真正放置组件代码的地方。
- 索引库:存放
spec
文件的地方,用于索引到代码的位置。
打个比方,索引库就好比指针,私有库就好比对象,指针中存放了对象的地址,通过地址可以找到对象! Podfile
:项目依赖哪个pod
,以何种方式依赖,它的podspec
放在哪里
spec 库引用问题
- 模块怎么依赖其他
pod
库
1 | // 这样就可以依赖了 |
- 基础模块引用了自己打包的
framework
,开发测试时可以找到头文件,主工程引入却又找不到?
1 | // 第一步:检测source_files, 如果是只包含 Classes文件下的.h,.m文件 |
- 本地私有库开发时,显示出良好的文件层划分,远程导入时,全部在一个文件夹里,而且很乱
使用subspec
,在里面添加相应的ss.source_files、dependency
1 | s.subspec 'ANCustomView' do |ss| |
- 当文件分层时,一个文件依赖另外一个文件的内容时
1 | s.subspec 'ANTransition' do |ss| |
注意:依赖的时候写的路径并不是真是的物理路径,而是层及路径
例如:ANBase
的真实物理路径: 'ANEGBase/Classes/ANBase/**.*'
,但是也要写成 ss.dependency 'ANEGBase/ANBase'
- 【报错】
ERROR | [iOS] [ANEGBase/ANCustomView] file patterns: The source_files pattern did not match any file.
这个错误使用指令pod lib lint ANEGBase.podspec
检查文件是否合法时发生的。
是设置s.source_files
时,路径不正确。这里的路径是相对于ANEGBase.podspec
文件的,如果是与ANEGBase.podspec
同级的文件夹, 直接写文件夹名称即可, 如:
1 | source_files = ANTransition |
如果是多级目录,必须要添加文件层级结构,如:
1 | ss.source_files = 'ANEGBase/Classes/ANTransition/**' |
spec
本地验证报错“non_modular_includes_in_framework_modules”
因为打包的framework
使用了pod
引入了第三方,而将这个framework
直接拖到项目中就会报这个错误,但是在xcode built-setting
中可以关掉这个检测机制
而用cocoapods
就只能使用下面的方式了(在stackoverflow翻了好久)
1 | s.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' } |
怎么引用图片
引用图片是用bundle好,还是assest好?
- 使用
s.resources
1
s.resources = ["Images/*.png", "Sounds/*"]
但是这些资源会在打包的时候直接拷贝的app的Bundle
中,这样说不定会和其它资源产生命名冲突
- 将资源都放在
bundle
里,再使用s.resources
1
s.resource = "ANEGBase/Assets/ANAppUtils.bundle"
打包时候这个bundle
会直接拷贝进app
的mainBundle
中,所以使用的时候需要在mainBundle
里面找这个bundle
,然后再找资源。如:
1 | NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"xxx" withExtension:@"bundle"]; |
- 使用
s.resource_bundles
1
2
3s.resource_bundles = {
'ANAppUtils' => ['Resources/*.png'],
'xxx' => ['xxx/*.png']
这种方法利用 framework
的命名空间,有效防止了资源冲突。
使用方法是先拿到最外面的 bundle
,然后再去找下面指定名字 的 bundle
对象,再搜索具体资源。如:
1 | // 查找当前文件所在的bundle包可以使用NSBundle类的+ (NSBundle *)bundleForClass:(Class)aClass;方法 |
- 将资源都放在
assest
里,使用s.resource_bundles
1
2
3s.resource_bundles = {
'ANEGBundleMudles' => ['ANEGBundleMudles/Assets/*']
}
s.resource_bundles
是用来存放资源文件的,cocoapods
也支持了 Assets
,我们可以Assets
管理图片
这种方法,在项目工程编译后,会出现在包的的 Frameworks/ANEGBundleMudles.framework/ANEGBundleMudles.bundle , 找到包右键show in finder
:
因为是Assets
管理,使用方式同第三步
xib资源怎么加载
待续