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

What is the difference between packages.dhall and spago.dhall files?

spago 文档状态:

packages.dhall: this file is meant to contain the totality of the packages available to your project (that is, any package you might want to import).

In practice it pulls in the official package-set as a base, and you are then able to add any package that might not be in the package set, or override existing ones.

spago.dhall: this is your project configuration. It includes the above package set, the list of your dependencies, the source paths that will be used to build, and any other project-wide setting that spago will use. (my emphasis)

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

spago.dhall 依赖项可以在项目 .spago 文件夹中找到。但是我找不到 packages.dhall 中的那些。其他的很常见,比如 aff。 A :

[...] what you choose is a "snapshot", which is a collection of certain versions of all available packages that are guaranteed to compile and work together.

The snapshot is defined in your packages.dhall file, and then you specify the specific packages that you want to use in spago.dhall. The version for each package comes from the snapshot.

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

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

心智模型是 Haskell 开发人员的心智模型,大多数 PureScript 开发人员过去都是这样,现在还有很多。 :-)

但更严重的是,心智模型在一个“解决方案”中有多个“项目”,这是 Haskell 事实上的标准包管理器 Stack 的模型。在 Haskell 这种情况很常见,在 PureScript 中 - 少得多,但仍不是闻所未闻。

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

一旦建立了这组通用基础包,每个单独的项目就可以选择它使用的特定包。在 Haskell Stack 中,这在 package.yaml<project-name>.cabal 中指定(后者已被淘汰)。在 Spago - 它是 spago.dhall.

但是,当然,当您只有一个项目时,packages.dhall 可以建立软件包的“基础集”,然后 spago.dhall 可以分别从中挑选一些特定的软件包set - 可能看起来有点多余。事实上,完全没有 packages.dhall 文件是可能的:只需指定直接在 spago.dhall 中设置的包的 URL 作为 packages [=72] 的值=]:

{ 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 中,则不会发生这种情况,并且您的依赖项可能会不同步。


现在单独说明这一点:

Why do both files have the notion/concept of dependencies? Example: packages.dhall and spago.dhall from the ebook.

如果您仔细查看链接的示例,您会发现它们不是相同的依赖项。 spago.dhall 中的那些是 你的 包的依赖项 - spago.dhall 所在的包。

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