我们日常使用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 install 和pod update命令都能触发打印。
所以,我们可以在podfile中直接hook,也可以通过cocoapods plugin的方式hook。
cocoapods plugin
我们可以使用pod plugins create <plugin name> 来创建一个插件。
然后我们来看看插件的目录:
接下来我们完善一下我们的插件命令:
在tytest.rb文件中添加如下代码:
def run
UI.puts "这里是tytest命令"
UI.puts "Add your implementation for the cocoapods-tytest plugin in #{__FILE__}"
end
编译插件
安装插件
查看插件是否安装
使用插件
那么,我们如何在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
接下来编译和安装同上,最后我们看一下是否安装成功
我们的tytest插件0.0.2版本已经安装成功了,接下来我们在podfile中使用一下:
在podfile中添加plugin
然后执行 pod install
我们在插件中的打印语句已经执行了。
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 成为二进制文件。