如何 Test/Debug Jekyll 插件?
How to Test/Debug Jekyll Plugins?
对于博客,我将一个内联标签放在一起,从指定的网页中提取 header 信息。它可以工作,但我需要添加缓存,这样我就不会进行冗余的网络调用。
我想要一个比重新启动服务器并等待重建更紧凑的调试周期,但是 运行将插件设置为 Ruby 代码报告 uninitialized constant Liquid (NameError)
。这是有道理的,因为它不是 require
d,也不会 运行,因为插件只是一个 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 文件中提取参数,具体取决于所需的测试。
对于博客,我将一个内联标签放在一起,从指定的网页中提取 header 信息。它可以工作,但我需要添加缓存,这样我就不会进行冗余的网络调用。
我想要一个比重新启动服务器并等待重建更紧凑的调试周期,但是 运行将插件设置为 Ruby 代码报告 uninitialized constant Liquid (NameError)
。这是有道理的,因为它不是 require
d,也不会 运行,因为插件只是一个 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 文件中提取参数,具体取决于所需的测试。