配置podspec文件(二)
如果按照上篇文章的步骤走下来,完全没有问题。那恭喜你!
我自己网上学习,搞了三天。。。把该踩的坑踩个差不多了。。先上图看看各种各样的问题吧。。。
![](https://img.haomeiwen.com/i2530231/d4afb3c9cc19bbdf.png)
![](https://img.haomeiwen.com/i2530231/5553af91e5cc5cfb.png)
![](https://img.haomeiwen.com/i2530231/4783e48fe88239a9.png)
![](https://img.haomeiwen.com/i2530231/494b73c3c9a51f62.png)
![](https://img.haomeiwen.com/i2530231/4e31389a9caa3b9a.png)
![](https://img.haomeiwen.com/i2530231/ca2c092cc1a58a24.png)
![](https://img.haomeiwen.com/i2530231/a88062d18f0a86b9.png)
![](https://img.haomeiwen.com/i2530231/0a480ccae8de6aac.png)
![](https://img.haomeiwen.com/i2530231/ec9826bd847285aa.png)
我遇到的问题总的概况就三个方面:
- source_files\public_header_files 这两个路径填写错误,这两个写的是
物理路径
- ios.deployment_target 这个字段要打开 指定版本
- 添加依赖的时候,s.dependency 这个填的是
层级路径
,不是物理路径
物理路径:
文件中的真实路径,比如NewToo.m的路径:ProductKit/ProductKit/NewTool
![](https://img.haomeiwen.com/i2530231/328ff3283970d9c1.png)
层级路径:
层级路径可以参考安装到pod里面的文件的路径填写,比如NewToo.m的路径:ProductKit/NewTool
NewTool层级是属于ProductKit层级下的一个子subspec
![](https://img.haomeiwen.com/i2530231/d90dd764d9bfa08c.png)
如果我们需要更新自己的类库, 只需要将最新的代码提交到Github, 然后创建新的release版本, 注意: 这里的版本要和podspec文件内的s.version一致, 然后再执行一遍下面的指令即可:
pod trunk push LZTool.podspec --allow-warnings
本文结合自己踩过的坑,参考网上的资料做了以下几点总结:
-
如何编写podspec文件
-
如何校验podspec文件
-
如何实现目录分层
1、如何编写podspec文件
一些常用的信息介绍:
![](https://img.haomeiwen.com/i2530231/1e816532a7f0130b.png)
上面列举的信息大部分来自pod默认生成的podspec文件中的给的,其中需要重点注意标识黑体的这几个信息。
你在三方库中看到的那些文件都是通过这些配置来确定的。当pod install引入三方库时,只会引入你在podspec中配置的那些文件。所以在添加依赖的时候,要用层级路径
,而不是物理路径!!!!
其中有几项配置要注意:
![](https://img.haomeiwen.com/i2530231/672d0967b746835f.png)
![](https://img.haomeiwen.com/i2530231/4876820660a6124e.png)
![](https://img.haomeiwen.com/i2530231/8186e0d7eafeb588.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:
![](https://img.haomeiwen.com/i2530231/c6e6612a357f3639.png)
下面举例说明,如图所示的目录结构:
这个截图的最外层目录是 ZCPKit
文件夹,这些都是物理路径!!
![](https://img.haomeiwen.com/i2530231/7e28c136377aa85a.png)
具体展开如下:
ZCPKit
┗━━━━Classes
┗━━━━ZCPKit.h
┗━━━━ZCPRouter
┗━━━━ZCPRouter.h
┗━━━━ZCPRouter.m
┗━━━━ZCPUtil
┗━━━━ZCPUtil.h
┗━━━━ZCPUtil.m
那我们在podspec文件里面应该这样写:
![](https://img.haomeiwen.com/i2530231/1f6ebbb46ab36bab.png)
tips
:这里有个要注意的地方:
添加依赖的时候,不能按照上述文件的路径!!而应该按照pod里面的
层级路径
:pod 里面的层级路径:
![](https://img.haomeiwen.com/i2530231/35bc3d429c7fc0d3.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.如果想要分层,那么尽量解耦使模块能够单独存在。
原因是当分层较多层级较深时,很可能产生循环依赖的问题。