Rake における $trace の 代替手段
Rake 10.0.0 から $trace
は使えなくなった様子。
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
。ついでに verbose
は true
を返す。
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 == nil
。
Rake.application.options.quite
とかは無いもよう。
そして verbose
は false
を返す。
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
指定時 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 モードがデフォルトなのかも知れませんが。