[英]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
但我不確定如何初始化站點參數)。
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.