创建及使用Cocoapods私有库

为什么要使用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        

创建及使用Cocoapods私有库_第1张图片
podspec 图1
创建及使用Cocoapods私有库_第2张图片
podspec 图2

演示目前的工程目录


创建及使用Cocoapods私有库_第3张图片

验证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 来实现多个预处理宏的灵活配置

什么是预处理宏

开始正题前,我先说下简单什么是预处理宏,因为可能有些人不知道。先上一段例子方便理解:


创建及使用Cocoapods私有库_第4张图片


代码很简单,对 JSPatch 这个库的初始化。 DEBUG 在这里就是提前定义好的预处理宏。通过结合 #ifdef ,可以只在编译测试版的时候设置 JSPatch 为 Development 状态。当要发布正式版的时候也不用修改代码,直接编译就行,中间那句 [JSPatch setupDevelopment]; 不会出现在代码里。

看明白了吧,预处理宏的主要就是用来有目的的引入或移除一部分功能(代码)。

本文的使用场景

一个第三方库会有很多功能,其中有一部分功能需要在编译阶段就决定是否引入。比如 IDFA,Apple 要求使用的话需要在提交审核的时候声明,不然就被拒。此时如果应用不用,那就会被你拖累。所以需要提供一个方法从代码里删除,这就需要用到预处理宏。用类似上面的方式改好后,让用户在 Build Settings 里设置一下就 OK。

如果这个库支持 CocoaPods,可以建一个 subspec 省去用户手动修改:


创建及使用Cocoapods私有库_第5张图片


当有多个预处理宏需要设置,可以都写在这一个里面。

可如果不想写在一起,想让用户自己选择开启某些的话,怎么办?

答案很简单,多写几个 subspec。用户需要哪个,就引入哪个。具体例子继续看。

Subspec 的灵活配置

假设我们有两个功能需要预处理宏来开关,那 podspec 这么写


创建及使用Cocoapods私有库_第6张图片

这里面通过两个 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》

你可能感兴趣的:(创建及使用Cocoapods私有库)