You don't have javascript enabled. Good luck! :(
記事公開日: 2019/09/14

パッケージと依存関係

パッケージ・モジュール・バージョン・関数等の関係について簡単に確認し、その後ライブラリのビルドを直していきます。

Hackage, パッケージ, バージョン, モジュール, 関数の関係について

用語 対象
モジュール 関数やデータコンストラクタなどの集まり
パッケージ (バージョン付き) モジュールの集まり
パッケージ パッケージ (バージョン付き) の集まり
パッケージアーカイブ パッケージの集まり

具体例

用語 具体例 対象の具体例
モジュール Prelude map, id, filter, length, on, …
パッケージ (バージョン付き) base-4.12.0.0 Prelude, Control.Monad, Data.Function, …
パッケージ base base-4.11.0.0, base-4.11.1.0, base-4.12.0.0, …
パッケージアーカイブ Hackage, Stackage base, array, vector, …

依存関係の追加

base パッケージに含まれていないモジュールを import して使いたいというのは実際の開発においても頻繁に起こります。

今回の場合は先ほどのエラーメッセージから array-0.5.3.0 パッケージをインストールすれば良いことがわかっています。そのため、package.yaml ファイルの dependenciesarray を追記します。必要であればバージョンを明示的に指定しますが、今回は省略します。

dependencies:
- base >= 4.7 && < 5
- array

そしてプロジェクトをビルドするだけで、stack は自動的に array パッケージ及び、その依存関係をインストールしてくれます。

$ stack build

現在のプロジェクトで利用しているパッケージの依存関係をチェックするためには stack ls dependencies コマンドを利用します。

$ stack ls dependencies
PFAD 0.1.0.0
array 0.5.3.0
base 4.12.0.0
ghc-prim 0.5.3
integer-gmp 1.0.2.0
rts 1.0

新しく追加した array パッケージのバージョンは 0.5.3.0 が使われているようですね。

パッケージのバージョンを省略できる理由

stack はどんな組み合わせでもビルドできるパッケージの組み合わせをスナップショットとして提供していることはすでに述べた通りです。

実際にプロジェクトを新規作成する際に stack.yaml ファイルの resolver フィールドにスナップショットが自動的に指定されます。

# コメントを削除したstack.yaml
$ cat stack.yaml
resolver: lts-14.5
packages:
- .

resolver はプロジェクトを作成した時点の最新の LTS が指定されるので、気に入らない場合は変更しましょう。

この resolver が指定されているおかげで、明示的にバージョンを指定しなくてもスナップショットに含まれているバージョンが利用されます。スナップショットに登録されているパッケージ、およびバージョンは Stackage などで確認することができます。

また、スナップショットに含まれていないパッケージ (やバージョン) を利用したい場合も実際には良くあります。そのような場合は extra-deps という仕組みが用意されているので、そちらを利用します。