iOS组件化-cocoapods hook

208 阅读2分钟

我们日常使用cocoapods可能最多的就是为项目集成某个组件,那在我们使用命令pod install 之后有没有想过pod都做了些什么,我们有没有可能在install的过程中做一些自定义的事情呢?当然是可以的。

cocoapods为我们提供了几个接口来允许我们在pod过程中做点别的事情。

pre_install

这个钩子允许您在 Pod 下载后但在安装之前对它们进行任何更改。

pre_integrate

这个钩子允许您在项目写入磁盘之前进行更改。

post_install

这个钩子允许您在生成的 Xcode 项目写入磁盘之前对其进行任何最后更改,或者您可能想要执行的任何其他任务。

post_integrate

此钩子允许您在项目写入磁盘后进行更改。

pre_install do |installer|
  puts "pre_install"
end

post_install do |installer|
  puts "post_install"
end

这时候调用pod installpod update命令都能触发打印。

所以,我们可以在podfile中直接hook,也可以通过cocoapods plugin的方式hook。

cocoapods plugin

我们可以使用pod plugins create <plugin name> 来创建一个插件。

然后我们来看看插件的目录:

Untitled.png

接下来我们完善一下我们的插件命令:

Untitled.png

在tytest.rb文件中添加如下代码:

def run
  UI.puts "这里是tytest命令"
  UI.puts "Add your implementation for the cocoapods-tytest plugin in #{__FILE__}"
end

编译插件

Untitled.png

安装插件

Untitled.png

查看插件是否安装

Untitled.png

使用插件

Untitled.png

那么,我们如何在podfile中使用该插件呢

找到文件:lib/cocoapods_plugin.rb,添加如下代码:

require 'cocoapods-tytest/command'
module CocoapodsTYtest
	Pod::HooksManager.register('cocoapods-tytest', :post_install) do |context|
		Pod::UI.puts "`pod install` 结束了. 执行tytest插件的代码"
	end
end

修改version

module CocoapodsTytest
  VERSION = "0.0.2"
end

接下来编译和安装同上,最后我们看一下是否安装成功

Untitled.png

我们的tytest插件0.0.2版本已经安装成功了,接下来我们在podfile中使用一下:

在podfile中添加plugin

Untitled.png

然后执行 pod install

Untitled.png

我们在插件中的打印语句已经执行了。

cocoapods hook在实际的组件化开发中有有很多很有用的作用,比如:

  • 可以调整资源位置,在pod install之后修改资源位置。
  • 可以将组件二进制化,一般我们在pod install之后组件是以源码的形式集成到工程中的,我们可以将其在pod install之后改成framework来提高项目的编译速度。

第三方插件

cocoapods-binary

$ gem install cocoapods-binary
plugin 'cocoapods-binary'

use_frameworks!
# all_binary!

target "HP" do
    pod "TYTestPodA", :binary => true
end

plugin 'cocoapods-binary'

在 Podfile 的头部添加

:binary => trueall_binary!

作为一个特定 pod 的选项添加,或

在所有目标之前添加,这会使所有 pod 成为二进制文件。