4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-04-23

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。ついでに 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 == nil
Rake.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 モードがデフォルトなのかも知れませんが。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?