make-podspec

创建一个私有库

当我们开始思考将自己的代码抽象出来, 作为一个个组件或者模块的时候, 考虑使用一些第三方管理工具来管理, 在项目中声明依赖是一个很好的方法, 不用再自己再项目中拖来拖去的.

当你有这种考虑的时候, 想必下面的这些工具你也有所了解的了

Cocoa Pod

首先你可以看文档, 使用现有的代码来做一个封装, 然后暴露一些方法, 做一个头文件集成到所有你想要暴露出去头文件的集合.

嗯, 一般的代码的话当你按照教程走完, 把代码放进去. pod install, 然后在 Example 中使用下来坐验证. 就可以直接使用了.

传到远程的库的话自己看看后续的文档把.

特殊需求

但是你的这个组件/库 有什么特殊的编译需求的话, 还是得动手写写项目名.podspec 这个文件是在pod install/pod update 时使用到的. 他会读取里面声明的配置作为编译这个 target 时的设置. 涉及到 build setting, build phase不等. 这个也有文档.

但是! 我们需要将一些我们用到的封装成 pod 来使用的话, 其实就没有想的那么顺利了.

好多商业闭源第三方, 并没有直接提供 pod 的集成方式, 而是给了一个.a库和一些头文件, 资源 bundle, 对接文档就是叫你直接拖进项目. 然后手动设置一些编译条件, 依赖的库.e.g 可以说是相当原始了. (但是文档全的话就算了, 例如我对接一个就是只有 OC Demo, 简单几句话, 就连 Demo 直接也跑不起来得做一些文档里没有说的事情才能正常运行的…可以说是很烂了…)

这种侵入到项目中的库, 一般都会想作为第三方来声明依赖. 于是…在集成上面吐槽的时候就碰到了很多坑…

比如, 设置编译条件的时候, 就各种设置好了之后,..终于编译不报错了. 但是在项目中引用的时候除了错. 原因就是暴露的头文件会全部集成到一个xxxx-umbralla.h 中声明. 本来这是没有什么问题的. 但是因为这个库. 里面有些东西. 如果全部在一个文件里#import 的话, 会有一些冲突…这就坑了…

后来想做好一个封装, 将自己封装的东西暴露出去就好了. 就不暴露原来的东西了.

但是还是出了问题. 在声明的 public 文件中 import 了原来的文件, 这些头文件在pod install 后会被放到 project 的类型… 然后…竟然… public 处的头文件不能import 其他的??? 然后就一直报不能找到头文件的错误.

期间参考了很多, 总算是能把 podspec 文件写到target 不报错…没想到最后还是不行…

ref:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 单独设置某个文件为不使用 ARC
spec.source_files = 'Source/**/*.{h,m}'
non_arc_files = 'Source/Factory/Internal/NSInvocation+TyphoonUtils.m'
spec.ios.exclude_files = 'Source/osx', non_arc_files #I also tried using just spec.exclude_files
spec.osx.exclude_files = 'Source/ios', non_arc_files

spec.requires_arc = true
spec.subspec 'no-arc' do |sna|
sna.requires_arc = false
sna.source_files = non_arc_files
end

# 设置整个项目 xcconfig
spec.xcconfig = {'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2'}

# 当有第三方库的依赖需要声明设置某个 `Linbrary Search Path` 时, 文档中是没有说能怎么设置的, 这里找到一篇说到就是声明了这个.a 库的时候, 就会自动设置这个库的地hi 在这个属性中.
#
subcfiles.vendored_libraries = "MyLibrary/lib/ios/inner.a"

no_arc a single file

Pods依赖库快速开发入门

使用CocoaPods开发lib库

Carthage