Haskell Stack で依存ライブラリのバージョンを固定したい

投稿者: Anonymous

Stack において、package.yamldependencies に書く依存パッケージのライブラリをマイナーバージョンまで含めてぴったり固定したいです。

たとえば Shelly の現在の最新バージョンは 1.8.1 ですが、1.8.0 に依存したいとします。このとき package.yaml に次のように書いても stack build をすると Shelly 1.8.1 に依存しようとしているような表示が出てしまいます。

dependencies:
- base >= 4.7 && < 5
- shelly == 1.8.0
>stack build

Error: While constructing the build plan, the following exceptions were encountered:

In the dependencies for shelly-1.8.1:
    unix needed, but the stack configuration has no specified version  (latest matching version
         is 2.7.2.2)
needed due to foo-0.1.0.0 -> shelly-1.8.1

(以下略)

(補足:Shelly は 1.8.1 においてうっかり unix パッケージに依存してしまい、Windows 環境下でビルドできなくなりました。このため上のエラーが出ています。1.8.0 は unix に依存していないのでこのエラーは出ません)

shelly == 1.8.0.*shelly >= 1.8.0 && < 1.8.1 と他の書き方を試しても同じ結果となりました。どうすれば特定のバージョンに正確に依存できるのでしょうか?

環境情報

  • Windows 10, cmd.exe
  • Stack Version 1.9.1, Git revision f9d0042c141660e1d38f797e1d426be4a99b2a3c (6168 commits) x86_64 hpack-0.31.0
  • resolver: lts-12.13

詳細な再現手順

>stack new foo
>cd foo
>open package.yaml
(dependencies を編集)
>stack build

解決

エラーメッセージで混乱しましたが、shelly-1.8.1 がインストールされようとしている原因は今回私が使っていた resolver (stackage snapshot) に含まれている Shelly のバージョンが 1.8.1 であるからのようです。

バージョンを固定するには、そのバージョンのパッケージを stack.yamlextra-deps に追加する必要がありました。今回の場合以下のように書くとちゃんと shelly-1.8.0 がインストールされました。

extra-deps:
- shelly-1.8.0

また、こうする代わりに resolver を書き換えて shelly-1.8.0 が入っているものにすることでも解決できます。

バージョン制約を守れていないのだからその旨のエラーを出して欲しい気もしますが、とりあえず解決したので自己回答として投稿します。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *