2016-08-08 28 views
6

私は最近、あなたのプロジェクトに外部依存関係を指定するときに、Haskell用のスタックを使い始めました。場合によっては.cabalファイルに配置し、それ以外のときは.yamlファイルに配置することもあります。stack.yamlファイルと.cabalファイルの違いは?

私はカバールファイルに置くと、あなたのパッケージのスタッカリポジトリ内を調べるに過ぎないと思います。しかし、それをあなたの.yamlファイルに置くと、スナップショットの中で見つからない場合、Hackageサーバでも検索します。

+0

「あなたの.yamlファイルに配置する」という正確な意味は?あなたは例を挙げることができますか? – ErikR

答えて

12

プロジェクトのすべての依存関係は、.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ファイルに同様の目的を果たします過去の問題点のいくつかを取り上げています)。

関連する問題