ホームディレクトリーに 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 ファイルの置かれたディレクトリーのパスを取得し,そこからの相対パスでファイルを指定するようにしたい。