Thor启动Jekyll然后在浏览器中打开页面

时间:2013-03-25 04:54:32

标签: ruby thor

您好我希望Thor启动服务器 - Jekyll / Python / PHP等然后打开浏览器

然而,首发是阻止任务。

有没有办法在Thor创建子进程;或者产生一个新的终端窗口 - 无法看到和谷歌没有给我合理的答案。

我的代码

##
# Project Thor File
#
# @use thor list
##
class IanWarner < Thor

##
# Open Jekyll Server
#
# @use thor ian_warner:openServer
##
desc "openServer", "Start the Jekyll Server"
def openServer

    system("clear")
    say("\n\t")

    say("Start Server\n\t")
    system("jekyll --server 4000 --auto")

    say("Open Site\n\t")
    system("open http://localhost:4000")

    say("\n")

end

end

1 个答案:

答案 0 :(得分:1)

看起来你搞砸了。 Thor通常是一个功能强大的CLI包装器。 CLI本身通常是单线程的。

您有两种选择:创建不同的Thor后代并将它们作为不同的线程/进程运行,强制open线程/进程等待jekyll start运行(首选)或者用system("jekyll --server 4000 --auto &")进行攻击(注意最后的符号。)

后者将起作用,但你仍然要控制服务器启动(可能需要很长时间。)实现这一点的第二个丑陋的黑客是依赖sleep

say("Start Server\n\t")
system("jekyll --server 4000 --auto &")

say("Wait for Server\n\t")
system("sleep 3")

say("Open Site\n\t")
system("open http://localhost:4000")

更新:很难想象你想要收获什么。如果您想在脚本完成后让jekyll服务器继续运行:

  desc "openServer", "Start the Jekyll Server"
  def openServer
    system "clear"
    say "\n\t"

    say "Starting Server…\n\t"
    r, w = IO.pipe
    # Jekyll will print it’s running status to STDERR
    pid = Process.spawn("jekyll --server 4000 --auto", :err=>w) 
    w.close
    say "Spawned with pid=#{pid}"
    rr = ''
    while (rr += r.sysread(1024)) do
     break if rr.include?('WEBrick::HTTPServer#start')
    end 
    Process.detach(pid) # !!! Leave the jekyll running

    say "Open Site\n\t"
    system "open http://localhost:4000"
  end 

如果您想在页面打开后关闭jekyll,您也会将调用产生到openProcess.waitpid