堆栈安装使用哪个堆栈快照?

Which stackage snapshot does stack install use?

正在尝试 运行

stack install git-mediate

(根据 git-mediate's instructions

我收到有关依赖包版本的错误消息:

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

In the dependencies for git-mediate-1.0.8:
    Diff-0.3.4 from stack configuration does not match >=0.4  (latest matching version is 0.4.0)
needed since git-mediate is a build target.

Some different approaches to resolving this:

  * Set 'allow-newer: true' in /Users/yairchu/.stack/config.yaml to ignore all version constraints and build anyway.

  * Recommended action: try adding the following to your extra-deps in /Users/yairchu/.stack/global-project/stack.yaml:

- Diff-0.4.0@sha256:b5cfbeed498f555a18774ffd549bbeff7a24bdfe5984154dcfc9f4328a3c2847,1275

Plan construction failed.

堆栈配置有 Diff-0.3.4 很奇怪,因为目前 LTS 和夜间堆栈快照 currently contain Diff-0.4.0lts-16.8nightly-2020-10-13)。

这个堆栈配置是什么,为什么它固定到旧版本的库?

stack 隐含地使用它在 ~/.stack/global-project/stack.yaml 中定义的 "global project"。要控制正在使用的堆栈快照,可以编辑此文件(或删除以使用最新的 LTS)

stack installstack build --copy-bins 的别名,所以它实际上只是 stack build 加上将构建的可执行文件复制到 ~/.local/bin.

的额外步骤

所以,真正的问题是“stack build 如何决定使用什么解析器?”好吧,如果你在命令行上提供它,它会使用那个,如:

stack install --resolver lts-16.18 git-mediate

如果不给出显式解析器,则默认取决于构建命令所在的位置运行。如果您 运行 它在堆栈项目中,它将默认为项目的 stack.yaml 文件中指定的解析器。例如:

stack new --resolver lts-16.0 exampleproject  # create project with lts-16.0 resolver
cd exampleproject
stack build git-mediate   # this will build git-mediate using lts-16.0

如果您在任何项目之外构建它,那么它会使用全局项目设置,这将是 ~/.stack/global-project/stack.yaml 中设置的任何 resolver,如评论/其他答案中所述。

请注意,stack install 别名总是会将可执行文件复制到“全局”~/.local/bin 中,而不管它是在哪里构建的。因此,如果您在 exampleproject 目录中 运行 stack install git-mediate,如上所述,您将获得使用 lts-16.0 构建的版本作为全局安装版本。

Soooo...小心你 运行 stack install!

请注意,特别是关于 git-mediate,最近有一个发布到 Stackage 的错误版本,如记录 here 所示。错误消息与您收到的消息略有不同,但根本问题可能是相同的。因此,如果您还没有修复构建问题,只需 运行ning stack update 无需修改解析器设置就可以解决构建问题。