LoginSignup
13
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-20

この記事は 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

これで上手くいくはず。

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12