2009-01-01

Rake と環境設定がだいぶ分かってきた

年末からやってたドットファイル一本化の流れ。ダラダラっとメモ。

環境判別あれこれ

.emacs

実際には書き換えの際に .emacs.el という名前にしちゃったんだけど、それはともかく。

(when (fboundp 'XXX-mode)
  ())
(cond (window-system
  ())
(when (eq window-system 'mac)
  ())
(when (eq window-system 'w32)
  ())
(if (> emacs-major-version 21)
    (progn
      ()))

なんかこんなの使ってます。

.zshrc

uname くらいしか思いつかないけど、そんなもんなんでしょうか。

  • Linux
  • FreeBSD
  • Darwin

あとはコマンドの実行をそのまま評価したり。

Rake の定義

task 定義

  • file
  • dir
  • task

「何かの処理で何かのファイルを生成する」のでなければ task を使う。

メソッド定義

task の定義時に必要なメソッドは当然 task 定義より前に定義されていなければならないが、実行時に必要なメソッドは task 定義のあとに書いておくことができる。

def method_A
end

if ( method_A )
  task task_A do
    method_B
  end
end

def method_B
end

つまりこういうこと。

Rake の呼び出し

task 呼び出し

task の中から他の task を呼び出すことはたぶんできない。依存 task として定義することはできる。

ということは task は何かの戻り値をもとに処理を決定するように書くのではなく、何かの処理が完了している場合にこの処理が実行可能という形で組み立てていく必要がある。

メソッド呼び出し

task の中からメソッドの呼び出しは普通にできる。

ただし task も namespace も Ruby 的には Global というか main のメソッドであり、その中のブロックも main に属している。例えばメソッドを何らかの module や class の中に用意した場合、task のスコープと合わないので変数の受け渡し、定数の参照で食い違いが発生する。(恐らく Capistrano は set メソッドでこの問題を解決している。まだそこまで読み込んでないけど。)

ここ注意。

オプションを取らずにタスクを取る

基本的に Rakefile で扱えるのは task のみで、Ruby スクリプトへオプションを与えるという形は考えない方がよさげ。

仮に似ているけどちょっと違う task というものが増えそうなら task 定義そのものを動的に行えるようにすればよい。task はメソッドとは違うので、特に難しいことはない。例えば

[ ..  ].each { |e|
  desc "desc_#{e}"
  task "task_#{e}" do
    ..
  end
}

てな形。

デフォルトでタスク一覧を出力

Rake は default を定義しておかないと怒られるが、default でいきなり仕事が始まっちゃうのはちょっとなぁと思ったので、-T 相当の動きをしてくれるようにしてみた。

About

例によって個人のなんちゃらです