Edited at

ホーム以外でホームの Rake タスクを実行

ホームディレクトリーに Rakefile を置いて,いろいろな作業ができるようにしている,とする。

別のディレクトリーにいるときに,そのタスクを実行するにはどうするか,というのがこの記事のテーマ。


-f オプションで指定

rake コマンドには,Rake ファイルを指定する -f オプションがあるので,

rake -f ~/Rakefile foo

のようにすればいい。

でもちょっと打つのが面倒じゃない? もう少し簡略化できないの?

-f オプションにはディレクトリーを渡すことはできないが,ワイルドカードは使えるので,

rake -f ~/* foo

と書けばよいようだ。


おまけ


Windows の場合

Windows では ~ がホームディレクトリーを表してはくれないので,この手は使えない。残念。

これなんか,rake コマンド側で対処してくれたらいいのにねー。

もちろん Windows では ~ という名前のディレクトリーを作ることができてしまうので,原理的には曖昧性が生じるわけだけど,「-f オプションの ~ はホーム」ってルールにしちゃってもいいんじゃない?


Rake ファイルのファイル名

Rake ファイルのファイル名は


  • Rakefile

  • Rakefile.rb

のどっちでもいいし,大文字・小文字も気にしなくていい。


Rake タスク中のパスの扱い方

Rake ファイルの場所がカレントディレクトリーと一致しているとは限らない,ということは常に頭に入れておきたい。

-f を使わなくても不一致は起こりうる。

カレントディレクトリーに Rake ファイルが存在しない場合,ディレクトリー階層を上にたどって Rake ファイルを探すからだ。

となると,Rake ファイル中で,たとえば

require "./my_library"

みたいな記述をしてしまってはダメ,ということになる。

この . はカレントディレクトリーを表しているからね。

Rake ファイルと同じ場所にある my_library.rb を読み込ませたいなら

require_relative "my_library"

とすればいい。

また,ファイルの読み書きなどでも

IO.read("foo.txt")

みたいなことはやめて,__dir__ メソッドを使って Rake ファイルの置かれたディレクトリーのパスを取得し,そこからの相対パスでファイルを指定するようにしたい。