Sid*_*bra 4 haskell haskell-stack
堆栈如何解决依赖冲突?
我刚开始使用 Haskell,我对堆栈如何解决依赖关系几乎没有疑问。
假设我的项目需要lib A和lib B。
在内部,lib A需要lib X-1.9.0和lib B需要lib X-2.0.0,堆栈将如何解决这个问题?
堆栈文档说他们使用快照来解决冲突,这是如何工作的?这是否意味着 lib A 和 lib B 的作者决定了与它们一起使用的 lib X 版本?如果是这样,当我使用较新版本的 lib A 或 lib B 或者它们中的任何一个不在快照中时会发生什么?
快照实际上是如何制作的?
默认情况下,Stack 全局安装软件包。当项目 A 需要 lib Y-1.0 而项目 B 需要 lib Y-1.1 时会发生什么?这是如何处理的?
如何使用“stackage.org”上的软件包?
我试图安装beam-core,谷歌把我带到https://www.stackage.org/package/beam-core那里没有提到安装它的命令或最新版本是什么。我在 github 版本中找不到预期的版本号。
使用 pip 和 npm,它非常简单,关于如何安装和使用的所有信息都可以在包的页面上找到。例如两者,
https://pypi.org/project/bencode.py/
https://www.npmjs.com/package/projects
包含版本号和安装命令,即使它们很明显。
当我尝试安装软件包时,经常会遇到与“堆栈配置”相关的错误。我不知道什么是“堆栈配置”?所有这些错误是什么意思以及如何在上述所有问题的上下文中解决它们?
执行stack install beam-core或stack repl --package beam-core --package beam-sqlite --package sqlite-simple --package beam-migrate --package text导致
`Users/username/Documents/beam-learn/beam-learn.cabal was modified manually. Ignoring /Users/username/Documents/beam-learn/package.yaml in favor of the cabal file.
If you want to use the package.yaml file instead of the cabal file,
then please delete the cabal file.
Stack has not been tested with GHC versions above 8.6, and using 8.8.2, this may fail
Stack has not been tested with Cabal versions above 2.4, but version 3.0.1.0 was found, this may fail
Error: While constructing the build plan, the following exceptions were encountered:
In the dependencies for hashable-1.2.7.0:
base-4.13.0.0 from stack configuration does not match >=4.4 && <4.13 (latest matching version is 4.12.0.0)
needed due to beam-core-0.8.1.0 -> hashable-1.2.7.0
Some different approaches to resolving this:
* Set 'allow-newer: true' in /Users/username/.stack/config.yaml to ignore all version constraints and build anyway.
* Build requires unattainable version of base. Since base is a part of GHC, you most likely need to use a different GHC version with the matching base.
Plan construction failed.`
Run Code Online (Sandbox Code Playgroud)
对于问题#1:
Stack 的设计理念是,对于给定的 Stack 项目,只会使用给定包的一个版本。因此,如果您有一个需要库A和的项目B,并且它们中的每一个都依赖于不同版本的库X,那么您就无法按原样使用 Stack 构建项目。
快照是通过构建包版本的集合(每个包只有一个版本)来构建的,这样可以满足所有包间的依赖关系。这是由 Stackage“策展人”使用该工具完成的,如此处所述curator。该curator工具使用 Hackage 上可用的软件包索引来构建一组软件包版本(每个软件包只有一个版本),这些版本在满足所有软件包相互依赖性的意义上是兼容的。
因此,库作者不需要决定X适用于两者的版本。相反,他们需要指定他们的包适用的一系列版本X,并且该curator工具选择X适用于他们的包以及依赖X或依赖的其他所有人的包的最新版本X。
如果要使用较新版本的库A或B不在快照中的库,请将其添加为构建计划中的额外依赖项(即,在文件的extra-deps部分中stack.yaml)。如果不能使用 的快照版本构建新版本X,则您也需要为其添加额外的依赖项X。如果这破坏了其他包并且您找不到解决所有冲突的一组额外依赖项,那么您就不走运了。
在实践中,由于大多数包具有相对广泛的依赖项范围,并且对于积极维护的包,这些范围通常与较新的兼容依赖项版本保持同步,因此您不会经常遇到无法解决的冲突,但确实会发生。
对于问题#2:
Stack 并没有真正全局安装软件包。它将快照包安装在~/.stack按快照组织的全局缓存中(在 Linux 上,在目录中)。因此,可以在不同快照下的此缓存中安装多个版本,项目将使用适合项目所选快照的版本。
对于问题#3:
在 Stackage 页面上beam-core,您可以看到包含它的最新 LTS 快照是lts-14.27。您可以使用此解析器创建一个新项目:
$ stack new --resolver lts-14.27 my-beam-project
Run Code Online (Sandbox Code Playgroud)
要添加beam-core到您的项目,请编辑my-beam-project/package.yaml并添加一个依赖项:
dependencies:
- base >= 4.7 && < 5
- beam-core # <-- add this
Run Code Online (Sandbox Code Playgroud)
现在,stack build在您的my-beam-project目录中运行:
$ cd my-beam-project
$ stack build
Run Code Online (Sandbox Code Playgroud)
它将构建beam-core及其所有依赖项,这需要几分钟的时间,除非您之前beam-core为此快照构建过。
您可以beam-core通过stack ghci在项目中运行来摆弄:
$ stack ghci
...
Configuring GHCi with the following packages: my-beam-project
GHCi, version 8.6.5: http://www.haskell.org/ghc/ :? for help
[1 of 2] Compiling Lib ( /u/buhr/src/overflow/my-beam-project/src/Lib.hs, interpreted )
[2 of 2] Compiling Main ( /u/buhr/src/overflow/my-beam-project/app/Main.hs, interpreted )
Ok, two modules loaded.
Loaded GHCi configuration from /tmp/haskell-stack-ghci/e5a80991/ghci-script
*Main Lib> import Database.Beam
*Main Lib Database.Beam> :t fieldName
fieldName
:: Functor f =>
(text-1.2.3.1:Data.Text.Internal.Text
-> f text-1.2.3.1:Data.Text.Internal.Text)
-> TableField table ty -> f (TableField table ty)
*Main Lib Database.Beam>
Run Code Online (Sandbox Code Playgroud)
当然,您可以在包中添加代码src/Lib.hs和/或app/Main.hs使用beam-core包。
对于问题#4:
正如评论中所指出的,我相信您遇到的问题是最新的 LTS 是lts-15.3,并且beam-core当前不是为此快照构建的。
因为beam-core 是为以前的快照构建的,但不是为当前的快照构建的,所以它被排除在外可能是一个很好的理由。在这种情况下,维护者似乎没有升级它以使用最新的 GHC 版本。具体来说, 的最新版本beam-core-0.8.0.0需要 的版本hashable < 1.3,但满足该约束的最新版本是hashable-1.2.7.0which requires base < 4.13。而且,虽然它远非显而易见,但这意味着它不适用于 GHC 8.8,仅适用于 GHC 8.6,因此您必须回到 GHC 8.6 系列 Stackage 快照。