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
文字化けもしないし,色もちゃんとついた.