RakeとCWD

/tmp/rake-exampleに以下の内容のRakefileを作る。

task :default do
  p pwd: Dir.pwd, rakefile: __FILE__
end

/tmp/rake-examplerakeコマンドを実行する。

$ rake
{:pwd=>"/tmp/rake-example", :rakefile=>"/tmp/rake-example/Rakefile"}

デフォルトタスクdefaultが実行され、カレントディレクトリと読み込まれたRakefileのパスが表示される。

次に、適当にディレクトリを作って、そこでrakeコマンドを実行する。

$ mkdir -p foo/bar
$ cd foo/bar
$ rake
(in /tmp/rake-example)
{:pwd=>"/tmp/rake-example", :rakefile=>"/tmp/rake-example/Rakefile"}

ディレクトリfoo/barにはRakefileがないため、親ディレクトリをたどってRakefileを探索する。見付かったRakefile(ここでは/tmp/rake-example/Rakefile)を読み込んでタスクを実行する。

その際にカレントディレクトリをRakefileのある場所に変更している。このことはrakeコマンドからの出力に(in /tmp/rake-example)が増えたことでも確認できる。

次に、グローバルRakefileを読み込むよう指示してみる。ただしデフォルトのグローバルRakefileの探索場所である~/.rakeはない。

$ pwd
/tmp/rake-example/foo/bar
$ rake -g
(in /tmp/rake-example)
{:pwd=>"/tmp/rake-example", :rakefile=>"/tmp/rake-example/Rakefile"}

-gオプションを付けないときと変わりがない。そこで~/.rake/baz.rake/tmp/rake-example/Rakefileと同じ内容で作る。

$ mkdir ~/.rake
$ cp /tmp/rake-example/Rakefile ~/.rake/baz.rake

再びrake -gを実行する。

$ pwd
/tmp/rake-example/foo/bar
$ rake -g
(in /tmp/rake-example/foo/bar)
{:pwd=>"/tmp/rake-example/foo/bar", :rakefile=>"/Users/akira/.rake/baz.rake"}

親ディレクトリにあるRakefileではなく、グローバルRakefileがある~/.rake以下のRakefile(ここではbaz.rake)が読み込まれている。

このとき、カレントディレクトリは変更されず、グローバルRakefileがある~/.rakeにはならない。