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
。就是这样。现在,剩下要做的就是把这些碎片放在一起;-)