我在哪里可以找到 Haskell 的正确包名和版本?

Where can I find correct package name and version for Haskell?

说,我需要 System.Eval.Haskell。或者其他什么。我怎么知道我应该在 package.yaml 中指定哪个包?当我转到 https://hackage.haskell.org/package/plugins-1.5.7/docs/System-Eval-Haskell.html 时,我没有看到包名称。

P.S。 "plugins" 对我不起作用。因此,我认为这是不同的东西。我希望如此:)


看起来配置中的额外依赖项和 "regular" 依赖项之间的区别有些不明确。提及 plugins-1.5.7 作为 extra-dep 确实有效。我在这里做一些依赖管理不善,还是那是绿色的方式?

Say, I need System.Eval.Haskell. Or whatever else. How do I know which package I should specify in my package.yaml?

可能有很多包导出一个特定的模块,因此您不一定能从模块名称中知道要导入哪个包。但通常从 google 搜索中可以明显看出。

正如 duplode 提到的那样,包被命名为 plugins,并且正如您发现的那样,堆栈使用 <package_name>-<version> 格式在 stack.yaml 中指定包名称 + 版本。 Cabal 使用不同的格式,更加灵活(可以指定模糊的包版本范围等)。由于堆栈适用于包版本的固定快照,因此 plugins-1.5.7 格式就足够了。

当您在 *.cabal 文件中写入 plugins 时,您指定的内容类似于 "any version of plugins but prefer the most recent"。但是因为 stack 你的包存储库被限制在一个特定的快照,你真正做的是让 stack 管理你的依赖关系。

Looks like there is somewhat quite unclear difference between extra-dependencies and "regular" dependencies in the configuration. Mentioning plugins-1.5.7 as extra-dep indeed works. Am I doing some dependency mismanagement here, or that's green way to go?

本该如此。问题是 Haskell 软件包有两个主要存档:Hackage,其中基本上包括每个软件包和每个版本,以及 Stackage,它是 Hackage 的一个很大的子集,被捆绑到相互兼容的包和版本的快照中。 Stack 默认从 Stackage 中绘制包,所以如果你想使用 Stackage 中没有的 Hackage 包,你还必须将它添加到 stack.yamlextra-deps 中。可以找到包是否在 Stackage 中 contents page of the package in the Hackage docs (if it is on Stackage, there will be an entry for it in the "Distributions" field). Also relevant is Stackage Hoogle,它允许您在 Stackage 快照中搜索包名称、模块和标识符。

P.S.: 有关 Hackage、Stackage 和 Stack 之间关系的更多信息,您可以查看我对 的回答(您可以替换任何提及的 "the .cabal file"如果您使用的是“package.yaml”。)

查看hackage模块文档时,包名在左上角:

在这种情况下,确实是插件,版本1.5.7。

当您在 .cabal 文件中声明依赖项时,Stack 将尝试找到适合您所定位的 Long-Term Support (LTS) 集合的版本。

有时,您想使用与 LTS 集合中可用版本不同的版本(例如,如果您想要更新的版本),在这种情况下,您可以在 extra-dependencies.