我在使用Ruby时遇到了问题,具体来说是spawn()
和fork()
方法。
我正在Windows上使用Nanoc开发网站,在尝试实现nanoc-live
gem时,我收到了一条消息,提示这台机器上未实现fork()
。
在研究了相关资料后,我唯一得到的建议就是用spawn()
替换它。然而,我不懂Ruby,而且nanoc-live文档已经无法访问。我在支持论坛上询问过,但没有得到帮助。
我不轻易向别人请教如何解决问题,因为我喜欢自己解决问题,但这个问题让我束手无策,而我又不是一个Ruby开发者。我该如何替换下面的方法调用,以便使用spawn()
?或者,如果有人有其他解决方案,那也很好。
Ruby version 3.2.2
Nanoc version 4.12.15
Windows 10
这是有问题的方法
def run_parent
# create initial child
pipe_read, pipe_write = IO.pipe
fork { run_child(pipe_write, pipe_read) { |s| yield(s) } } Here is the method call
pipe_read.close
changes = gen_lib_changes
puts 'Listening for lib/ changes…'
changes.each do |_e|
# stop child
pipe_write.write('q')
pipe_write.close
Process.wait
# create new child
pipe_read, pipe_write = IO.pipe
fork { run_child(pipe_write, pipe_read) { |s| yield(s) } }
pipe_read.close
end
rescue Interrupt
end
这是由fork()
调用的run_child方法
def run_child(pipe_write, pipe_read)
pipe_write.close
site = Nanoc::Core::SiteLoader.new.new_from_cwd
changes_enum = gen_changes_for_child(site)
yield(site)
quit = Object.new
parent_enum = Enumerator.new do |y|
pipe_read.read
y << quit
end
puts 'Listening for site changes…'
SlowEnumeratorTools.merge([parent_enum, changes_enum]).each do |e|
break if quit.equal?(e)
$stderr.print 'Reloading site… '
$stderr.flush
site_loader = Nanoc::Core::SiteLoader.new
site = Nanoc::Core::Site.new(
config: Nanoc::Core::ConfigLoader.new.new_from_cwd,
data_source: site_loader.gen_data_source_for_config(site.config),
code_snippets: site.code_snippets,
)
$stderr.puts 'done'
yield(site)
end
exit 0
rescue Interrupt
exit 0
end
提前致谢。