49501


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

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

[code]

    dependencies:
    - base >= 4.7 && < 5
    - shelly == 1.8.0
    
[/code]

[code]

    >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
    
    (以下略)
    
[/code]

( **補足** ：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

### 詳細な再現手順

[code]

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


CC BY-SA 4.0
2018-10-21T10:20:05.570
49500
2018-10-21T10:39:23.813
19110
question
haskell
Haskell Stack で依存ライブラリのバージョンを固定したい


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

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

[code]

    extra-deps:
    - shelly-1.8.0
    
[/code]

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

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


CC BY-SA 4.0
2018-10-21T10:20:05.570
49501
2018-10-21T10:39:23.813
2018-10-21T10:39:23.813
19110
19110
49500
answer