什么是 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 没办法索引到你指定的代码版本,就可能导致打包失败。