5

我想reactive-banana在我的新 Haskell 项目中使用。我从未使用过cabal-installstack以前。我创建了一个目录并在其中使用stack new. 我现在在目录中看到 2 个文件:new-template.cabalstack.yaml.

如何设置依赖项并确保它们被下载和编译?

起初我尝试在下添加- reactive-banana-0.8.0.2,但两者都没有下载。然后我增加了一个调用这个的部分:stack.yamlextra-deps:stack buildstack solverlibrarynew-template.cabal

library
  hs-source-dirs:      src
  exposed-modules:     Lib
  build-depends:       base >= 4.7 && < 5
                     , reactive-banana >= 0.8
  default-language:    Haskell2010

每次我尝试运行stack build时,它都会出现错误并建议将一些包添加到stack.yamlunder时崩溃extra-deps:,这种情况发生了 3 次,直到最后安装了所有包,我可以将它们导入stack ghciREPL。

所以我的问题是,惯用的使用方式是什么stack?我应该使用这两个文件中的哪一个来指定依赖项和其他项目元数据?普通 Haskell 开发人员的示例工作流程是stack什么?

4

2 回答 2

5

使用时,stack我通常不会在我的.cabal文件中放置任何版本限制。我让文件中的resolverandextra-deps设置stack.yaml决定选择哪些版本的包。

这是一个stack.yaml引入 reactive-banana-0.8.1.2 的文件:

flags: {}
packages:
- '.'
extra-deps:
- reactive-banana-0.8.1.2
- psqueues-0.2.0.2
resolver: lts-2.17

在我的.cabal文件中,我只有:

  build-depends:       base >= 4.7 && < 5, reactive-banana

反应香蕉版本由 stack.yaml 文件固定。

如果您想使用 GHC 7.10,请将解析器更改为nightly-2015-06-17.

我通过运行并将缺少的任何依赖项添加到文件中,直到满足所有依赖项来extra-deps迭代地确定。stack buildstack.yaml

您只需要对不在Stackage中的包执行此操作,例如响应式香蕉。Stackage中有很多常用的包,它们的版本将由resolver设置决定。

于 2015-07-23T12:12:27.750 回答
2

在默认配置中,stack 使用两个包数据库:一个集中的每个用户数据库和一个特定于项目的数据库。集中式数据库仅从Stackage中提取包,Stackage是具有已知兼容包的 Hackage 子集,而您可以将任何您想要的内容放在项目特定的数据库中。您使用的所有包都必须在 cabal 文件中,但那些不在 Stackage 上的包(即那些将进入项目特定数据库的包)也必须列在stack.yaml. reactive-banana不在 Stackage 上,因此您需要将其添加到stack.yaml,如下所示:

# etc.
extra-deps:
- reactive-banana-0.8.1.2
# etc.

stack solver可以为你填写额外的依赖项stack.yaml

于 2015-07-23T12:13:22.817 回答