2013-07 << 2013-08 >> 2013-09

2013-08-31 (土)

会社に集まって何か書いたりする日.所謂ハッカソン.

ノートPC二台並べて,Scalaのビルドやテストを待ってる合間に,rubyとsinatraで何か作ったりする.コンパイル遅い.

*[scala] WindowsのPlay Frameworkのsbt出力をまともにする

会社のPCがWindowsなので.Macとかいうもあるらしいのですが,宗教上の理由で使うことができないのです.

VM上のLinuxとかで開発する人も多いと思いますが,Scalaコンパイラがとても重いので,VM上よりWindows上で実行して少しでもビルドを早くしたいです.

とりあえずplayをWindowsで動かしてみると困るのが,

  • 日本語が文字化けする
  • テスト結果に色がつかない

この2点です.

sbtを0.13にすれば色がつくし,sbtのjavaのオプションで-Dfile.encoding=SJISとかすれば,日本語も表示されるのだけど,playが内部的に使っているsbtは0.12なのと,sbtのエンコーディングを設定でどうにかする方法が見当たらない.

どうせ将来的のバージョンでは必要なくなるのだろうけど,一応メモっておく.

文字コードをどうにかする

みんな,色々な方法で解決していると思いますが,一長一短という感じ.

このために,build.scalaとかにいろいろ入れて汚したりはしたくない.

chcpでコマンドプロンプトの文字コード変えるのが真っ当っぽい解決方法ですが,フォントの設定っが面倒だったり,たまに表示がおかしくなるのと,ckwのような別のコンソールを使ってる場合など使えない場合があります.

結局,nkfで出力を変換することにしました.こういうとき,バッファリング無効にできるnkfがいまだに役に立つ.

色をつける

色については,sbtがjlineというライブラリを使っているようで,ターミナルの設定がWindowsTerminalになっていると,ANSIのエスケープシーケンスを消してしまう.

UnixTerminalにすると,とりあえず出力されるが,バッファリングがおかしくなるのか,エンターキーを押したあと,一瞬間があくのがつらい.

UnsupportedTerminalは何もしないと書かれているけど,エスケープシーケンスをそのまま出力してくれるようだし,変な動作もしないので,これが良さそう.

近頃のWindowsのコマンドプロンプトは,ANSIのエスケープシーケンスとか無視するので,wacを使って色を付ける.

build.bat

nkf32.exe と,wac.exe は適当にパスの通ったところにおいておく.

playのframework/build.batも以下のように書き換えて,

nkf32 -u -Lu -S -w | java -Djline.terminal=jline.UnsupportedTerminal ~省略~ -jar "%~dp0sbt\sbt-launch.jar" %* | nkf32 -u -W -s | wac

文字化けもしないし,色もちゃんとついた.