2012-08-22 90 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