如何 Test/Debug Jekyll 插件?

How to Test/Debug Jekyll Plugins?

对于博客,我将一个内联标签放在一起,从指定的网页中提取 header 信息。它可以工作,但我需要添加缓存,这样我就不会进行冗余的网络调用。

我想要一个比重新启动服务器并等待重建更紧凑的调试周期,但是 运行将插件设置为 Ruby 代码报告 uninitialized constant Liquid (NameError)。这是有道理的,因为它不是 required,也不会 运行,因为插件只是一个 class 定义。

所以,我尝试为 运行 代码创建一些脚手架,或者我认为应该是脚手架的东西。

require 'liquid'
require_relative '../_plugins/header.rb'

ht = HeaderInlineTag.new
ht.initialize 'header', 'some path'
puts ht.render()

这会产生...

_test/header.rb:4:in `<main>': private method `new' called for HeaderInlineTag:Class (NoMethodError)

考虑到 initialize() 可能是 运行 创建 objects 的可能性,我合并了前两行代码,但也没有用。同样的错误,不同的函数名称。该插件不会将任何内容标记为 private,并且声明方法 public 不会更改任何内容。

在不携带整个博客的情况下测试插件还需要什么?

解决方案超出了我 Ruby 的知识范围,但是 大部分都很简单,一旦我连接了四处飘荡的信息片段。

首先,this existing answer 是关于处理 Rails 的特定问题,但顺便展示了如何处理私有 new 方法:通过 send 调用它们,如在 HeaderInlineTag.send :new.

然后,这个间接调用 .new() 现在(当然)调用 .initialize(),这意味着它需要任何插件都需要的三个参数。两个参数用于测试本身,所以它们很简单。第三个是解析上下文。关于编写 Jekyll 插件的文档从来都不清楚解析上下文到底是什么,因为它是作为构建过程的一部分自动发送的。然而,一些研究和测试发现 Liquid::ParseContext 是罪魁祸首。

最后,.render() 也采用 ParseContext 值。

因此,测试脚手架应该看起来像这样。

require 'liquid'
require_relative '../_plugins/header.rb'

context = Liquid::ParseContext.new
ht = HeaderInlineTag.send :new, 'header', 'some path...', context
puts ht.render context

我可以使用 ruby _test/header.rb 从我博客的根文件夹中调用它,它会打印插件的输出。我现在可以更新此脚本以从命令行或 CSV 文件中提取参数,具体取决于所需的测试。