この記事は 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
これで上手くいくはず。