需求描述
-针对项目中组件化进程中,多个私有库及第三方库的引用,依赖链长度是逐渐增加的,为了便于版本管理,需要知道项目中所有库的依赖项。
思考
了解此处的前提是,对cocoapods私有库有所了解,对于私有库来说,基本信息都放在.podspec文件中。我们先来看一下podspec长什么样:
image.png
具体各个字段代表的含义,此处就不赘述了。
对于依赖项: dependency
如果这里去掉了注释,代表MJExtension内部依赖了AFNetworking
我们需要的就是所有库中的每个库的依赖项
so,如果我们拿到所有库的podspec,从中获取dependency 内容,就解决了该问题。
方法一
对应的.podspec文件,还有一类文件,.podspec.json
可以通过工程文件中 -- Pods(.xcodeproj同目录下)--》Local Podspecs
该目录下存放的就是.json文件
也可以通过终端中
//打印转换后的JSON。
$ pod ipc spec Name.podspec
//转换JSON
$ pod ipc spec Name.podspec >> Name.podspec.json
转换成json文件后,我们就可以解析json,来获取该库的依赖项
这里我写了一个shell脚本,通过js插件 将依赖项输出到out.log
for file in ./*.json
do
if test -f $file
then
jq '.dependencies' $file >../out.log
fi
if test -d $file
then
echo $file 是目录
fi
done
方法二
方法一还需要自己写脚本,并且Local Podspecs 里面不一定包含所有库的podspec的json文件
那么,还有什么办法呢?
在Local Podspecs 所在同一目录中,即Pods文件下,有一个文件Manifest.lock,这玩意干嘛的?
Manifest.lock 是 Podfile.lock 的副本,每次只要生成 Podfile.lock 时就会生成一个一样的 Manifest.lock 存储在 Pods 文件夹下。在每次项目 Build 的时候,会跑一下脚本检查一下 Podfile.lock 和 Manifest.lock 是否一致。
我们看一下里面长什么样:
PODS:
- AFNetworking/NSURLSession (3.1.0):
- AFNetworking/Reachability
- AFNetworking/Security
- AFNetworking/Serialization
- AFNetworking/Reachability (3.1.0)
- AFNetworking/Security (3.1.0)
- AFNetworking/Serialization (3.1.0)
- Masonry (1.0.0)
DEPENDENCIES:
- Masonry (= 1.0.0)
EXTERNAL SOURCES:
xxxx:
:path: "../"
SPEC CHECKSUMS:
AFNetworking: xxxxxxx
PODFILE CHECKSUM: xxxxxx
COCOAPODS: 1.2.1
image.png
这东西不是正是我们所需要的么!
最后
对于这个问题,也只是为了知道工程的所有依赖项,如果某一个组建库出现问题,便于快速定位和不遗漏解决问题。需求解决了,也学到js,js插件能过快速解析json文件输出所需内容。
对于podfile.lock可参考👇
网友评论