心智模型是 Haskell 开发者的模型,这是大多数 PureScript 开发者过去的样子,现在也有很多。:-)
但更严重的是,心智模型是在一个“解决方案”中拥有多个“项目”,这是 Haskell 的事实上的标准包管理器Stack的模型。在 Haskell 中,这种情况在 PureScript 中很常见——更不用说,但仍然不是闻所未闻。
在这种情况下,让所有“项目”共享一组公共包通常是有益的,这些包都保证彼此“兼容”,这仅仅意味着它们都可以一起编译并且它们的测试通过。在 Haskell Stack 中,这组通用的包定义在stack.yaml
. 在 Spago - 它是packages.dhall
.
一旦你建立了这个通用的基本包集,每个单独的项目都可以选择它使用的特定包。在 Haskell Stack 中,这被指定为 inpackage.yaml
或 in <project-name>.cabal
(后者被逐步淘汰)。在 Spago - 它是spago.dhall
.
但是,当然,当您只有一个项目时,既packages.dhall
要建立包的“基本集”,又要分别spago.dhall
从该集中挑选一些特定的包——这似乎有点多余。实际上,完全没有packages.dhall
文件是可能的:只需在 中直接指定包集的 URLspago.dhall
作为packages
属性的值:
{ name = "my-project"
, dependencies = [ ... ]
, license = "..."
, packages = https://github.com/purescript/package-sets/releases/download/psc-0.13.8-20201223/packages.dhall
, repository = "..."
, sources = [ "src/**/*.purs" ]
}
这会起作用,但有一个重要的警告:散列。当在 中指定包集的 URL 时packages.dhall
,runningspago install
将计算该包集的哈希并将其放入 中packages.dhall
,紧挨着 URL。这是我的样子:
let upstream =
https://github.com/purescript/package-sets/releases/download/psc-0.13.8-20201222/packages.dhall sha256:620d0e4090cf1216b3bcbe7dd070b981a9f5578c38e810bbd71ece1794bfe13b
然后,如果软件包集的维护者变得邪恶并更改了该文件的内容,Spago 将能够注意到这一点,重新计算哈希并重新安装软件包。
如果您将 URL 直接放在 中spago.dhall
,则不会发生这种情况,并且您的依赖项可能会不同步。
现在分别解决这一点:
为什么这两个文件都有依赖的概念/概念?示例:电子书中的 packages.dhall 和 spago.dhall。
如果您仔细查看链接的示例,您会发现它们不是相同的依赖项。其中的那些是你的包spago.dhall
的依赖项- 存在的那个。spago.dhall
但是其中包含包dependencies
的packages.dhall
依赖项test-unit
,它作为覆盖添加到包集中,大概是因为我们想要使用stackless-default
官方包集中不存在的特殊版本。当您像这样覆盖一个包时,您可以覆盖该包自己指定的任何字段spago.dhall
,在这种情况下,我们将覆盖dependencies
、repo
和version
。