Build packages.dhall和spago.dhall文件之间有什么区别?

Build packages.dhall和spago.dhall文件之间有什么区别?,build,purescript,dhall,spago,Build,Purescript,Dhall,Spago,文件说明: packages.dhall:此文件旨在包含项目可用的所有包(即您可能要导入的任何包) 实际上,它将正式的包集作为基础,然后您可以添加任何可能不在包集中的包,或者覆盖现有的包 spago.dhall:这是您的项目配置。它包括上面的包集、依赖项列表、将用于构建的源路径,以及spago将使用的任何其他项目范围的设置。(我的重点) 为什么这两个文件都有依赖关系的概念?示例:来自电子书 spago.dhall依赖项可以在项目.spago文件夹中找到。但是我无法在packages.dhall中

文件说明:

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

实际上,它将正式的包集作为基础,然后您可以添加任何可能不在包集中的包,或者覆盖现有的包

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

为什么这两个文件都有
依赖关系的概念?示例:来自电子书

spago.dhall
依赖项可以在项目
.spago
文件夹中找到。但是我无法在
packages.dhall
中找到这些文件。另一些是常见的,如
aff
。A:

[…]您选择的是一个“快照”,它是所有可用软件包的特定版本的集合,保证可以一起编译和工作

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

这听起来像是
spago.dhall
是从
packages.dhall
中摘录的包。关于版本的说明有点混乱,因为两个文件中都没有版本说明符


那么,为什么是两个文件?对于那些来自npm生态系统并拥有
package.json
(也可能存在)的人来说,他们的心智模型是什么?

心智模型是Haskell开发人员的,这是大多数PureScript开发人员过去的样子,现在仍然是。:-)

但更严重的是,心智模型在“解决方案”中有多个“项目”,这是Haskell事实上的标准包管理器的模型。在Haskell中,这种情况非常普遍,在PureScript中更是如此,但并非闻所未闻

在这种情况下,让所有的“项目”共享一组公共的包通常是有益的,这些包都保证彼此“兼容”,这意味着它们都一起编译,并且它们的测试通过。在Haskell Stack中,这个公共包集在
Stack.yaml
中定义。在Spago中,它是
packages.dhall

一旦建立了这个通用的基本包集,每个项目都可以选择它使用的特定包。在Haskell堆栈中,这在
package.yaml
cabal
中指定(后者正在逐步淘汰)。在Spago中-它是
Spago.dhall

但当然,当您只有一个项目时,同时拥有两个
packages.dhall
来建立包的“基本集”,然后分别使用
spago.dhall
从该集中选择一些特定的包,这似乎有点多余。实际上,完全不需要
packages.dhall
文件也是可能的:只需直接在
spago.dhall
中指定包集的URL,作为
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" ]
}
这将起作用,但有一个重要的警告:散列。当在
packages.dhall
中指定包集的URL时,运行
spago 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
所在的包


但是
包中的
依赖项
。dhall
测试单元
包的依赖项,它被添加到包集中作为覆盖,大概是因为我们想要使用特殊版本的
无堆栈默认值
,它在正式包集中不存在。当您像这样重写一个包时,您可以重写该包自己的
spago.dhall
中指定的任何字段,在这种情况下,我们正在重写
依赖项
repo
、和
版本

我感觉它是
hpack
(package.yaml)正在被淘汰?我以前从未听说过@arrowd。你的消息来源是什么?