大数据

理解CocoaPods的Pod Lib Create

前言

在我们想要发布自己的pod文件时,需要通过Pod Lib Create指令去创建pod,然后添加文件,测试后发布.
这次我们来探究下Pod Lib Create到底是如何实现的,该指令帮我们做了什么呢?

pod lib create

通过pod lib create创建一个pod,分析创建流程
当执行pod lib create ProjectName时,其实是下载了一个pod模板,然后在内部通过更改.podspec文件的配置定制化自己的pod,
pod lib create ProjectName其实使用了默认参数,补全的话pod lib create ProjectName --template-url=https://github.com/CocoaPods/pod-template.git,
执行:

pod lib create

分析

  • Cloning https://github.com/CocoaPods/pod-template.git into ProjectName.
    创建一个和指定的项目名相同的文件夹,然后将pod-template克隆下拉

  • Configuring TemplateDemo template
    对当前项目进行配置
    pod-template是cocoapods官方提供的一个模板,做了什么呢

    pod-template

    看一下文件路径

    pod-template

Configuring TemplateDemo template做了什么呢?
先找当前路径下configure文件,文件夹内容

#!/usr/bin/env ruby

$current_dir = File.dirname(File.expand_path(__FILE__))

Dir[File.join($current_dir, "setup/*.rb")].each do |file|

require_relative(file)

end

pod_name = ARGV.shift

Pod::TemplateConfigurator.new(pod_name).run

根据上述命令:
可得知,遍历并通过require_relative(file)获得访问在setup文件夹下寻找以.rb为后缀名的文件的权限,
然后Pod::TemplateConfigurator.new(pod_name).run运行TemplateConfigurator文件的内容
看一下setup下面有什么?

setup文件夹

TemplateConfigurator文件内,配置了在终端的显示样式,并通过

 @message_bank = MessageBank.new(self)
 @message_bank.show_prompt
 @message_bank.show_prompt

等方法,引用MessageBank内的命令,具体不再赘述,感兴趣的可以到ruby文件去查看.

延伸

我们可以定义自己的模板,仿照pod-template,配置configure文件,但是相应的参数可以在内部之间定义好,就不需要每次pod lib create时填写各种参数.

执行结果

文件夹目录结构如下

MyLib
  ├── .travis.yml
  ├── _Pods.xcproject
  ├── Example
  │   ├── MyLib
  │   ├── MyLib.xcodeproj
  │   ├── MyLib.xcworkspace
  │   ├── Podfile
  │   ├── Podfile.lock
  │   ├── Pods
  │   └── Tests
  ├── LICENSE
  ├── MyLib.podspec
  ├── Pod
  │   ├── Assets
  │   └── Classes
  │     └── RemoveMe.[swift/m]
  └── README.md
  • Pod 用来存放添加的类
  • RemoveMe 示例类,可以直接删除

注意: 基于自定义pods的实现细节,在向Pod/Classes或者Pod/Assets文件增加类或者更新podspec文件时,需要运行pod install或者pod update

发布私有库

之前的开发和测试就绪后,就要准备发布了.

  • pod lib lintpod spec lint :首先要检测Podspec的正确性
    pod lib lint不会连接网络,而是检查文件格式
    pod spec lint 会读取线上的repo并检查相应的tag

    • pod repo push SPEC_REPO *.podspec --verbose 发布po