[elixir][heroku][dynamo] herokuでrun dynamo!してみるテスト
dynamoというweb frameworkがある。sinatraに似ているということだが、sinatraに詳しくないのですいません。
get "/" do render "hoge.html", [a: "test", b: "teset2"] end
とかするとテンプレートhoge.html.eexに変数 aに "test", bに"test2"が代入されてレンダリングされるという感じの物。
ここでは、テンプレートエンジンとして markdown処理系の一つである erlmarkdown を採用してdynamoに組み込んで、herokuへデプロイしてみようというテストをしてみた。
作成するアプリケーションの名前は tinymd とした。ベタだねー。
buildpack for elixir
herokuでelixirを使うためにはbuildpackが必要で、
https://github.com/goshakkk/heroku-buildpack-elixir
を使う。コレ自体はダウンロードする必要も無く、自分のアプリケーションへの組み込みは以下のコマンドで行う。
$ heroku config:add BUILDPACK_URL="https://github.com/goshakkk/heroku-buildpack-elixir.git" -a tinymd
mix.lockとmix.exsのメンテナンス
dynamoのmix.lockをよく見て、依存ライブラリのリビジョンをそろえておく事が必要。通常はmix.lockに維持されるが、ひょんな事からわからなくなったときにはまる。
erlmarkdownの追加
mix.exsにerlmarkdownを追加する。
defp deps do [ { :ranch, %r(.*), github: "extend/ranch", ref: "c3133bfbc324fbb9ac26ab689c\ d41dc362ad7c05" }, { :cowboy, %r(.*), github: "extend/cowboy", ref: "a3049f7100bb9f3cbaef1db6\ bf6cdeb750d9e298" }, { :dynamo, %r(.*), github: "elixir-lang/dynamo" }, { :markdown, %r(.*), github: "k1complete/erlmarkdown", compile: "sh -c 'mk\ dir -p ebin; erlc -o ebin src/markdown.erl ; cp src/markdown.app.src ebin/markdo\ wn.app' ", branch: "unicode_option" }, { :mix_task_heroku, %r(.*), github: "k1complete/mix_task_heroku" } ] end
template engineの実装
compileとrenderを実装すればよく、compileは文字列をhtmlにした結果を返せば良いので、そのまま markdown:conv_utf8()を呼び出してバイナリにすればよい。renderもほぼお決まりのコードなのでそのままでよい。
mix_task_herokuの追加
dynamoに付属しているmix serverタスクは環境によってPORTを変更することができるが、herokuは事前にどのポートで待っているかわからないため、そのままでは使えない。従って、環境変数PORTを使って受け待ちするようなmix serverを作製した。これをtinymdのmix.exsのdepsに追加してビルドすると、mix heroku -p $PORTが使えるようになるため、Procfileに以下のように書いておく事でデプロイできるようになる。
web: MIX_ENV=prod mix heroku -p=$PORT
もちろんheroku関係なくこのコマンドでアプリの起動は可能。
git push heroku
ローカル環境でうまく動くようになったら、
git push heroku
でデプロイ。
heroku logs
なにかあったらheroku logsでみてみる。
heroku run mix deps.clean
こまったらmix deps.cleanするのものよい。
herokuでなんどもpushするとビルドに失敗することがある。そんなときは気を取り直して翌日にpushすると治ったりするから謎だ。
https://github.com/k1complete/tinymd
ブツはここにある感じで、cloneしてweb/template/配下にコンテンツを*.mdで記述してherokuにpushするという超手抜きのcmsとなっているw