new-template.cabal 和 stack.yaml 之间的区别
Difference between new-template.cabal and stack.yaml
我之前想用reactive-banana
in my new Haskell project. I never used cabal-install or stack
。我使用 stack new
创建了一个目录并在其中初始化了项目文件。我现在在目录中看到 2 个文件:new-template.cabal
和 stack.yaml
.
如何设置依赖项并确保它们被下载和编译?
起初我尝试在extra-deps:
下的stack.yaml
中添加- reactive-banana-0.8.0.2
,但是stack build
和stack 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
,这发生了 3 次直到最后所有的包都安装好了,我可以在 stack ghci
REPL.
中导入它们
所以我的问题是,使用 stack
的惯用方法是什么?我应该使用这两个文件中的哪一个来指定依赖项和其他项目元数据? stack
的普通 Haskell 开发人员的示例工作流程是什么?
使用 stack
时,我通常不会在 .cabal
文件中设置任何版本限制。我让 stack.yaml
文件中的 resolver
和 extra-deps
设置确定要 select.
的软件包版本
这是一个 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
迭代地确定 extra-deps
并将缺少的任何依赖项添加到 stack.yaml
文件中,直到满足所有依赖项。
您只需要对不在 Stackage 中的包执行此操作——比如 reactive-banana。 Stackage 中有很多常用的包,它们的版本将由 resolver
设置决定。
在默认配置中,stack 使用两个包数据库:一个针对每个用户的集中式数据库和一个特定于项目的数据库。中央数据库仅从 Stackage 中提取包,这是 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
中的额外依赖项
我之前想用reactive-banana
in my new Haskell project. I never used cabal-install or stack
。我使用 stack new
创建了一个目录并在其中初始化了项目文件。我现在在目录中看到 2 个文件:new-template.cabal
和 stack.yaml
.
如何设置依赖项并确保它们被下载和编译?
起初我尝试在extra-deps:
下的stack.yaml
中添加- reactive-banana-0.8.0.2
,但是stack build
和stack 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
,这发生了 3 次直到最后所有的包都安装好了,我可以在 stack ghci
REPL.
所以我的问题是,使用 stack
的惯用方法是什么?我应该使用这两个文件中的哪一个来指定依赖项和其他项目元数据? stack
的普通 Haskell 开发人员的示例工作流程是什么?
使用 stack
时,我通常不会在 .cabal
文件中设置任何版本限制。我让 stack.yaml
文件中的 resolver
和 extra-deps
设置确定要 select.
这是一个 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
迭代地确定 extra-deps
并将缺少的任何依赖项添加到 stack.yaml
文件中,直到满足所有依赖项。
您只需要对不在 Stackage 中的包执行此操作——比如 reactive-banana。 Stackage 中有很多常用的包,它们的版本将由 resolver
设置决定。
在默认配置中,stack 使用两个包数据库:一个针对每个用户的集中式数据库和一个特定于项目的数据库。中央数据库仅从 Stackage 中提取包,这是 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
中的额外依赖项