CocoaPods进阶使用

CocoaPods 是iOS开发中最常使用的依赖管理工具,可以提高我们平时开发集成一些三方库的效率,和更方便的实践组件化的开发模式;cocoaPod可以省去工程配置时间,对后续的三方库、私有库等的版本迭代管理也很便利;

CocoaPods的基础使用

在工程目录下生成Podfile文件后,通过执行pod install把文件内添加的组件集成进APP。pod install完成后,这些组件都放在一个Pods的工程中,之后通过xcode的workspace来管理pod工程和我们自己的工程。

第一次运行pod install时, .xcworkspace项目Pods目录还不存在, pod install命令运行完成后,这些就都会被创建;

区分pod install 与 pod update

我们在使用这个工具时,最经常用到的命令就是pod installpod update;这两个命令都能为我们安装指定的Pod库,但是他们的使用略有区别,有各自不同的适用场景;

了解这两个命令的差异前,需要先对Podfile.lock文件有所了解;

  • Podfile.lock文件中记录了每个pod的当前已安装版本,并锁定这些版本(.lock命名因此而来);
  • 当运行pod install命令时,它只解析尚未列在Podfile.lock中的依赖库,在下载并安装新的pod时, 会在Podfile.lock文件中写入新的pod库的当前指定版本;
  • 对于已经在Podfile.lock中列出的pod, pod install命令不会尝试检查是否有更新的版本;而是直接使用在Podfile.lock文件中的pod版本;

pod install 适合使用的场景

  1. 通常在项目刚创建并使用CocoaPods时,通过这个命令安装指定的pod库,并生成相应的工程配置;
  2. 其次在Podfile增加删除 某个pod后, 通常也会通过执行pod install命令来完成更新;pod install不会尝试更新已安装的pod库的版本;

pod update 适合使用的场景

1、当运行pod update时,CocoaPods会把Podfile中所有的pod库 都更新到指定tag的最新引用版本;并在Podfile.lock中写入最新的版本号;也就是我们需要对引用的库做更新时(如三方库更新了内容修复了某个bug等等情况),使用这个命令完成依赖版本的更新
2、执行pod update PodName命令更新指定的某个PodName库到最新版本;

pod outdated

pod outdated命令可以检测出所有比Podfile.lock中写入的版本(每个pod当前安装的版本)更新的pod版本;

cocoapods创建开放组件库

1、podspec文件

.podspec 文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework和lib、编译选项和某个库所需要的依赖等。

通过~/.cocoapods/repos路径查看 本地中心仓库文件夹,会发现保存的都是podspec文件;当我们执行pod search PODNAME命令时,cocoapods会查找 本地中心仓库文件夹 中已有的podspec文件,如果匹配到PODNAME库,就会列出所有release 版本;

2、为开源项目创建podspec文件

我们可以为自己的开源项目创建podspec文件,在工程目录下通过如下命令初始化一个podspec文件:

pod spec create mySpecFile
end

执行该命令后,CocoaPods 会生成一个名为mySpecFile.podspec的文件,然后我们修改其中的相关内容即可,以下是一个podspec文件的例子:


Pod::Spec.new do |s|
  s.name             = 'QLMutilTableView'
  s.version          = '1.0.0'
  s.summary      = '多表的实现'
  s.homepage    = 'https://www.jianshu.com/p/589fcc1d22b9'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'qianlei' => '[email protected]' }
  s.source           = { :git => '//https://github.com/qianleileilei/QLMutilTableView.git', :tag => 1.0.0 }
  s.ios.deployment_target = '9.0'
  s.source_files = 'QLMutilTableView/QLMutilTableView/**/*'
  s.frameworks = 'UIKit', 'Foundation'

end

之后可以通过如下命令验证podspec文件是否有错误或警告:

pod spec lint your_podspec_name.podspec

如果验证不通过,会有详细的ERROR和WARING提示,可根据提示信息进行修改;验证通过后,使用以下命令把podspec文件推送到Cocoapods官方repo源:

pod trunk push your_podspec_name.podspec

这一步完成后,再次更新下本地的repo中心仓库,这个podspec文件就可以在我们本地的repo中心仓库中检索到了;第三方使用者也可以通过在Podfile文件中添加pod 'PodName'引用到这个开源库了;

3、添加git仓库作为私有中心仓库

直接在~/.cocoapods/repo目录下面创建一个目录MyPrivateSpec,放自己的podspec,这里需要符合cocoapods对中心代码库的文件结构树的规定:

  • 在~/.cocoapods/repo 目录下创建 MyPrivateSpec
  • MyPrivateSpec文件夹下创建 YourProjrctName
  • YourProjrctName文件夹下创建 1.0.0版本号
  • 1.0.0版本文件夹下放入 对应的podspec文件
  • MyPrivateSpec用git托管,推送到git server上

这个时候就可以共享这个私有的中心仓库了,其他人如果更新了本地repo仓库(通过以下命令添加了repo仓库):

pod repo add reponame [email protected]: MyPrivateSpec.git

就可以通过pod search YourProjrctName搜索到共享的开源库了;

如果需要把自己私有库的podspec文件推送到对应的私有仓库上,可以通过以下命令实现(这之前还是需要先对podspec文件做下校验):

pod repo push [MyPrivateSpec] MePods.podspec  --allow-warnings

Cocoapods原理部分

CocoaPods 使用Ruby语言编写,Podfile文件的语法也遵循Ruby的语法;CocoaPods通过把所有的依赖库都放到 Pods 子项目下,然后通过xcode的workspace来管理这个pod工程和我们自己的工程;

Pods 项目最终会编译成一个名为 libPods.a 的文件,主项目其实最终只依赖了这个 .a 文件;

以下是pod install的内部执行流程:

  • 查看 ~/.cocoapods/repo/master/Specs 是否存在当前需要的依赖
  • 存在,从这个本地三方库信息库中获取 Podfile 中对应三方库的 git 地址
  • 不存在,输出 Setting up CocoaPods Master repo,并拉取三方库信息库到 ~/.cocoapods/repo/中
  • 使用 git 命令从 GitHub 上拉取 Podfile 中对应的三方库源码

关于pod install过程更深入的了解还可以看这里,通过这条命令的执行过程,基本可以了解到CocoaPods内部的主要逻辑;

你可能感兴趣的:(CocoaPods进阶使用)