CocoaPods 原理


CocoaPods 原理_第1张图片
pod .jpg

远程 pods 库:可以是CocoaPods 公共库,也可以是一个自定义的 Git 仓库(远程私有库),
本地索引库:位置可以通过命令 $cd ~/.cocoapods/repos进入.公共库和私有库都会在该路径下
源代码库:可以是CocoaPods公共Git仓库中的库,也可以用任何一个Git, Mercurial或者SVN仓库取代,并且还可以指定具体的commit, branch或者tag。
.spec 文件:

Pod::Spec.new do |s|
  s.name     = 'NSHipsterKit'
  s.version  = '1.0.0'
  s.license  = 'MIT'
  s.summary  = "A pretty obscure library.
                You've probably never heard of it."
  s.homepage = 'http://nshipster.com'
  s.authors  = { 'Mattt Thompson' =>
                 '[email protected]' }
  s.social_media_url = "https://twitter.com/mattt"
  s.source   = { :git => 'https://github.com/nshipster/NSHipsterKit.git', :tag => '1.0.0' }
  s.source_files = 'NSHipsterKit'
end

Podfile文件:

source 'https://github.com/shijianmei/RemotePrivateSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
target 'remotePrivateLibDemo' do
  # use_frameworks!
    pod ‘remotePrivateLib’
end

pod init可以初始化一个该文件.
pod 'NSHipsterKit', '~> 1.0'可以设置项目的依赖库
.podspec文件也可以作为管理内部代码的利器:
pod 'Z', :path => 'path/to/directory/with/podspec'
source 可以设置公共库源也可以设置远程私有库源

下载原理

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)

参考资料:
https://www.jianshu.com/p/fb202af858fd
[NSHipster] CocoaPods
[唐巧]用CocoaPods做iOS程序的依赖管理

你可能感兴趣的:(CocoaPods 原理)