堆栈包含或独占使用

Stackage inclusive or exclusive usage

我正在尝试使用 Snap 网络框架开始一个新项目。我使用 snap init 来让我的基本框架正常工作。我还将 http://www.stackage.org/lts/cabal.config 放在我的 .cabal 文件旁边。我没有取消注释以专门使用 Stackage。所以我尝试构建但它失败了,找不到我的 .cabal 文件所需的 lens 版本。 Stackage 中的 cabal.config 文件指定的镜头版本与我的 .cabal 文件中的版本不同。所以我从我的包列表中删除了所有约束并做了通常的 cabal install --only-dep -j8 --enable-test 并且它起作用了!

但是,我一直被告知包版本应该受到限制。那么,在使用 Stackage 时,可以不受包版本的限制吗?我应该将我的软件包降级为 Stackage 中可用的软件包吗?

据我了解,cabal.config 文件指定了一组依赖项,其中包含满足依赖项的特定版本,那么 Stackage 是如何工作的呢?它只是被证明兼容的 Hackage 软件包的一个子集吗?他们是托管自己的软件包还是依赖 Hackage 进行下载?

提前致谢:)

两种选择都可以。默认选项是您所做的,并且仍然会进行黑客攻击以获取软件包。您刚刚向您的 cabal 添加了一个过滤器,以防止您使用 Stackage 中包含的任何版本的软件包,这些软件包未经测试可与所有其他软件包一起工作。

另一种选择是简单地将您的 cabal 存储库指向 Stackage url,然后您将直接从 Stackage 服务器下载包。该服务器将只提供已知可以协同工作的包,因此不需要在您的 cabal 文件中添加额外的约束。我其实更喜欢这种工作方式。

在这两种情况下,如果您的 cabal 文件中有与 Stackage 限制不兼容的其他限制,您的构建将失败。如果您使用第一个选项,您将遇到依赖冲突。使用第二个选项时,Stackage 服务器将简单地报告它没有特定的 package/version.