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先生で検索](https://www.google.co.jp/search?q=rake+yard)すると `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` を返してくれるので、安心して

```ruby
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 モードがデフォルトなのかも知れませんが。