Ruby on rails 如何从Ruby调用Jekyll命令
我有一个Rails应用程序,可以在同一台服务器上创建/构建一些Jekyll站点。现在,我用如下反勾号调用Jekyll命令:Ruby on rails 如何从Ruby调用Jekyll命令,ruby-on-rails,ruby,jekyll,Ruby On Rails,Ruby,Jekyll,我有一个Rails应用程序,可以在同一台服务器上创建/构建一些Jekyll站点。现在,我用如下反勾号调用Jekyll命令: def build_jekyll result = `jekyll build -s /some/source/path -d /some/dest/path` end 这很好,但感觉有点像红宝石。如果jekyll gem在我的Rails gem文件中,有没有一种方法可以使用ruby构建jekyll站点? (从文档中,看起来我会调用Jekyll::Commands::
def build_jekyll
result = `jekyll build -s /some/source/path -d /some/dest/path`
end
这很好,但感觉有点像红宝石。如果jekyll gem在我的Rails gem文件中,有没有一种方法可以使用ruby构建jekyll站点?
(从文档中,看起来我会调用Jekyll::Commands::Build.Build
,但我不确定如何初始化site参数) TL;博士
但是你是怎么发现的?
我通过看一眼就明白了这一点。运行jekyll build
时,将输入源文件。有趣的是
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
HM,看起来实际的工作是在<代码> JekyLL::命令::Buff.Engult/Cudio>中,所以让我们来看看这个方法:
同样,真正的神奇发生在其他地方,即在Jekyll::Commands::Build.Build中,也在
这反过来调用一个名为process\u site
的类方法,该类方法来自中定义的超类Jekyll::Command
因此,我们实际上想在Jekyll::Site
上调用process
。我们还需要了解的一件事是如何为Jekyll::Site
实例指定选项。让我们仔细看看
显然,我们需要提供一个散列,其中包含指向所需目录的'source'
和'destination'
键。其余的配置将由Jekyll使用前面在bin/Jekyll
中看到的Jekyll.configuration
方法生成。就这样。现在,唯一要做的就是把这些碎片拼在一起;-) 文档中没有列出方法Jekyll::Site.new。你在哪里找到的?在来源;-)我看到了对该方法的调用,但是在类Jekyll::Site的源代码中没有定义一个新的()方法:我当时心情很好,所以我写了我是如何逐步完成代码的:)您通常在Ruby中定义initialize
方法来定义构造函数。new
方法将在内部调用此函数。只有极少数情况下需要覆盖继承自对象
类的现有新
方法。
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
def self.process(options)
site = Jekyll::Site.new(options)
self.build(site, options)
# other stuff
end
def self.build(site, options)
# some logging going on here
self.process_site(site)
end
def self.process_site(site)
site.process
rescue Jekyll::FatalException => e
# some error handling
end
def initialize(config)
# more options ...
self.source = File.expand_path(config['source'])
self.dest = File.expand_path(config['destination'])
# more options ...
end