rcmdnk's blog

トレースの魔術(紙ジャケット仕様)

Rakeコマンドを使って エラーが出た時、--traceオプションを使って 詳しく調べられるよ、と言うメッセージが出ますが ここで--traceを渡すのはrakeコマンドに対してになります。

ただ、実際にgenerateタスクとかでエラーが起こってるのは中で呼んでる Jekyllコマンドがエラーを出してることが大体の時なので それを詳しく調べたい、と言った時のためにTaskをアップデートしました。

Sponsored Links

Octopressのgenerateタスク

OctopressのRakefileの中でgenerateタスクは

Rakefile
1
2
3
4
5
6
7
desc "Generate jekyll site"
task :generate do
  raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
  puts "## Generating Site with Jekyll"
  system "compass compile --css-dir #{source_dir}/stylesheets"
  system "jekyll build"
end

こんな感じになっています。

このままだと単に

Liquid Exception: Unknown tag 'wring' in index.html

とだけ出て終わります。

コレ以外のところでも色々とチェックを入れるため (さらに途中で失敗した時にその先に行かないようにするために)、 こんなラッパーメソッドを作ります。

1
2
3
4
5
6
7
def ok_failed_raise(condition, print_ok = true)
  if (condition)
    puts "OK" if print_ok
  else
    raise "FAILD"
  end
end

これで

ok_failed_raise system("jekyll build #{trace}")

としておくと、失敗した時に

$ rake generate
...
            Source: source
       Destination: public
      Generating...
  Liquid Exception: Unknown tag 'wrong' in index.html
jekyll 2.5.3 | Error:  Unknown tag 'wrong'
rake aborted!
FAILD
Rakefile:876:in `ok_failed_raise'
Rakefile:99:in `block in <top (required)>'
Tasks: TOP => gen => generate
(See full trace by running task with --trace)

こんな感じのエラーメッセージが出ます。

ここで--trace(もしくは-t)を使え、と言ってくるので使ってみると

$ rake generate --trace
            Source: source
       Destination: ~/tmp/octopress/public
      Generating...
  Liquid Exception: Unknown tag 'wrong' in index.html
jekyll 2.5.3 | Error:  Unknown tag 'wrong'
rake aborted!
FAILD
Rakefile:877:in `ok_failed_raise'
...
Tasks: TOP => gen => generate

と、Rakeの部分だけでJekyllコマンド自体は当然ですがtraceなモードになりません。

Rakeへのtraceオプションを拾ってJekyllに渡す

ということでtraceなオプションを付けた時に中で拾って 実行するjekyllコマンドに渡すようにします。

Rakeのタスクの中でTraceを与えたかどうかを見るには

Rake.application.options.trace

trueかどうかで判断する事ができます。

Rakefile
1
2
3
4
5
6
7
8
desc "Generate jekyll site"
task :generate do
  raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
  trace = Rake.application.options.trace ? "--trace" : ""
  puts "## Generating Site with Jekyll"
  ok_failed_raise system("compass compile --css-dir #{source_dir}/stylesheets")
  ok_failed_raise system("jekyll build #{trace}")
end

こんな感じ。これでrake generate --traceすると中でも jekyll build --traceが実行されます。

実際やってみると

$ rake generate --trace
...
            Source: source
       Destination: public
      Generating...
  Liquid Exception: Unknown tag 'wrong' in index.html
/Library/Ruby/Gems/2.0.0/gems/liquid-2.6.2/lib/liquid/block.rb:62:in `unknown_tag': Unknown tag 'wrong' (Liquid::SyntaxError)
        from /Library/Ruby/Gems/2.0.0/gems/liquid-2.6.2/lib/liquid/block.rb:32:in `parse'
        ...
        from /usr/bin/jekyll:23:in `<main>'
rake aborted!
FAILD
Rakefile:876:in `ok_failed_raise'
Rakefile:99:in `block in <top (required)>'
...
/Library/Ruby/Gems/2.0.0/gems/rake-10.4.2/bin/rake:33:in `<top (required)>'
/usr/bin/rake:23:in `load'
/usr/bin/rake:23:in `<main>'
Tasks: TOP => gen => generate

こんな感じでJekyll(の中のLiquid)の部分のtraceも出来て エラーが何なのか、より詳しく知ることが出来ます。

ちなみにこの

Rake.application.options.trace

ですが、Rake 10.0より前では$traceと言う値で 取ってくる事が出来た様ですが、 10.0以降取り除かれて上のoptionsのみが使える様になっています1

Sponsored Links
Sponsored Links

« Octopressでサムネイルを作るプラグインを作った Octopressで'ダブルハイフン'をそのまま残す »