Edited at
HerokuDay 20

Haskell + Yesodで作ったアプリをHerokuにデプロイする

More than 3 years have passed since last update.

この記事は Heroku Advent Calendar 2015 の 20 日目の記事です。

去年のHerokuAdventCalendar2014のネタは、実はHerokuにYesodを突っ込むというものだった。

だけど

【Mac OS X 10.10】Haskell + Yesod + Heroku で webアプリ 1/3と、ネタが被ってしまったのと、後、手元で試してみてもエラーがでてどうにもならなかった(後述)ので、放置しっぱなしだったが、今年の割と早い時期に解決したので1年越しに投下する。


haskell本体の入手と設定

http://qiita.com/tacke_jp/items/83120e4b3cb4f866211f

を参考(ただしバージョンは読み替え)

ubuntu$ sudo su -

cd /tmp
mkdir haskell
cd haskell/
wget https://downloads.haskell.org/~platform/7.10.3/haskell-platform-7.10.3-unknown-posix-x86_64.tar.gz
tar -xvzf haskell-platform-7.10.3-unknown-posix-x86_64.tar.gz
./install-haskell-platform.sh
/usr/local/haskell/ghc-7.10.3-x86_64/bin/activate-hs

//ここでダウンロードしたパッケージは各々削除

次にcabalの設定をする。

cabal update

$ cabal install cabal-install
$ cabal update
$ cabal install yesod-bin alex happy

プロジェクトを作成



yesod init

プロジェクト名を決めるので

simple-yesod

と打つ。

プロジェクト構成を聞かれるけど、ここでは「simple」を選択。

cd simple-yesod

//パッケージをインストール
cabal install -j --enable-tests --max-backjumps=-1 --reorder-goals

起動する。

yesod devel

凄まじく時間が掛かる。。。

ここまでがローカルの作業。


Herokuにデプロイ

ここからHerokuにデプロイするまでの作業。

とりあえずプロジェクトを作る。ビルドバックも合わせて設定する。

git init

heroku create simple-yesod-etmnk --buildpack https://github.com/begriffs/heroku-buildpack-ghc.git


Procfileを作る

echo "web: ./dist/build/yesod-simple/yesod-simple " > Procfile


keterの編集

Heroku用のビルドセッティングをやっておく。config/keter.ymlを編集する。

user-edited: false -> trueに変更

hosts: - simple-yesod-etmnk.herokuapp.com <- 自分の環境に合わせて変更(複数箇所全部)

直したら、yesod ketelを叩く。

すると、dist/build/hogehoge/hogehogeにビルドバイナリが出来る。


heroku-anvil

Yesodのビルドはかなり時間がかかるので、heroku-anvilというツールを使う。

heroku plugins:install https://github.com/ddollar/heroku-anvil

これはビルドを別サーバー上で行ってビルドバイナリをHerokuにデプロイするというツール。

設定したらビルドする。

heroku build -r -b https://github.com/begriffs/heroku-buildpack-ghc.git

うまく行けばいつものごとく、「git push heroku master」で。


別の方法でHerokuにデプロイする

上記の最後でエラーが有った場合は、以下の方法を試す。

(ちなみに去年は上記の最後の手順で以下のエラーが出て先に進めなかったので断念した)

cabal: You need to re-run the 'configure' command. The version of Cabal being

used has changed (was Cabal-1.20.0.2, now Cabal-1.20.0.0).
ERROR: Build failed, exited 1

https://github.com/yesodweb/yesod/wiki/Deploying-Yesod-Apps-to-Heroku

この解決法だと要はNode.jsのアプリと認識させてデプロイするというものらしい。

手順に従ってpackage.jsonを作る

echo '{ "name": "simple-yesod", "version": "0.0.1", "dependencies": {} }' >> package.json

以下の手順でデプロイに不要なcabalを削除してからデプロイ

git checkout -b deploy

cabal clean && cabal configure -fproduction && cabal build
git add -f dist/build/appname/appname
git commit -m "binary"
git push -f heroku deploy:master
git checkout master
git branch -D deploy

これで上手くいくはず。