配置podspec文件(二)
如果按照上篇文章的步骤走下来,完全没有问题。那恭喜你!
我自己网上学习,搞了三天。。。把该踩的坑踩个差不多了。。先上图看看各种各样的问题吧。。。
error1.png error2.png error3.png error4.png error5.png error6.png error7.png error8.png error9.png
我遇到的问题总的概况就三个方面:
- source_files\public_header_files 这两个路径填写错误,这两个写的是
物理路径
- ios.deployment_target 这个字段要打开 指定版本
- 添加依赖的时候,s.dependency 这个填的是
层级路径
,不是物理路径
物理路径:
文件中的真实路径,比如NewToo.m的路径:ProductKit/ProductKit/NewTool
wuli.png
层级路径:
层级路径可以参考安装到pod里面的文件的路径填写,比如NewToo.m的路径:ProductKit/NewTool
NewTool层级是属于ProductKit层级下的一个子subspec
fullpath.png
如果我们需要更新自己的类库, 只需要将最新的代码提交到Github, 然后创建新的release版本, 注意: 这里的版本要和podspec文件内的s.version一致, 然后再执行一遍下面的指令即可:
pod trunk push LZTool.podspec --allow-warnings
本文结合自己踩过的坑,参考网上的资料做了以下几点总结:
-
如何编写podspec文件
-
如何校验podspec文件
-
如何实现目录分层
1、如何编写podspec文件
一些常用的信息介绍:
info.png
上面列举的信息大部分来自pod默认生成的podspec文件中的给的,其中需要重点注意标识黑体的这几个信息。
你在三方库中看到的那些文件都是通过这些配置来确定的。当pod install引入三方库时,只会引入你在podspec中配置的那些文件。所以在添加依赖的时候,要用层级路径
,而不是物理路径!!!!
其中有几项配置要注意:
config1.png config2.png config3.png
关于资源文件更详细的写法,可以看这篇文章:给 Pod 添加资源文件
2、如何校验podspec文件
在podspec写好之后我们需要验证一下编写的内容是否有误。可以在命令行的三方库当前路径下使用下面的命令:
pod lib lint (从本地验证你的pod能否通过验证)
pod spec lint (从本地和远程验证你的pod能否通过验证)
pod lib lint --verbose (加--verbose可以显示详细的检测过程,出错时会显示详细的错误信息)
pod lib lint --allow-warnings (允许警告,用来解决由于代码中存在警告导致不能通过校验的问题)
pod lib lint --help (查看所有可选参数,可选参数可以加多个)
我们目前只是在本地写的三方库,所以只需要使用pod lib lint验证即可(这个过程会较为费时,需要稍微等待)。
3、如何实现目录分层
使用subspec来实现目录分层。
例如AFNetworking:
AFNetworking.png
下面举例说明,如图所示的目录结构:
这个截图的最外层目录是 ZCPKit
文件夹,这些都是物理路径!!
具体展开如下:
ZCPKit
┗━━━━Classes
┗━━━━ZCPKit.h
┗━━━━ZCPRouter
┗━━━━ZCPRouter.h
┗━━━━ZCPRouter.m
┗━━━━ZCPUtil
┗━━━━ZCPUtil.h
┗━━━━ZCPUtil.m
那我们在podspec文件里面应该这样写:
tips
:这里有个要注意的地方:
添加依赖的时候,不能按照上述文件的路径!!而应该按照pod里面的
层级路径
:pod 里面的层级路径: cengji.png
如果想有多层的目录结构还可以继续嵌套下去。
有几个需要注意的地方:
- 层级不能出现循环依赖。
比如类ZCPUtil.h中 #import "ZCPRouter.h",同时ZCPRouter.h中 #import "ZCPUtil.h"。这样当写podspec时就需要在Util层级中写dependency 'ZCPKit/Router',在Router层级中写dependency 'ZCPKit/Util'。如此便存在Router与Util层级之间的循环依赖。出现循环依赖时,三方库是无法成功提交到repo上的,会报依赖错误。解决办法是,层级间要尽量解耦。
- 分层的层级不要太多,层级不要太深。
为了避免出现上述的循环依赖错误。
- source_files使用的是真实的物理路径,而dependency依赖其他层级时使用的是层级路径,不是真实的物理路径
例如:ZCPUtil.h文件的真实路径是:ZCPKit/Framework/Util,而Util层级是属于ZCPKit层级下的一个子subspec,所以当写Router层级依赖Util层级时要写:dependency 'ZCPKit/Util'而不是dependency 'ZCPKit/Framework/Util'
需要注意的:
在检测的时候会很经常会出现各种乱七八糟的错误,在文件多的情况下不太容易一次通过,并且即使你的代码在Xcode中编译通过了,但是也还是会出现很多错误。所以你需要尽量去注意下面的几个问题:
1.当代码中存在警告时要记得使用--allow-warnings参数。
2.如果引入的文件或分好的层级需要依赖系统库或三方库,要记得使用上面介绍的libararies,frameworks等属性。
3.如果你的三方库是在一个xcode项目中编写调试,那么尽量不要用pch。
因为很多类之间的小依赖会被pch给遮掩过去,这会导致在校验时出现大量错误。
4.如果想要分层,那么尽量解耦使模块能够单独存在。
原因是当分层较多层级较深时,很可能产生循环依赖的问题。