4

我有一个 Rails 应用程序,它在同一台服务器上创建/构建一些 Jekyll 站点。现在,我用这样的反引号调用 Jekyll 命令:

def build_jekyll
  result = `jekyll build -s /some/source/path -d /some/dest/path`
end

这很好用,但感觉有点不像红宝石。如果 jekyll gem 在我的 Rails Gemfile 中,有没有办法可以使用 ruby​​ 构建 jekyll 站点?

(从文档看来,我会打电话Jekyll::Commands::Build.build,但我不确定如何初始化站点参数)。

4

2 回答 2

13

TL;博士

require 'jekyll'

conf = Jekyll.configuration({
  'source'      => 'path/to/source',
  'destination' => 'path/to/destination'
})

Jekyll::Site.new(conf).process

但是你是怎么发现的?

我通过查看源代码发现了这一点。当你运行时jekyll build,你进入源文件bin/jekyll。这里有趣的部分是

command :build do |c|
  # ommitted

  c.action do |args, options|
    options = normalize_options(options.__hash__)
    options = Jekyll.configuration(options)
    Jekyll::Commands::Build.process(options)
  end
end

嗯,看起来实际的工作是在 中完成的Jekyll::Commands::Build.process,所以让我们来看看那个方法lib/jekyll/commands/build.rb

def self.process(options)
  site = Jekyll::Site.new(options)
  self.build(site, options)

  # other stuff
end

再一次,真正的魔法发生在其他地方,即在Jekyll::Commands::Build.build,也在lib/jekyll/commands/build.rb

def self.build(site, options)
  # some logging going on here

  self.process_site(site)
end

这又调用了一个名为 的类方法process_site,该方法来自于Jekyll::Command定义的超类lib/jekyll/command.rb

def self.process_site(site)
  site.process
rescue Jekyll::FatalException => e
  # some error handling
end

所以我们实际上想调用process一个Jekyll::Site. 我们还没有弄清楚的一件事是如何为Jekyll::Site实例指定选项。让我们仔细看看lib/jekyll/site.rb

def initialize(config)
  # more options ...

  self.source          = File.expand_path(config['source'])
  self.dest            = File.expand_path(config['destination'])

  # more options ...
end

所以显然我们需要提供一个哈希,其中'source''destination'键指向所需的目录。其余的配置将由 Jekyll 使用Jekyll.configuration我们之前看到的方法生成bin/jekyll。就是这样。现在,剩下要做的就是把这些碎片放在一起;-)

于 2013-08-23T18:25:34.633 回答
0

更新它,因为它看起来语法改变了,现在可以使用

require "jekyll"

options = {
    "source"      => './',
    "destination" => './_site',
    "watch" => true,
    "verbose" => true
  }

Jekyll::Commands::Build.process(options)
于 2021-10-05T21:03:42.577 回答