2016年4月6日水曜日

Stackで開発

Stackは、Haskellのパッケージ管理システムです。

Stackの説明、導入方法はよい記事があります。私もそちらを参考にStackを使ってみたところ、快適に開発することができました。
実際にやってみて、便利なコマンドなども調べたので、まとめました。

Stack導入

こちらの記事が非常に参考になります。

Stackのテンプレートの作り方

早速テンプレートを作って開発を始めましょう。
シンプルなテンプレートもありますが、mysqlなど使用するものが決まっていれば、最初から全部入ったものを入れておく方がいいと思います。

stack templates
stack new <project_name> [template_name]
cd <project_name>

Hello, world

プロジェクトを作成したら、プロジェクトディレクトリ直下で、以下を実施しましょう。

# stackを初回実行する場合。結構時間がかかります
stack setup

# ビルド 
stack build --pedantic --haddock --test --exec "echo Yay, it succeeded"
# 実行
stack exec <project_name>-exe

ghci の注意点

とりあえず動きをみたいときにやってしまう、

ghci src.hs

ですが、stackベースのghciでは動かないことも。
その場合は、プロジェクト内で ghci しましょう。
プロジェクト.cabalで設定したライブラリが読み込まれます。

イテレーション

ファイル更新を検知して自動コンパイルももちろんできます。
このコマンドをバックグラウンドで実行しておきます。

stack build --haddock --test --exec "echo Yay, it succeeded" --file-watch
  • –pedantic オプションは、warning一つでもコンパイルできないので、開発中は停止しておいた方がいいです。

自作ライブラリを取り込む

Stackageにないライブラリを使いたい場合は、以下の設定をします。
自作のプロジェクトをライブラリとして使いたい場合などで使えます。

ローカルにあるライブラリ

stack.yaml の packages に設置したライブラリのパスを指定します。

packages:
- '.'
- '/path/to/package' 

Hackageにあるライブラリ

hackageの他のライブラリと同じです。
project.cabalのdependencyに追加します。

dependency:

(参考)

http://docs.haskellstack.org/en/stable/faq/

  • I need to use a different version of a package than what is provided by the LTS Haskell snapshot I’m using, what should I do?
    => LTSに乗ってないバージョンのパッケージを使う方法。
  • I need to use a package (or version of a package) that is not available on hackage, what should I do?
    => Hackageに乗ってないバージョン、パッケージを使う方法。

登録する

オープンソースプロジェクトならば、Hackage、Stackageに登録するのがオススメです。
githubで公開しておけば、だれでもダウンロードして使えますが、Hackage、Stackageにある方が断然使いやすいです。

Hackage

現在は、Webからアカウント登録/アップロードできます。

アカウント登録

以下のフォームから登録

http://hackage.haskell.org/users/register-request

アップロード

  • stack コマンドの場合
cd /path/to/project
stack upload .

Stackage

Hackageに登録したら、Stackageにも登録しましょう。
Stackageのコンセプトはコンパイルが通るライブラリということ。

GitHubのstackageリポジトリにプルリクをすると、TravisCIが走ります。
checkが通れば、mergeしてもらえます。

もし、errorになっても、Stackageのコントリビュータの方にアドバイスがもらえます。

その後は、Stackageのnightlyに!

  1. まずは、プロジェクト内でチェックコマンドを実行
cd /path/to/project
stack --resolver nightly exec stackage-curator check
stack --resolver nightly build
  1. 問題なければ、Stackageリポジトリをフォーク
    https://github.com/fpco/stackage
  2. パッケージ情報を追加してコミット、プルリク
    https://github.com/fpco/stackage/blob/master/build-constraints.yaml
"My Name myemail@example.com @mygithubuser":
    - package1
    - package2
    - package3
  • コミットメッセージ “add package name” にしてほしいということです。

(参考)
https://github.com/fpco/stackage/blob/master/MAINTAINERS.md

0 件のコメント:

コメントを投稿