首页

时间和精神的房子
壹只iOS程序员的修行世界,欢迎来访

如果文章对您有所帮助
将是我最大的荣幸

CocoaPods的原理与技巧(二)

下载原理

pod 'LPLineChartView', :git => 'https://github.com/xiaofei86/LPLineChartView.git', :tag => '1.0.0'

当使用 CocoaPods 导入私有库时,CocoaPods 先是根据:git => 'https://github.com/xiaofei86/LPLineChartView.git'找到对应的 Git 仓库,然后根据:tag => '1.0.0'定位到对应 tag 的提交(如果没有注明 Pod 依赖库版本则定位到最后一次的提交),然后在这次提交中检索到后缀为“.podspec”的文件(文件可以随便命名)。找到 Podspec 文件后先要验证 s.name 是否与Podfile中的一致,如果不一致则 install 时会报错“[!] Unable to find a specification for 'LPLineChartView'.”。验证成功后,就会根据 Podspec 中的 s.source_files 找到需要导入代码文件,并通过其他的数据找到对应的配置文件或资源文件等。最后,将其下载到本地项目中。如果是公有库,这些原理也相同。只是公有库需要将 Podspec 文件上传到 CocoaPods。在导入的时候通过名字 LPLineChartView 去 CocoaPods 匹配对应的 Podspec ,然后根据"s.source"去找到对应的仓库和对应的版本,然后会再去匹配新的 Podspec,后边的步骤就完全相同了。

  • 对下载原理的验证有兴趣的可以点击这里查看。

集成原理

当所有的依赖库都下载完后,CocoaPods 会将所有的依赖库都放到另一个名为 Pods 的项目中,然后让主项目依赖 Pods 项目。这样,源码管理工作都从主项目移到了 Pods 项目中。Pods 项目最终会编译成一个名为 libPods.a 的文件,主项目只需要依赖这个.a文件即可。对于资源文件,CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在每次项目编译的时候都会执行,将 Pods 依赖库的各种资源文件复制到目标目录中。CocoaPods 还通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。

版本控制原理

当执行完 pod install 之后,CocoaPods会生成一个名为 Podfile.lock 的文件。Podfile.lock 文件最大得用处在于多人开发。如果你没有在 Podfile 中指定 Pods 版本pod 'LPLineChartView',那么默认为获取当前 LPLineChartView 依赖库的最新版本。当团队中的某个人执行完 pod install 命令后,生成的 Podfile.lock 文件就记录下了当时最新 Pods 依赖库的版本,这时团队中的其它人 check 下来这份包含 Podfile.lock 文件的工程以后,再去执行 pod install 命令时,获取下来的 Pods 依赖库的版本就和最开始用户获取到的版本一致。如果没有 Podfile.lock 文件,后续所有用户执行 pod install 命令都会获取最新版本的 LPLineChartView,这就有可能造成同一个团队使用的依赖库版本不一致,这对团队协作来说绝对是个灾难!在这种情况下,如果团队想使用当前最新版本的 LPLineChartView 依赖库,有两种方案:1.更改 Podfile,使其指向最新版本的 LPLineChartView 依赖库;2.执行 pod update 命令;鉴于 Podfile.lock 文件对团队协作如此重要,所以应该加入到版本控制里面(This file should always be kept under version control)。

常用技巧

  • 不更新podspec

CocoaPods 在执行 pod install 和 pod update 时,会默认先更新一次 Podspec 索引。使用 --no-repo-update 参数可以禁止其做索引更新操作。如下所示:

pod install --no-repo-update
pod update --no-repo-update
  • 查看更新细节

pod install 和 pod update 的执行引发了很多操作。了解底层运行过程最简单的方式就是给 pod install 语句添加 –verbose 参数。这样就可以看到 pod install 和 pod update 执行过程的详细细节。

pod install --verbose
pod update --verbose
  • 使用私有的pods

我们可以直接指定某一个依赖的 Podspec,这样就可以使用公司内部的私有库。该方案有利于使企业内部的公共项目支持 CocoaPods。

pod 'LPLineChartView', :git => 'https://github.com/xiaofei86/LPLineChartView.git', :tag => '1.0.0'
  • 调整podfile位置

通常情况下我们都推荐 Podfile 文件都放在工程根目录。但 Podfile 也可以放在其他目录下,这时只需在 Podfile 中指定工程的路径即可。

xcodeproj "LPLineChartView/LPLineChartView.xcodeproj" 
xcodeproj "../LPLineChartView.xcodeproj" 
  • 管理Pods依赖库版本
pod 'LPLineChartView'                //不显式指定依赖库版本,表示每次都获取最新版本
pod 'LPLineChartView', '2.0'        //只使用2.0版本
pod 'LPLineChartView', '> 2.0'      //使用大于2.0的版本
pod 'LPLineChartView', '>= 2.0'     //使用大于或等于2.0的版本
pod 'LPLineChartView', '< 2.0'      //使用小于2.0的版本
pod 'LPLineChartView', '<= 2.0'     //使用小于或等于2.0的版本
pod 'LPLineChartView', '~> 0.1.2'   //使用大于等于0.1.2但小于0.2的版本
pod 'LPLineChartView', '~> 0.1'     //使用大于等于0.1但小于1.0的版本
pod 'LPLineChartView', '~> 0'        //使用大于0的版本,和什么都不写效果相同

由于 CocoaPods 建议采用pod 'LPLineChartView', '~> 0.1.2'这种写法,所以在制作 Pod 时,接口不向前兼容的更新最好修改版本号的第二位数。

参考资料

关注作者

分享本文

目录