2

spago文档状态:

packages.dhall:此文件旨在包含您的项目可用的全部包(即,您可能要导入的任何包)。

实际上,它以官方包集为基础,然后您可以添加任何可能不在包集中的包,或覆盖现有的包。

spago.dhall: 这是你的项目配置。它包括上述包集、依赖项列表、将用于构建的源路径以及 spago 将使用的任何其他项目范围的设置。(我的重点)

为什么这两个文件都有 的概念/概念dependencies?示例:packages.dhall来自spago.dhall电子书。

spago.dhall可以在项目.spago文件夹中找到依赖项。但我无法找到来自packages.dhall. 其他的都很常见aff。不同的视角

[...] 您选择的是“快照”,它是所有可用包的某些版本的集合,这些包保证可以编译和协同工作。

快照在您的packages.dhall文件中定义,然后您指定要在spago.dhall. 每个包的版本来自快照。

听起来,就像spago.dhall是来自 .The 包的摘录packages.dhall。关于版本的注释有点令人困惑,因为两个文件中都没有版本说明符。

那么,为什么是两个文件?来自 npm 生态系统的人的心智模型是什么package.json(也可能存在)?

4

1 回答 1

3

心智模型是 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

但是其中包含包dependenciespackages.dhall依赖项test-unit,它作为覆盖添加到包集中,大概是因为我们想要使用stackless-default官方包集中不存在的特殊版本。当您像这样覆盖一个包时,您可以覆盖该包自己指定的任何字段spago.dhall,在这种情况下,我们将覆盖dependenciesrepoversion

于 2020-12-27T02:57:25.703 回答