为什么 'build' 一个包而不是在 'stack.yml' 中使用 'extra-deps'?

Why 'build' a package instead of using 'extra-deps' in 'stack.yml'?

据我了解 (1) 我项目的 .cabal 文件中的 build-depends 部分将确保指定的包存在于 stack.yml 中指定的解析器中可用(在适当的版本)并在我测试或 运行 我的包时使用(例如,使用 stack ghcistack test 等)。

我还了解到 (2) 我的 stack.ymlextra-deps 部分用于获取不在指定解析器中的包。

但我对

的作用感到困惑
stack build some-package

这与 extra-deps 有何不同?当我stack teststack ghci等时会使用some-package吗?为什么要使用它而不是将 some-package 添加到 extra-deps? (还有,我的 (1) 和 (2) 对吗?)

build命令的主要目的是实际触发构建,即编译。默认情况下 stack build 将构建 stack.yamlpackages 部分中列出的所有 "local" 包。如果将包名称作为参数传递给 build,通常具有以下两个目的之一:

  1. 您只想在多包项目中构建某个(本地)包
  2. 或者您想要从非本地包安装可执行文件,例如 hlint。通常,您将使用 stack install PKG 来执行此操作,这是 stack build --copy-bins PKG.
  3. 的快捷方式

stack 的一个核心设计原则是构建应该是可重现的,即具有相同代码和相同配置的项目应该始终为 stack build 提供相同的结果。

这意味着stack buildstack install永远不会更改项目配置或向项目添加依赖项。

有关 build 命令的更多详细信息,请查看 the relevant docs