昨天我了解了一种名为Stack的新Haskell工具。乍一看,它似乎与Cabal的功能类似。那么,它们之间有什么区别呢?Stack是否可以替代Cabal?在哪些情况下应该使用Stack而不是Cabal?Stack能做到Cabal做不到的事情有哪些?
昨天我了解了一种名为Stack的新Haskell工具。乍一看,它似乎与Cabal的功能类似。那么,它们之间有什么区别呢?Stack是否可以替代Cabal?在哪些情况下应该使用Stack而不是Cabal?Stack能做到Cabal做不到的事情有哪些?
stack build --fast --file-watch
命令。如果您更改了本地文件,它会自动重新构建。与--pedantic
选项一起使用,对我来说是一个决定性因素。.cabal
文件中指定的依赖关系,并使用依赖解析器来确定一组满足它的软件包和软件包版本。这个集合来自于 Hackage 的全部内容——所有的软件包和所有版本,过去和现在。一旦找到了可行的构建计划,所选的依赖项版本将被安装并索引到 ~/.cabal
中的某个数据库中。通过将已安装的软件包根据其版本(以及其他相关配置选项)进行索引,避免了依赖项之间的版本冲突,因此不同的项目可以检索到它们需要的依赖项版本而不会互相干扰。这种安排是 cabal-install 文档中所说的 "Nix-style local builds"。stack.yaml
的 resolver
字段,而不是去 Hackage。在默认工作流程中,该字段指定了一个 Stackage 快照,它是 Hackage 软件包的子集,具有已知相互兼容的固定版本。然后,stack 将尝试使用仅由快照提供的内容来满足 .cabal
文件(或可能是 project.yaml
文件——不同的格式,相同的作用)中指定的依赖项。从每个快照安装的软件包都在单独的数据库中注册,彼此之间不会干扰。根据常见问题解答 (FAQ) 的信息,我了解到 Stack 使用 Cabal 库,但不使用 cabal-install 二进制文件(更准确地说是 cabal-install)。该项目的目标似乎是自动沙盒化和避免依赖问题。
换句话说,它使用相同的 Cabal 包结构,只是提供了一个不同的前端来管理这些内容。(我想是这样!)
cabal
,他们的源代码似乎还在使用 docker
。虽然我不知道他们是否已经使用了它。 - Sibi