tomykaira makes love with codes

http://d.hatena.ne.jp/ToMmY/

All snippets without notes are distributed under MIT License.
特記なき場合、コードスニペットは MIT License です。

heroku で dart をうごかした

dart で webapp を作った、が heroku で動かない で heroku で動かねーと文句をいっていたが、原因は dart sdk が 32 bit VM しか提供していないことだった。
そこで 64 bit binary を自分で作成して、それで動作させた。

チェック編

まず動作するかだけチェックしておく。
dart は source tarball がないようなので、ローカルで gclient を使用してダウンロードし、tgz 圧縮する。
これを heroku から見えるところに上げておく(ex. dropbox の public folder)。

> heroku run bash   # heroku 上の端末に接続。以降は heroku 上での操作
curl http://example.com/dart-src.tar.gz > dart.tar.gz
tar -zxvf dart.tar.gz
cd dart/runtime
../tools/build.py -m release --arch=x64

これでバイナリが out/Release_x64/dart にできるので、動作確認してみると動く。
自分でビルドすれば行けることがわかった。

バイナリビルド編

本当は vulcan というものをつかう。
しかし、これを使用するとメモリリミットを悠然とオーバーランしたり、
30 sec で勝手にタイムアウトしたりと、どうかんがえてもビルドには向かない挙動をする。
また、node が謎のクラッシュを遂げる場合もある。
(エラーが出るときは heroku logs --app vulcan-dart みたいにして確認する。)
抑制する方法があるのかもしれないが、わからないので上とおなじように heroku につないでビルドした。

注意: heroku run で作成したセッションの内容は、切断されるとすべて消えます(ファイル含む)。
安定した環境で作業しましょう。

上と同様に、次のようなかんじ。

curl http://example.com/dart-src.tar.gz > dart.tar.gz
tar -zxvf dart.tar.gz
cd dart/runtime
../tools/build.py -m release --arch=x64
find out -name "*.o" | xargs rm
tar czvf dart_x64.tgz out/Release_x64

必要なのは out/Release_x64/dart だけだが、せっかくなので全部ダウンロードしておく。
このファイルをダウンロードする手段がないので、screenを使ってファイルを転送する。 - こせきの技術日記 をつかって転送

ローカルで、以下のようにしてデコード。md5sum することを推奨。

base64 -d -i < screenlog.0 > mydart.tgz

バイナリ使用編

heroku-buildpack を作成。

tomykaira/heroku-buildpack-dart

dart の buildpack はあったのだが、ia32 版を使用していて動作しなかったので、これを fork して自分のバイナリを使用するように変更した。
$BUILD_DIR にあたらしく bin を設置したりすればいいのだが、これの容量が大きくなりすぎるとエラーも出さずにファイルを消されることがあるので、最低限のファイルを配置するようにきをつける。
今回の場合は上で作成した out/Release_x64/* をすべて bin にいれておいたら、自分のアプリケーションのファイルが消えてしまった。
dart の場合は dart ファイルのみが必要なようなので、あたらしくそれのみの tgz を作成して利用した。
新しい buildpack は pull-req しておいた。

動いた

昨日のやつをデプロイした。
http://colorful.herokuapp.com

このように、カスタムビルドとか buildpack はハマりどころが多いので、VPS や rackhub のほうが幸せになれるでしょう。
動かなかったら連絡ください。