繁体   English   中英

new-template.cabal和stack.yaml之间的区别

[英]Difference between new-template.cabal and stack.yaml

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

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

起初,我试图添加- reactive-banana-0.8.0.2stack.yamlextra-deps:但两者stack buildstack solver没有下载。 然后我在new-template.cabal添加了一个名为library的部分:

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

每次我尝试运行stack build ,它都会出现错误并建议在extra-deps:下将一些包添加到stack.yaml extra-deps:这发生了三次,直到最后安装所有软件包,并且我可以在stack ghci导入它们stack ghci REPL 。

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

使用stack我通常不会在.cabal文件中放置任何版本边界。 我让stack.yaml文件中的resolverextra-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

reactive-banana版本由stack.yaml文件固定。

如果你想使用GHC 7.10将解析器更改为类似nightly-2015-06-17

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

您只需要使用不在Stackage中的软件包 (例如reactive-banana)。 许多常用的包都在Stackage中,它们的版本将由resolver设置决定。

在默认配置中,堆栈使用两个包数据库:集中的每用户数据库和特定于项目的数据库数据库。 集中式数据库只从Stackage中提取软件包, Hackage是Hackage的一个子集,具有已知的兼容软件包,而您可以在项目特定的数据库中放置您想要的任何内容。 您使用的所有程序包都必须位于cabal文件中,但不在Stackage上的程序包(也就是那些将转到项目特定数据库的程序包)也必须列在stack.yaml的extra-deps部分中。 reactive-banana不在Stackage上,所以你需要将它添加到stack.yaml ,如下所示:

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

stack solver可以为您填写stack.yaml中的额外依赖stack.yaml

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM