簡體   English   中英

如何從 Ruby 調用 Jekyll 命令

[英]How to call Jekyll commands from Ruby

我有一個 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但我不確定如何初始化站點參數)。

TL; DR

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的類方法,它來自lib/jekyll/command.rb定義的超類Jekyll::Command

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

所以我們實際上想在Jekyll::Site上調用process 我們還沒有找到的一件事是如何為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使用我們之前在bin/jekyll Jekyll.configuration看到的Jekyll.configuration方法生成。 就是這樣。 現在,唯一要做的就是將各個部分放在一起;-)

更新它是因為它看起來語法已更改,現在可以使用

require "jekyll"

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

Jekyll::Commands::Build.process(options)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM