先生!.devじゃないドメインでPowを使いたいんです!!オフラインでも使いたいんです!!!

うぇっぶえんじにあーならばどこでもコード書きますよね?地下深くをすすむ会社帰りの地下鉄のなか、あるいは昼休みに公園の芝生でくつろぎながらなど。そんなとき、生命線であるインターネットから断絶されてしまうこともあります。すると、残酷にもPowすらも別れを告げてくるのです><

通常ならばPowによって.devドメインでアクセスできるRackアプリも、Pow本体もローカルで動いています。しかしながら、インターネットが断たれてしまうと、正確にはDNSサーバにアクセスできない状態になるとPowは使えなくなってしまいます。/etc/resolv.conf がなくなり、/etc/resolver/dev を参照しなくなってしまうのです*1。そうなってもRackupなりなんなりしてしまえば、ポートを指定してlocalhostにアクセスすれば開発を続けることはできます。できますが、PowのENVが使えなくなりますし、その時だけ別の方法でサーバを起動するのもなんとなく気がすすみませんね。ならば、なんとしても、どんな状況でもPowを使いましょう。ついでに .dev 以外のドメインでPowを使ってみましょう。

任意のドメインで使う

Powで .dev 以外のドメインを使うための設定がPOW_EXT_DOMAINSです。任意のドメインをPOW_EXT_DOMAINSに指定してやることによりPowへ向けることができるのです。ホームディレクトリの .powconfig へ記述します。なければ作りましょう。

% cat ~/.powconfig
export POW_EXT_DOMAINS=offline

f:id:marutanm:20110608220355p:image:right例として、offline としてみました。これだけではofflineドメインは有効になりませんので、Powを再起動、つまるところ再インストールしましょう。

# Powの再インストール
% powder install
# 設定されたか確認
% curl -H host:pow localhost/config.json

Pow使うならPowder入れておくだァーッ! - Meltdown Countdown で紹介したPowderをつかっています。
Powの設定をみるにはリクエストヘッダにhost:powをつけてlocalhost/config.jsonにアクセスをします。レスポンスには"extDomains":["offline"]が含まれていることでしょう。

DNSなんてまっぴらだ

これだけでは .offline ドメインがDNSでひけない→アクセスできないままです。そこで良い子の見方、hostsを編集します。

% sudo vim /etc/hosts
# 127.0.0.1 appname.offline を追記
% grep offline /etc/hosts
127.0.0.1 sinatra-pow-powder.offline

f:id:marutanm:20110608221424p:image:right
するとどうでしょう .offline ドメインでもPowを利用してRackアプリにアクセスできています。さらにこれはインターネットから隔絶されても有効なのです!!

まとめ

  • POW_EXT_DOMAINS を設定すると、Powで任意のドメインを使える*2
  • DNSがひけない状況でPowを使うには/etc/hostsを編集する
    • 手作業でやってるのがスマートではないですよね。なにか良い手がないものか・・・
その他、参考

MacOSX限定・Rails3での開発で使える超手間無しサーバ「Pow」 - Back yard : yuya_lush’s report
Powの動作の流れ、なるほどそうなっているのか、と。

*1:そのあたりの挙動はresolverのmanを参照くださいませ http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man5/resolver.5.html

*2:単に任意のドメインを使うならPOW_DOMAINSを使うという手もあるけど、DNSより優先される点に注意。くわしくは[http://pow.cx/manual.html#section_3.1:title=マニュアル]参照