gettext/utils があると rake doc:app が失敗する

気づいたら rake doc:app が失敗するようになっていた。

$ rake doc:app
rm -r doc/app
rake aborted!
uninitialized constant AlreadyDefinedToken

(See full trace by running task with --trace)

調べてみると lib/tasks/gettext.rake に gettext 用のタスクを置いたあたりから失敗するようになってる。
gettext.rake の中身は ruby-gettext-howto-ror#Rakefile にならってこんな感じ。

require 'gettext/utils'

namespace :gettext do
  desc "Update pot/po files."
  task :updatepo do
    files = Dir.glob("{app,config,components,lib}/**/*.{rb,rhtml,rxml,rjs}").sort
    GetText.update_pofiles("foobar", files, "foobar 1.0.0")
  end

  desc "Create mo-files"
  task :makemo do
    GetText.create_mofiles(true, "po", "locale")
  end
end

task :updatepo => "gettext:updatepo"
task :makemo => "gettext:makemo"

失敗する最小構成を作ってみると以下のように。

$ rails -q rails-gettext
$ cd rails-gettext/
$ echo "require 'gettext/utils'" >lib/tasks/gettext.rake
$ rake doc:app
rm -r doc/app
rake aborted!
uninitialized constant AlreadyDefinedToken

(See full trace by running task with --trace)

どうも require 'gettext/utils' と rdoc 系のタスクは共存できないようです…。
しかたないので gettext.rake を次のようにして必要のあるときだけ require 'gettext/utils' するように変更。

namespace :gettext do
  desc "Update pot/po files."
  task :updatepo do
    require 'gettext/utils'
    files = Dir.glob("{app,config,components,lib}/**/*.{rb,rhtml,rxml,rjs}").sort
    GetText.update_pofiles("foobar", files, "foobar 1.0.0")
  end

  desc "Create mo-files"
  task :makemo do
    require 'gettext/utils'
    GetText.create_mofiles(true, "po", "locale")
  end
end

task :updatepo => "gettext:updatepo"
task :makemo => "gettext:makemo"

これなら動くようです。

$ rake doc:app
rm -r doc/app

                     README_FOR_APP:
                     application.rb: c
              application_helper.rb: m
Generating HTML...

Files:   3
Classes: 1
Modules: 1
Methods: 0
Elapsed: 0.145s