CygwinでPlay!2.0.1を使うための調整(非公式)
Play framework 2.0.1は、Cygwinでは完全には使えません。
本格的に使えるようにする方法を模索してみました。
Gitリポジトリを見ても、いまのところサポートされる様子はなさそうです。
Scala(少なくとも2.9.1時点)はCygwinにしっかり対応しています。一部、これを参考にしています。
この辺の知識は、他の製品のCygwinサポートにも応用できるかも知れません。
- ルートディレクトリ
- ルートディレクトリは、"dir=`cygpath --mixed $dir`"で再変換します。なお、mixedにすると、"D:/opt/play2.0.1/"のような文字列が取れます。
- 行末文字指定
- "-Djline.terminal=jline.UnixTerminal"を追加します。
- sbt.boot.propertiesのパス
- sbt.boot.propertiesは、URIらしいので、先頭に"file:///"をつけました。(でも何か違うような?)
- sttyの設定
- sttyの設定を保存し、"stty -icanon min 1 -echo"を設定します。("-icanon min 1"は特殊文字無効および最低読み込み数の設定、"-echo"は入力文字をエコーしない、詳しくは"stty --help"を参照)これにより、Ctrl+Dや、ヒストリの参照などが利用可能となります。設定は、終了時に復元します。
追記:"play stop"の際にうまく行かない場合は、killの箇所を修正して、CygwinのkillでWin32-interfaceを使うforceオプションをつける必要があるようです。
以下、修正箇所の抜粋です。
- ${PLAY_HOME}/play (修正版・抜粋)
#(stopの箇所) /bin/kill -f `cat RUNNING_PID` elif [ `uname -o` == "Cygwin" ]; then dir=`cygpath --mixed $dir` java -Djline.terminal=jline.UnixTerminal -Dsbt.ivy.home=$dir/repository \ -Dplay.home=$dir/framework \ -Dsbt.boot.properties=file:///$dir/framework/sbt/play.boot.properties \ -jar $dir/framework/sbt/sbt-launch.jar "$@"
- ${PLAY_HOME}/framework/build (修正版・抜粋)
if [ `uname -o` == "Cygwin" ]; then dir=`dirname $0` dir=`cygpath --mixed $dir` saved_stty=`stty -g 2>/dev/null` stty -icanon min 1 -echo java ${DEBUG_PARAM} -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M \ -Dfile.encoding=UTF8 -Dplay.version="${PLAY_VERSION}" \ -Dsbt.ivy.home=$dir/../repository -Dplay.home=$dir \ -Dsbt.boot.properties=file:///$dir/sbt/sbt.boot.properties \ -Djline.terminal=jline.UnixTerminal \ -jar $dir/sbt/sbt-launch.jar "$@" echo stty $saved_stty saved_stty="" else
追記(2012-06-30): play>consoleはエラーになってしまいます。
Failed to construct terminal; falling back to unsupported java.lang.IllegalArgumentException: Invalid terminal type: jline.UnixTerminal