Rackアプリ開発するならPowはもう常識だよね〜

Pow自体については、Rails Hub情報局: Node.js+CoffeeScriptで書かれた「Pow」がカッコ良すぎる件 を参照してもらうのがよろしいかと。要点のみ引用させてもらうと、

Powの売りは、「Zero-configuration」(設定要らず)ということで、複数のRails/Sinatraアプリをローカルで動かして開発するようなときに、仮想的なドメイン名を手軽に割り当ててアクセスできるようにしてくれる、というものです。

とのこと。複数のRackアプリを開発してるとこういうものがあると確かに便利ですよね。いちいちポート指定して起動したり/etc/hosts書き換えたりしなくてもいいわけなので。

インストール

公式サイト を参照するとインストールがなんと簡単なこと。

$ curl get.pow.cx | sh

これだけで入るとな。そのインストールシェルの中身をみてみると

      POW_ROOT="$HOME/Library/Application Support/Pow"

と、なんとなく微妙なところに入っちゃう気がしないでもないけど、気になるなら上記部分だけ書き換えてもいいし。

動作準備

上記インストールシェルを走らせると、$POW_ROOT/Hosts へのシンボリックリンクである.powがホームディレクトリに作成される。この中にRackアプリへのシンボリックリンクをはればよい。

$ cd ~/.pow
$ ln -s ~/Projects/myapp

動いてる?ほんとにこれだけで動いた?

http://myapp.dev にブラウザからアクセス。myappはシンボリックリンクをはったディレクトリ名。
上手く動作してくれればこれで完了。はっぴーでゔぇろっぴんぐ!
しかし私の環境ではこれだけでは動かなかったので、

$ curl get.pow.cx/uninstall.sh | sh

でアンインストールして(しかも.powが残ったままだったりきれいさっぱり消えてはくれない)またインストールして、色々ためして今日に至ります。その色々試したハマりポイント解消メモが以下。"Pow 動かない"とかでググった人の助けになればいいな。

動かすまで

はい、Issue #31: How to install Pow from scratch · 37signals/pow · GitHub を参考にしました。が、必ずしも必要ではない手順もあるようなので、そこはスルーしながら。

Node.js

nodeを入れましょう。たしかに私の環境には入ってませんでした。Node.jsの管理はnvmで – SummerWind という良エントリを参考にnvm(zshではうまく動かない)を入れ、nodeを入れる。
V8、redis入れましょうとも書いてるけど、それはPowに含まれてて自動的に入るらしい。
npmはひとまずスルー。nodeいじって色々したくなったら入れる。
defunkt/resque · GitHub を入れるとも書いてるけど何それ?ひとまずスルーしました。

daemon

pow動作時には cx.pow.powd というdaemonがいる必要あり。このpowd名前はあうでぃみたいでかわいいもののなかなかのくせ者。インストールシェルを叩くと起動してくれるはずが起動せず。直接launchctl unload/loadを叩いてもエラー。結果daemon起動せずpow動作せずということがあった。
Issue #62: launchctl "socket is not connected" error · 37signals/pow · GitHub によると、対応策は「リブートせよ」とのこと。はい、リブートしたら何事もなかったかのごとくcx.pow.powdいました。

% launchctl list G pow
132	-	cx.pow.powd

ちなみにpow関係のdaemonはもう1匹、cx.pow.firewall というものもいます。こっちのloadは特に問題となりませんでした。それに上記grepで出てこなかったように、いなくてもPowは動作するみたい。手動でloadする場合はインストールシェルにあるように、以下。

$ sudo launchctl load /Library/LaunchDaemons/cx.pow.firewall.plist 2>/dev/null
rvm

たぶん使ってますよね。上記githubの手順だとpow自体を書き換えているみたいですが、その必要はありません。試したいRackアプリのディレクトリに.rvmrcファイルを置いて

rvm 1.9.2

のように書いておけばオーケイ。37signals/pow · GitHubのReadMeにも書いてますが。

今度こそ動くか?動け、動け、動いてよ!

私の環境では上記ハマりポイントを乗り越えて動くようになりました。アプリの再起動が

$ touch tmp/restart.txt

とか、理解しかねている部分もあるのですが便利に使えそうです。
launchctlなんて普段自分で叩くことがないのでloadできずにどうしたものかと途方にくれましたが、なんとかなるもんですね。困ったときはリブート、いつの時代もこれ大切です。