たのもう

Rake のタスク実行時に出力されるコマンド…

$ bundle exec rake spec
/path/to/.rbenv/versions/2.3.0/bin/ruby -I/path/to/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/lib:/path/to2/vendor/bundle/ruby/2.3.0/gems/rspec-support-3.5.0/lib /path/to/vendor/bundle/ruby/2.3.0/gems/rspec-core-3.5.4/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
↑
↑ これの出力を止めたい!

ec2 'dev'
  should be stopped
  should have iam instance profile "xxxxxxxx"
  should have security group "xxxxxxxxx"

実行されるコマンド /path/to/.rbenv/versions/2.3.0/bin/ruby... の出力を止めたいのである。

技あり

以下のように書けば良かった。

require 'rspec/core/rake_task'

RSpec::Core::RakeTask.new do |t|
  t.verbose = false
end
task :default => :spec

肝は t.verbose = false ですな。
実際に実行すると以下のように出力される。

$ bundle exec rake spec

ec2 'dev'
  should be stopped
  should have iam instance profile "xxxxxxxx"
  should have security group "xxxxxxxxx"

有効

ちなみに、Rake タスク内でシェルを実行する場合には以下のように書く。

namespace :foo do
  desc 'demo'
  task :bar do
   sh "echo 'bar'", verbose: false
  end
end

肝は verbose: false ですな。
実際に実行すると以下のように出力される。

$ bundle exec rake foo:bar
bar

もしくは、コマンドラインオプションで以下のように実行することでも出力を抑制出来る。

$ bundle exec rake --quiet foo:bar
$ bundle exec rake --silent foo:bar

--quiet--silent の違いはなんですか。

$ bundle exec rake --help | egrep 'quiet|silent'
    -q, --quiet                      Do not log messages to standard output.
    -s, --silent                     Like --quiet, but also suppresses the 'in directory' announcement.

以下のように --silent は ‘in directory’ の出力も抑制するとのこと。

bash-3.2$ mkdir tmp && cd tmp
bash-3.2$ bundle exec rake --quiet -T
(in /path/to/sandbox/rake-demo)
rake foo:bar  # demo

bash-3.2$ bundle exec rake --silent -T
rake foo:bar  # demo

ありがとうございました!

元記事はこちら

小ネタ道場一本勝負 〜 Rake からタスクを呼び出す際に実行されるコマンドの出力を止めたい 〜