euphonictechnologies’s diary

Haskell超初心者の日記です。OCamlが好きです。

follow us in feedly

Haskell - SnapフレームワークをHeroku上にデプロイして遊ぶ

OpenShiftはHaskellに優しかったはずなのですが

blog.euphonictech.com

この記事の通りカートリッジってのがあってそれを読み込んであげると例えばYesodならYesodの、SnapならSnapのプロジェクトひな形を一式全部作ってくれてgitリポジトリを持ってくるだけですぐに開発に入れました。便利ですね。

ところが!

f:id:euphonictechnologies:20150718123717p:plain

エラー!!!!!なんでできへんねん!!!!!!殺しますよ!!!!!!!

Herokuに逃げる

というわけでOpenShiftには愛想を尽かしました。Herokuならきっと大丈夫。 Haskell WikiのWeb/Cloud - HaskellWikiにある

github.com

に従って最初のSnapアプリをデプロイしてみます。

まずは普通にSnapをインストールしてローカルで走らせてみる

というわけで、サブディレクトリを掘ってcabal sandboxを作ってsnapをインストールします。

$ mkdir firstsnap
$ cd firstsnap/
$ ls
$ cabal sandbox init
Writing a default package environment file to
.../firstsnap/cabal.sandbox.config
Creating a new sandbox at
.../firstsnap/.cabal-sandbox
$ cabal install snap
Resolving dependencies...
Configuring HUnit-1.2.5.2...
Building HUnit-1.2.5.2...
Preprocessing library HUnit-1.2.5.2...
...
Installed snap-0.14.0.5

いつもどおりです。snapを実行してsnapのひな形を作ってもらいます。実行ファイル自体はsandbox内のbinフォルダにあります。

$ cabal exec snap init barebones

これだけでOK。早速Webサーバを起動してみましょう。

$ cabal run -- -p 8080

http://localhost:8080にアクセスしてみましょう。

f:id:euphonictechnologies:20150718124715p:plain

いいね!

Herokuにデプロイする

ローカルにgitリポジトリを作ってコミットしましょう。

$ git init .
$ vi .gitignore

で、.gitignoreを

$ cat .gitignore
dist
.cabal-sandbox
log
cabal.sandbox.config

みたいにしておきましょう。で、

$ git add *
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   .ghci
    new file:   .gitignore
    new file:   Procfile
    new file:   firstsnap.cabal
    new file:   src/Main.hs
$ git commit -m 'Initial commit'

これでコミットできました。 アプリケーションをherokuコマンドを使ってheroku上に作ります。名前はfirstsnapとしてますが、自由に変えられます。

$ heroku create firstsnap --stack=cedar-14 --buildpack https://github.com/begriffs/heroku-buildpack-ghc.git
Creating firstsnap... done, stack is cedar-14
Buildpack set. Next release on firstsnap will use https://github.com/begriffs/heroku-buildpack-ghc.git.
https://firstsnap.herokuapp.com/ | https://git.heroku.com/firstsnap.git
Git remote heroku added

最終的にpushしてherokuにビルドさせます。

$ git push heroku master
Counting objects: 8, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (8/8), 1.26 KiB | 0 bytes/s, done.
Total 8 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
...
remote: Verifying deploy.... done.
To https://git.heroku.com/firstsnap.git
 * [new branch]      master -> master

で、完了です。herokuのページからOpen Appして表示させてみましょう。

f:id:euphonictechnologies:20150719022618p:plain

をクリックすると,

f:id:euphonictechnologies:20150719020736p:plain

ページが表示されました!

最後にIntelliJに取り込む

普通に作ったディレクトリをIntelliJ上で開くとIntelliJ上で作業が続行できます。 ここから単純にpushするだけでもビルドできます。

f:id:euphonictechnologies:20150719021854p:plain

pushには時間がかかります。アプリケーションのActivityページから進捗を確認できます。

UltimateのIntelliJなら組み込みのCloudサポートを使って進捗をIntelliJ上から確認できます。

Command+Shift+Aからクイックアクセスを出してedit configと打つとEdit configurations...にアクセスできます。

f:id:euphonictechnologies:20150719021957p:plain

ここでクラウドデプロイをRunに割り当てることができます。

f:id:euphonictechnologies:20150718131635p:plain

こんな感じです。すると

f:id:euphonictechnologies:20150718131748p:plain

ボタンを押すと、

f:id:euphonictechnologies:20150719022212p:plain

こんな感じで下のペインで進捗が確認できます。

まとめ

当然これだけではOpenShiftにデプロイしたものと違いがないので、これをさらにsnapっぽく拡張していきます。