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。你的消息来源是什么?