为什么要使用Cocoapods私有库
在项目开发的时候常常会积累很多自己的框架及工具包,而如果需要创建新项目,就不得不把很多可能积累的库一次导入到新工程中,因为自己的控件或者逻辑处理的库可能并没开源,所以为了方便未来反复利用,我们就会考虑也变成非开源形式的Cocoapods来使用,在或者项目中的业务逻辑和UI逻辑是使用MVVP之类的构架形式进行开发的,那么为了复用和方便单元测试,同样的VM层也会进行Cocoapods私有库封装。
如何创建私有库
整体先说明一下创建一个私有的podspec包括如下那么几个步骤:
1.创建并设置一个私有的Spec Repo。
2.创建Pod的所需要的项目工程文件,并且有可访问的项目版本控制地址。
3.创建Pod所对应的podspec文件。
4.本地测试配置好的podspec文件是否可用。
5.向私有的Spec Repo中提交podspec。
6.在个人项目中的Podfile中增加刚刚制作的好的Pod并使用。
7.更新维护podspec。
创建私有Spec Repo
这里方便大家测试,所以提供一个git的公开连接,但是实际项目中大家根据自己实际的git地址就ok了。
# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
$ pod repo add XXTools https://github.com/Namunaka/NMPrivatePodDemo
此时如果成功的话进入到~/.cocoapods/repos目录下就可以看到WTSpecs这个目录了。至此第一步创建私有Spec Repo完成。
为自己的项目创建 podspec 文件
我们可以为自己的开源项目创建podspec文件,首先通过如下命令初始化一个podspec文件:
pod spec create your_pod_spec_name
该命令执行之后,CocoaPods 会生成一个名为your_pod_spec_name.podspec的文件,然后我们修改其中的相关内容即可。
关于podspec里面如何写,可以参考下面的资料
《如何编写一个 CocoaPods 的 spec 文件》
这里贴出来我自己比价简单的podspec,具体代码部分可以直接看git下里面有具体文件https://github.com/Namunaka/NMPrivatePodDemo
演示目前的工程目录
验证podspec文件有效性
pod lib lint #本地验证,貌似可以其实不用 直接远程验证 也就用下面的就好啦
pod spec lint XXTools.podspec --verbose #远程详细验证
pod spec lint XXTools.podspec --verbose --allow-warnings #远程详细验证并且允许忽略warning (但是最好不要这么做)
如果不成功对照提示的错误进行修改,另外
《Cocoapods使用私有库中遇到的坑》
《Cocoapods 项目添加Cocoapods支持遇到的坑》
这2偏文章也都介绍几个比较恶心吧唧的问题
提交podspec至私有仓库
在工程目录下执行
# pod repo push 文件夹 xxx.podspec
$ pod repo push NMPodSpecs NMPodSpecs.podspec
# pod repo push 输出详情 允许忽略warning (但是最好不要这么做)
$ pod repo push XXTools XXTools.podspec --verbose --allow-warnings
在执行前确定git是干净的也就是说保证所有修改都进行了commit 否则会坑爹的报错
使用私有仓库
执行 pod search XXTools 查询私有仓库
pod repo中明明存在的podspec 却search 不到
找到~/Library/Caches/CocoaPods/search_index.json 然后删除search_index.json 或者直接执行 rm ~/Library/Caches/CocoaPods/search_index.json
后在一次输入:pod search 你的查找库这里是XXTools
最后在需要使用私有库的工程下创建Podfile 与普通的不太一样的是这里的Podfile要额外添加source
创建Podfile文件,在 Podfile 文件开头中添加:
source 'https://github.com/Namunaka/NMPrivatePodDemo' #私有库地址
source 'https://github.com/CocoaPods/Specs.git' #公共库地址
platform :ios, ‘8.0’
target 'PodDemo' do
pod 'XXTools'
end
?xml version="1.0" encoding="UTF-8"?
如果不提供source 自己实验是没有办法install的
另外如果不添加官方库地址,若私有库的类库的子依赖,依赖了公有库某个类库,会导致pod install失败。
如果项目中添加了额外的公共库依赖比如AFNetworking之类的库 需要在添加source https://github.com/CocoaPods/Specs.git
否则又回出现只能找到公共库而找不到私有库的问题
验证podspec
网上貌似有好多验证指令但是 目前实验好用的就这个
pod spec lint 你创建的这个文件.podspec --verbose
验证失败,会出现一系列错误,但也不是无根可寻,其中出现错误频率最多的提示是
ERROR | [iOS] file patterns: Thesource_filespattern did not match any file.
此错误的原因是没有找到匹配的文件。
解决方案:
手动创建文件,具体操作方法如下
终端输入:
~/库/Caches/CocoaPods/Pods/External/XXTools/035cb9aa62b9d49f904fad1119b83da4-aebfe
进入相应文件夹,创建文件夹与source_files文件路径对应
ConfigSpecDemo/ConfigSpecDemo/Classes
文件结构如下:
XXTools
└── 035cb9aa62b9d49f904fad1119b83da4-aebfe
├── ConfigSpecDemo
│ └──ConfigSpecDemo
│ └──Classes
└── LICENSE #开源协议 默认MIT
Classes文件夹存放自己的库文件
其他-扩展
利用 podspec 的 subspec 来实现多个预处理宏的灵活配置
什么是预处理宏
开始正题前,我先说下简单什么是预处理宏,因为可能有些人不知道。先上一段例子方便理解:
代码很简单,对 JSPatch 这个库的初始化。 DEBUG 在这里就是提前定义好的预处理宏。通过结合 #ifdef ,可以只在编译测试版的时候设置 JSPatch 为 Development 状态。当要发布正式版的时候也不用修改代码,直接编译就行,中间那句 [JSPatch setupDevelopment]; 不会出现在代码里。
看明白了吧,预处理宏的主要就是用来有目的的引入或移除一部分功能(代码)。
本文的使用场景
一个第三方库会有很多功能,其中有一部分功能需要在编译阶段就决定是否引入。比如 IDFA,Apple 要求使用的话需要在提交审核的时候声明,不然就被拒。此时如果应用不用,那就会被你拖累。所以需要提供一个方法从代码里删除,这就需要用到预处理宏。用类似上面的方式改好后,让用户在 Build Settings 里设置一下就 OK。
如果这个库支持 CocoaPods,可以建一个 subspec 省去用户手动修改:
当有多个预处理宏需要设置,可以都写在这一个里面。
可如果不想写在一起,想让用户自己选择开启某些的话,怎么办?
答案很简单,多写几个 subspec。用户需要哪个,就引入哪个。具体例子继续看。
Subspec 的灵活配置
假设我们有两个功能需要预处理宏来开关,那 podspec 这么写
这里面通过两个 subpec 来开关功能。当用户用的时候,则在 Podfile 里这么引入
pod 'YOUR_SPEC', :subspecs => ['IDFA', 'IDFB']
最后整理下pod 命令
pod repo add [PrivateRepoName] [GitHubHTTPScloneURL]
pod spec create your_pod_spec_name
pod lib lint
pod spec lint
pod repo push [PrivateRepoName] [xxx.podspec]
//引用源 用,分割
--sources='http://xxx/iosDev/XXToolsPodSpecs.git,https://github.com/CocoaPods/Specs.git'
//lint显示详情
--verbose
//引用私有库、静态库引用的时候加上
--use-libraries
//允许 警告,有一些警告是代码自身带的。
--allow-warnings
一大堆参考资料(感谢各位整理的文档)
《如何编写一个 CocoaPods 的 spec 文件》
《Cocoapods 入门》
《3分钟让你的框架支持cocoapods,podspec文件讲解》
《Cocoapods私有Pod仓库》
《Cocoapods使用私有库中遇到的坑》
《Cocoapods 项目添加Cocoapods支持遇到的坑》
《上传自己的库到Cocoapods》
《使用Cocoapods创建私有podspec》
《如何创建私有 CocoaPods 仓库》
《利用 podspec 的 subspec 来实现多个预处理宏的灵活配置》
《使用私有Cocoapods仓库 中高级用法》
《Pod lint fails when containing dynamic-frameworks without simulator architectures》
《待解决 pod lib lint pod不支持i386编译环境,如何避开》
《Error: SDK “iphonesimulator9.0” Cannot be located》