首页 > 解决方案 > 是否可以像 NPM (NodeJS) 一样设计 Stack (Haskell)?

问题描述

Haskell Tool Stack是目前最流行的 Haskell 包管理器,它的主要目标是使构建的 Haskell 包具有可重复性。

但是堆栈接近它的目标的方式是找到一个巨大的无冲突的包修订集,并将其命名为snapshot. 通过这种方式,包维护者被推送更新他的包的依赖关系,这样它就不会与最近的snapshot.

不得不说,这个设计太理想了,无法在现实世界中使用。

相比之下,NPM(NodeJS 的包管理器)通过更实用的方式实现了这一目标:它允许冗余。在菱形依赖的情况下,例如a -> b, c; b -> d(v1); c -> d(v2)NPM 只需d分别安装两个不同的版本 forbc。这样,使用包的用户可以像黑盒一样依赖包,无需考虑它的依赖之间是否存在冲突的深度依赖。

我想知道为什么 Stack 没有设计为允许对包进行冗余修订是否有一些实际原因。是否可以为 Haskell 实现这样的包管理器?实施中最困难的部分是什么?

标签: haskellhaskell-stackpackage-managers

解决方案


对的,这是可能的。实际上,cabal默认情况下曾经以这种方式工作。它在转向 nix 风格的构建时被放弃了,但据我所知,没有技术问题阻碍再次这样做。

也就是说,我对 nix 风格构建的经验是,很少发现强制依赖树中的每个包到特定版本会阻止您构建构建计划。我不确定这是否也是如此stack- 我没有太多经验 - 但至少cabal目前这样做似乎没有什么好处,所以简单的设计具有更简单的故障模式似乎更可取。


推荐阅读