プロジェクトのすべての依存関係は、.cabal
ファイルにあります。あなたは間違いなく、stack.yaml
ファイル内のパッケージを一覧表示することもありますが、これは間違いありません。何故ですか?
まあ、.cabal
ファイルは常にパッケージ時に、あなたの依存関係を表現しますが、これらのパッケージはどこから来たstack.yaml
ファイルには、効果的にを設定します。通常、stack
を使用する場合、リゾルバに基づいて、stack.yaml
ファイルで指定したパッケージがStackageから提供されます。ただし、StackageにはHackageのすべてのパッケージが含まれているわけではありません。また、Stackageの外にあるパッケージが必要な場合は、stack.yaml
ファイルで指定する必要があります。
これはなぜですか?つまり、リゾルバは2つの重要な情報を自動的に結合します:パッケージ名とパッケージのバージョン。 Stackageリゾルバは、単一のリゾルバ内のすべてのパッケージが連携するという(弱い)保証を提供するので、パッケージがリゾルバから来たときに、手動でどのバージョンを選択する必要はありません。代わりに、Stackageがあなたのために決定します。
パッケージをHackageから引き出す場合、この贅沢品がないので、パッケージとのパッケージをextra-deps
で指定する必要があります。たとえば、次のようなものがあります。
extra-deps:
- crypto-pubkey-openssh-0.2.7
- data-bword-0.1
- data-dword-0.3
このエントリは、StackageではなくHackageからどのバージョンのパッケージを取得するかを具体的に決定します。アプリケーションを構築する場合
が、これは見えるかもしれませんが少し冗長-あなたも、.cabal
ファイルにバージョンの制約を指定し、なぜstack.yaml
ファイルでそれらを複製することができますか?ただし、ライブラリをビルドする場合、その区別はもう少し重要です。.cabal
ファイルは、ライブラリの実際のバージョン制約を表しますが、stack.yaml
ファイルは、ローカルで開発するときに実際にインストールするバージョンを正確に指定します。責任はほぼ同じクリアカット方法をHaskellのパッケージシステム周りstack
(一部起因する歴史的な理由ではありませんけれども、この意味で
は、stack.yaml
ファイルは、他のパッケージマネージャのGemfile.lock
またはnpm-shrinkwrap.json
ファイルに同様の目的を果たします過去の問題点のいくつかを取り上げています)。
「あなたの.yamlファイルに配置する」という正確な意味は?あなたは例を挙げることができますか? – ErikR