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 のほうが幸せになれるでしょう。
動かなかったら連絡ください。