zomです。 もうね、ぐったりするほどハマったので、他にもハマった人がいると思い投稿します。 【2014/04/05追記】 ※4.0.40では元に戻っていたのでタイトルなどバージョンについて細かく追記しました。
ちょっとsinatraでWebAPIでも作ろうと思い、お遊びPCでApache×Passenger4.0.0RC4×Ruby2.0.0で環境作ってみようと思いました。 で、Ruby2.0.0をインストールしPassengerもインストールし(ここらへんは後日別エントリで投稿します!たぶん!きっと!) 開発ができるようにはなりました。
しかし、プログラムをなにか変更をするたびにサーバ再起動を要します。 これでは、Apache何百回再起動することになるねん、ということで rackアプリケーションのルートディレクトリにtmp/restart.txtというのをtouchで作成してやればいいとのことです。 まー、そこらへんはpassenger restart.txtとかでググれば山ほど情報が出てくるので詳しくは書きません。
で、いちいちtouchするのもメンドいということで用意されているのが「always_restart.txt」というのがあります。 これはそのファイルがありさえすれば、毎回キャッシュを見ないみたいな挙動をしてくれます。
がっっっっっっっっ
肝心のこいつが効いてくれません!!!!Passenger4.0.0RC4だと!!!!
さて、先に解決方法をば。 rackアプリケーションのルートディレクトリ直下にalways_restart.txtを置くだけ。 効かなかった人、Passenger4.0.0RC5でもかな?これで行けると思います。 やってみてください。
さて、なんでディレクトリが変わっているのか?
Passenger3.0.x系のソースから抜粋。
if (options.restartDir.empty()) { restartDir = appRoot + "/tmp"; } else if (options.restartDir[0] == '/') { restartDir = options.restartDir; } else { restartDir = appRoot + "/" + options.restartDir; } string alwaysRestartFile = restartDir + "/always_restart.txt"; string restartFile = restartDir + "/restart.txt";
Passenger4.0.0RCのソースから抜粋。
if (options.restartDir.empty()) { restartFile = options.appRoot + "/tmp/restart.txt"; alwaysRestartFile = options.appRoot + "/always_restart.txt"; } else { restartFile = options.restartDir + "/restart.txt"; alwaysRestartFile = options.restartDir + "/always_restart.txt"; }
というわけでですね、3系では、特定のディレクトリの下にalwaysもrestartも置きますよ、という実装から 4.0.0RCではディレクトリを指定しなかった場合はルートディレクトリ直下にalways、ルートディレクトリ/tmpの下にrestart、という謎実装に変わってるのが原因でした。 これバグなのかな?issueに上げていいかどうかの判断がつかないけど、ドキュメントでカバーできる範囲だからそうでもないのかなー、というのが自分の意見です。 もし英語に堪能な人がいたら作者の方に、意図とか訊いてみてください>< すでにどこかに書いてあるのかもだけど…。
これで三日ほど何もできなかった…
【2014/04/05追記】 passenger4.0.40で挙動が変わってたっぽいのでソースを見てみたらtmpの下に戻ってました。
if (options.restartDir.empty()) { restartFile = options.appRoot + "/tmp/restart.txt"; alwaysRestartFile = options.appRoot + "/tmp/always_restart.txt"; } else if (options.restartDir[0] == '/') { restartFile = options.restartDir + "/restart.txt"; alwaysRestartFile = options.restartDir + "/always_restart.txt"; } else { restartFile = options.appRoot + "/" + options.restartDir + "/restart.txt"; alwaysRestartFile = options.appRoot + "/" + options.restartDir + "/always_restart.txt"; }
4.0.0のRCがなくなったときもtmpの下じゃなくなってたはずなのに、結局元鞘ですかね?なんだったのか。