2012-08-22 54 views
7

如何抑制db:load:schema的输出?运行在Rake中抑制输出任务db:schema:load

bundle exec rake db:schema:load 

-s-q,甚至VERBOSE=false选项使得输出无差异;出现我不想看到的相同的“create_table ... add_index ...”垃圾。我从一个自定义的Rake任务中调用它,并且我不希望用户每次都看到所有这些。

UPDATE:

我通过解决与@Deefour一些指导的问题:

system "bundle exec rake db:schema:load -s RAILS_ENV=#{Rails.env} >NUL" 

>NUL是Windows机器,基于Unix的可以使用> /dev/null

而不是

Rake::Task['db:schema:load'].invoke 

,因为我一直在做我的自定义任务。请注意,此解决方案特定于Windows机器。对于基于Unix的机器,我想你应该能够使用下面接受的解决方案。

+0

你是如何运行在耙文件上面的命令? – deefour

+0

Rake :: Task ['db:schema:load']。invoke – aguazales

+3

我发现使用单独的'system'调用非常缓慢,所以请看@witwitch建议的'quietly'或'silence_stream'。 –

回答

25

这里是一个更清洁的解决方案,能跨系统:

silence_stream(STDOUT) do 
    # anything written to STDOUT here will be silenced 
    Rake::Task["db:schema:load"].invoke 
end 

quietly do 
    # anything written to STDOUT or STDERR here will be silenced 
    Rake::Task["db:schema:load"].invoke 
end 

我喜欢silence_stream(STDOUT)quietly,因为这将仍然允许写入STDERR错误信息是如图所示,这将在rake命令开始执行时有所帮助。

参考文献:silence_streamsilence_warnings,& quietly

+0

Gosh darn brilliant!每天都会学到新的东西。干杯。 –

+0

测试rake任务时也很有用。使输出更清洁 –

+0

两个都在rails 4.2中被弃用因为它们不是线程安全的 –

3

而不是调用Rake::Task['...'].invoke任务,您可以在子shell中运行该命令,将输出重定向到/dev/null

system "bundle exec rake db:schema:load > /dev/null 2>&1" 
+0

当我这样做,而不是db:schema:load的输出,它显示“进程无法访问该文件,因为它正在被另一个进程使用”,并且db:schema:load没有运行。 – aguazales

+0

你可以向你的问题添加'db:schema:load'在其中执行的rake任务的其余部分吗? – deefour

+0

阅读'/ dev/null',我意识到它可能对您有帮助,知道我在Windows计算机上,而不是基于Unix。 :P – aguazales