argius note

プログラミング関連

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