mugyu
4/23/2014 - 2:48 AM

Rake における $trace の 代替手段

Rake における $trace の 代替手段

Rake における $trace の 代替手段

Rake 10.0.0 から $trace は使えなくなった様子。

http://rake.rubyforge.org/doc/release_notes/rake-10_0_0_rdoc.html

Classic namespaces are now gone. Rake is no longer able to reflect the options settings in the global variables ($rakefile, $show_tasks, $show_prereqs, $trace, $dryrun and $silent). The --classic-namespace option is no longer supported.

ですが、主にRake + YARDの関連ページをGoogle先生で検索すると if $trace を使った記述がやたらと出てきて困っちゃいます(というか、コピペしたらハマった)。

そこで代替手段ですが、どうも Rake.application.options.trace == true で判定すれば良いらしい。

あるいは簡便な手段として verbose == true も有りな感じ。

という訳で実験してみました。実験結果は以下のとおりです。

前提

こんな環境で実験しました。

$ cat Rakefile
task :options do
  p ["$trace", $trace]
  p ["Rake.application.options.trace", Rake.application.options.trace]
  p ["Rake.application.options", Rake.application.options]
  p ["verbose", verbose]
end

$ rake --version
rake, version 10.3.1

$ ruby -v
ruby 2.0.0p247 (2013-06-27) [i386-mingw32]

オプションなしで実行

$ rake options
["$trace", false]
["Rake.application.options.trace", nil]
["Rake.application.options", #<OpenStruct rakelib=["rakelib"], trace_output=#<IO:<STDERR>>>]
["verbose", #<Object:0x2827608>]

-t の指定をしていない時は Rake.application.options.trace == nil

ついでに verbose の確認をしていますが -v なり -q なりを指定しないとObjectを返すらしい。 うかつに if varbose then とかしちゃうと失敗しそう。

Rake -t を実行 (trace モード)

$ rake options -t
!!!** Invoke options (first_time)!!!
!!!** Execute options!!!
["$trace", false]
["Rake.application.options.trace", true]
["Rake.application.options", #<OpenStruct rakelib=["rakelib"], trace_output=#<IO:<STDERR>>, trace=true, backtrace=true>]
["verbose", true]

-t の指定時は期待どおりRake.application.options.trace == true。ついでに verbosetrue を返す。

Rake -q を実行 (quiet モード)

$ rake options -q
["$trace", false]
["Rake.application.options.trace", nil]
["Rake.application.options", #<OpenStruct rakelib=["rakelib"], trace_output=#<IO:<STDERR>>>]
["verbose", false]

-q の指定時はRake.application.options.trace == nilRake.application.options.quite とかは無いもよう。 そして verbosefalse を返す。

Rake -s を実行 (silent モード)

$ rake options -s
["$trace", false]
["Rake.application.options.trace", nil]
["Rake.application.options", #<OpenStruct rakelib=["rakelib"], trace_output=#<IO:<STDERR>>, silent=true>]
["verbose", false]

-q-s の違いはあまり分かってないけど-s指定時は Rake.application.options.silent を確認すれば良いらしい。 あとは -q と同じ。

Rake -v を実行 (verbose モード)

$ rake options -v
["$trace", false]
["Rake.application.options.trace", nil]
["Rake.application.options", #<OpenStruct rakelib=["rakelib"], trace_output=#<IO:<STDERR>>>]
["verbose", true]

-v 指定時 verbosetrueを返す。

まとめ

$trace は常に false を返します。こいつは、もう使い物にならないです。

そしてRake.application.options.trace は、期待どおりに Rake -t で実行した時に true を返してくれました。それ以外の時は、nilfalse を返してくれるので、安心して

YARD::Rake::YardocTask.new do |t|
  t.files = SOURCE_FILES
  if Rake.application.options.trace
    t.options = ['--debug', '--verbose']
  end
end

とか、出来そうです。

恒久的に Rakefile に記述しておくのなら、これでいいんですけど「ちょっとデバッグするだけでRake.application.options.trace == true は長過ぎる。もっと簡便な方法を……」という局面もあるかと思います。

そういう場合は、Rake -t 実行時も verbosetrue を返していたので verbose == true だけの判定でも十分な感じはします。

ただ、注意点としては if verbose だけで判定すると

$ cat Rakefile
task :hoge do
  p verbose
  puts "vオプション頂きました!"  if verbose
end

$ rake hoge
#<Object:0x29675e8>
vオプション頂きました!

Rake -v をしてないのに verbose モードと判断しちゃいます。 もしかして、verbose モードがデフォルトなのかも知れませんが。