我正在尝试使用Snap Web框架启动一个新项目。我使用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进行下载?
提前致谢:)
答案 0 :(得分:1)
这两个选项都可用。默认选项就是你所做的,并且仍然是hackage来获取包。您刚刚在您的cabal中添加了一个过滤器,可以防止您使用Stackage中包含的任何未经测试的软件包版本与所有其他软件包一起使用。
另一种选择是简单地将您的cabal repo指向Stackage url,然后直接从Stackage服务器下载包。该服务器只提供已知可以协同工作的软件包,因此您的cabal文件中不需要其他约束。我其实更喜欢这种工作方式。
在这两种情况下,如果您的cabal文件中存在与Stackage限制不兼容的其他约束,则构建将失败。如果使用第一个选项,则会出现依赖项冲突。使用第二个选项时,Stackage服务器将仅报告它没有该特定包/版本。