使用cocoapods-packager打包静态库

什么是 cocoapods-packager

cocoapods-packager 是 CocoaPods 提供的一个打包工具,可以根据 podspec 的配置,方便地将源码打包为 framework。

使用 Packager 打包

在原有仓库中,使用 pod package 命令,将原有的源码打包为静态库:

1
pod package APodSpec.podspec --library

其中,–library 指定 packager 打出静态库。

PS. 如果需要排除源码中依赖的第三方库,可以在打包命令中添加 --exclude-deps 选项。

如果仓库没有问题的话,会得到一个与当前 podspec 版本号对应的,名为 APodSpec-x.x.x 的文件夹。里面就会有已经打包好的 .a 文件和一些打包过程中的中间产物,以及一份自动生成的静态库版本的 .podspec 配置文件。

这里需要注意的是,不能直接使用它自动生成的这份 .podspec 配置文件,这份配置文件实际上是给 framework 用的,而不是给 .a 的。

配置静态库的 podspec 文件

cocoapods-packager 打包静态库的功能存在 Bugs,让人感觉像是把打包 framework 的模块拿过来随便改改充数的。它有两个问题,首先,它在打包后不会将头文件拷贝出来和 .a 放到一起,.a 所在的目录只有光秃秃的一个静态库;其次,它自动生成的 .podspec 文件中配置的竟然是 s.ios.vendored_framework = 'ios/APodSpec.framework',但我们生成的是 .a 静态库,根本就不存在 framework。

这些问题在 CocoaPods 中很早就被提了 issue,但 CocoaPods 表示——虽然这是 Bugs,但是他们是不会修复的。因此,我们需要修正一下 podspec 文件。

最简单的方法就是把仓库中原有的 podspec 文件拷贝一份过来改一改。

首先我们需要指定静态库:

1
s.vendored_libraries = "Path/to/APodSpec.a"

然后,去掉原有的 s.public_header_files 字段,并按照以下方式指定静态库的头文件:

1
s.source_files = "APodSpec/**/*.h"

需要注意的是,这里不应该使用 s.public_header_files,而是用 s.source_files 去指定。

最后,去除一些没用的配置,比如 s.resources 等,就可以了。

验证

要测试配置是否有问题的话,可以直接拿新的 podspec 文件替换掉原有的试一试,在 Demo 中 pod install 后能编译成功的话基本就没问题了。

注意事项

需要注意的是,使用 packager 打包的前提是,SDK 的 spec 足够规范。

因为 packager 在实际的打包时,并不是使用本地的工程代码进行打包,而是会去 podspec 文件中配置的 Git 仓库中拉取远端的代码。它会根据 podspec 中指定的版本号去远端仓库中拉取对应 tag 的代码到临时目录中,进行打包。

因此,如果你的 podspec 文件填写错误,或是忘记在仓库中打 tag,抑或是你的仓库没有 push 到 Spec 中,导致 CocoaPods 没办法索引到你指定的代码版本,就可能导致打包失败。