问题:熟悉 CocoaPods 么?能大概讲一下工作原理么?

什么是CocoaPods

CocoaPods是iOS项目的依赖管理工具,该项目源码在Github上管理。开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和第三方开源库的时间。

  • 在使用CocoaPods之前,开发项目需要用到第三方开源库的时候,我们需要
    1.把开源库的源代码复制到项目中
    2.添加一些依赖框架和动态库
    3.设置-ObjC,-fno-objc-arc等参数
    4.管理他们的更新

  • 在使用CocoaPods后,我们只需要把用到的开源库放到一个名为Podfile的文件中,然后执行pod install.Cocoapods就会自动将这些第三方开源库的源码下载下来,并且为我们的工程设置好响应的系统依赖和编译参数。

CocoaPods的原理

  • cocoapods的下载原理

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

Pod::Spec.new do |s|

  #开源库的名字
  s.name         = "JYFNetworking"   
  #开源库当期版本
  s.version      = "2.4.0"   
  #开源库概述(打开GitHub能看到的描述)
  s.summary      = "开发中常用的自定义控件、开发经验、开发bug记录,常用宏、categories等封装,不再每个项目都手动配置,用Pod统一管理。"    
  #开源库描述 (这个描述会被用来生成开源库的标签和提高被搜到,必需写在中间一行,只要在中间一行,不需要考虑缩进)
  s.description  = <<-DESC
                   开发中经常从A项目copy一些代码(比如常用的宏、category等)到B项目,A更改了一个category,B又要改动;B更改了一个category,A也要改动,不方便同步,就容易出差错,所以,考虑用Pod来管理。
                   DESC

  #可以是开源库的GitHub地址,也可以是你自己的网址等
  s.homepage     = "https://github.com/554994782/JYFNetWorking.git"
  #我这里是参靠网上的一种写法,不会报警告,也可以直接 s.license = 'MIT'
  s.license = { :type => 'MIT', :text => <<-LICENSE
         Copyright PPAbner 2016-2017
          LICENSE
      }
  #开源库作者
  s.author             = { "jiangyunfeng" => "[email protected]" }
  #开源库作者的社交链接(此处我放的是)
  s.social_media_url   = "https://www.jianshu.com/u/a86352746d7c"

  #开源库支持的平台(暂时没考虑tvOS、OSX等)
  s.platform     = :ios
  #开源库最低支持
  s.ios.deployment_target = "8.0"

  #VIP 开源库GitHub的路径与tag值,GitHub路径后必须有.git,tag实际就是上面的版本
  s.source       = { :git => "https://github.com/554994782/JYFNetWorking.git", :branch => "develop" }

  #VIP 开源库资源文件 (我自己总结:每个文件都要有自己的路径,尤其你想目录分的比较详细的话,更具体的说明,看图对比着再说)
  s.source_files = 'JYFNetworking/JYFNetworking.h'

  #子目录Tool(2级),PPKit(1级),ss子目录可以随便写,但下面要对应
  s.subspec "Tool" do |ss|
    ss.source_files = "JYFNetworking/Tool/*.{h,swift,c,m}"
    ss.public_header_files = "JYFNetworking/Tool/*.h"
    #依赖三方库
    ss.vendored_frameworks =   "JYFNetworking/Tool/AMapFoundationKit.framework","ESNetworking/Tool/AMapLocationKit.framework"
    #依赖系统库
    ss.ios.frameworks = "CoreMotion", "CFNetwork",     "SystemConfiguration", "CoreTelephony", "QuartzCore", "CoreText",     "CoreGraphics"
    ss.ios.libraries = "z", "c++"
  end

  #开源库头文件
  s.public_header_files = "JYFNetworking/**/*.h"
  #开源库依赖库 
  s.dependency 'JYFBasic'

  # 是否支持arc
  s.requires_arc = true
end

更多相关知识可查看CocoaPods。

  • 集成原理

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

  • 版本控制原理

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

  • 更多相关知识可查看CocoaPods。

你可能感兴趣的:(问题:熟悉 CocoaPods 么?能大概讲一下工作原理么?)