我遇到了 Ruby 的问题。具体来说,
spawn()
和fork()
方法。
我正在 Windows 上使用 Nanoc 开发一个网站,在尝试实现
nanoc-live
gem 时,我收到消息说 fork()
在这台机器上没有实现。
在研究了我能做的事情之后,我真正回来的唯一一件事就是用
spawn()
代替它。但是,我不知道红宝石。 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
提前致谢。