iLog

About

Stack の小ネタ

2018.12.06 Haskell

はじめに

こんにちは、ishiy(@ishiy1993)です。

この記事は CAMPHOR- Advent Calendar 2018 6日目の記事です。

今回は、Haskell のビルドツールである Stack に関係する小ネタを2つ紹介します。

  1. stack new でカスタムテンプレートを使用する方法
  2. ローカルにしかないライブラリを stack runghc などで使用する方法

私の現在の環境は次の通りです。

カスタムテンプレートを使用する方法

stack で新しいプロジェクトをはじめるとき stack new を実行しますが、このときテンプレートを指定することができます。 ここでテンプレートとは、 stack new によって生成されるディレクトリの構造とファイルの内容を記述したものです。

テンプレートを指定しない場合は、new-template が使用されます。 他のテンプレートを使用したい場合は、stack-templates にあるテンプレート名を指定しましょう。

$ stack new sample
$ stack new sample simple-hpack 

現在のstackでは、自分でテンプレートを作成し、使用することができます。 やることは、

  1. hsfiles を作成する
  2. そのパスを指定し、 stack new する

だけです。 hsfiles は、作成されるファイル名とその内容を記述したものです。 このファイルでは mustache が使用されており、 ~/.stack/config.yaml に定義されたパラメータ値を使ってプレースホルダーを埋めてくれます。 stack-templates にあるものをベースに好きなように編集してみましょう。 ここでは、作成したもののパスは ~/work/my-template.hsfiles であるとします。 次のコマンドでこのテンプレートを使用することができます。

$ stack new sample ~/work/my-templates

最後に、GitHub 上で公開されているテンプレートを使用する方法を紹介します。 例として私が先日作成したテンプレートを使ってみましょう。

$ stack new sample ishiy1993/app

このコマンドは、GitHub の ishiy1993 というユーザーの stack-templates リポジトリにある app.hsfiles を使用することを意味します。 もし自分で作成したテンプレートを公開する場合は、リポジトリ名を stack-templates にすることを忘れないようにしましょう。

(補足: stack new は直接URLを指定することもできるため、リポジトリ名が stack-templates でなくとも使うことはできます。)

ローカルのライブラリを使用する方法

次に、ローカルにしかないライブラリを stack runghc で使用する方法を紹介します。 stack runghc では、Hackage に公開されているライブラリを手軽に使用することができます。 さらに少し設定を行うことでローカルにしかない(= Hackage で公開していない)ライブラリを使うこともできます。

やることは、 ~/.stack/global-project/stack.yamlextra-deps に使いたいライブラリへのパスを追加するだけです。 例えば、 /home/someone/myutil というライブラリを使用したい場合を考えます。 (ここで /home/someone はユーザーのホームディレクトリを意味します。) まず ~/.stack/global-project/stack.yaml に次のような記述を追加します。

extra-deps:
  - /home/someone/myutil

そして

$ stack runghc --package myutil sample.hs

とすることで sample.hs において myutil が使用できるはずです。

(補足: 一般に stack でスクリプトを実行するときは stack script の使用が推奨されています。しかし、このコマンドは、resolver に基づいて依存関係を解決するため Hackage に公開されていないライブラリを使用するのはできないと思います。stack script でもローカルにしかないライブラリを使う方法をご存知の方はぜひ教えていただきたいです。)

まとめ

  1. stack new でカスタムテンプレートを使用する方法
  2. ローカルにしかないライブラリをstack runghc などで使用する方法

について紹介しました。 皆さまの快適な Haskell ライフの役に立てば幸いです。

参考ページ:

間違いなどありましたら、@ishiy1993に連絡していただけると助かります。

CAMPHOR- Advent Calendar 2018 の明日の担当は shiba6v です。お楽しみに。

ではでは。