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 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。ついでに verbose は true を返す。
$ 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 == nil。
Rake.application.options.quite とかは無いもよう。
そして verbose は false を返す。
$ 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 options -v
["$trace", false]
["Rake.application.options.trace", nil]
["Rake.application.options", #<OpenStruct rakelib=["rakelib"], trace_output=#<IO:<STDERR>>>]
["verbose", true]
-v 指定時 verbose は trueを返す。
$trace は常に false を返します。こいつは、もう使い物にならないです。
そしてRake.application.options.trace は、期待どおりに Rake -t で実行した時に true を返してくれました。それ以外の時は、nil か false を返してくれるので、安心して
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 実行時も verbose は true を返していたので 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 モードがデフォルトなのかも知れませんが。