haskell - GHC 多包版本警告的严重性
问题描述
当一个包通过依赖关系依赖于同一包的不同实例时,GHC 会发出警告,例如:
Configuring tasty-hspec-1.1.5.1...
Warning:
This package indirectly depends on multiple versions of the same package.
This is very likely to cause a compile failure.
package hspec-core (hspec-core-2.5.5-H06vLnMfEeIEsZFdji6h0O) requires
clock-0.7.2-9qwmBbNbGzEOSffjlyarp
package tasty (tasty-1.1.0.3-I8Vu9v0lHj8Jlg3jpKXavp) requires
clock-0.7.2-Cf9UTsaN2AjEpBnoMpmgkU
关于这个警告,我不清楚有两件事:
- 如果 GHC 发出警告,并且编译没有失败,一切都好吗?也就是说,同一包的微妙冲突实例是否仍会导致不良行为?(我想像
(Int, Int)
公共接口中的一种类型,包的两个实例都会切换字段的顺序。) - 有没有办法让 GHC 因这个警告而失败?
解决方案
这不是 GHC 警告你关于多个包版本的东西。GHC 只是编译指定的包......几乎没有人手工完成,但让 Stack 或 Cabal 为他们完成。在这种情况下,是阴谋集团发出警告信息。
如果不同版本导致问题,实际上您几乎总是会在编译时看到它。这通常是一个缺少实例的错误,因为您正在尝试将类Foo
frompkg-1.0
与类型Bar
from一起使用pkg-2.0
。公共接口中数据类型的直接版本不匹配也可能发生。
从理论上讲,我认为也有可能出现错误,比如(Int,Int)
意味着两种不同的东西,编译器不会捕捉到。但是,这种变化无论如何都是自找麻烦。每当某些数据字段的顺序不完全明显并且将来可能会更改时,data
应使用记录以确保编译器可以捕获它。(这在很大程度上与different-versions-of-same-package
问题正交。)
如果你想避免任何版本不匹配的问题,你可以使用 Stack 而不是 Cabal。我认为这是许多 Haskeller 更喜欢 Stack 的一个很好的部分原因。
推荐阅读
- php - 通过在表 2 中搜索从表 1 中获取用户?
- python - 如何确定 Django 中是否创建了新对象?
- jersey - 百里香内联原始 i18n 消息到 javascript
- reactjs - React Onclick - 没有重载匹配这个调用
- c# - 我应该如何在命令栏项目中设置搜索框?
- javascript - React 钩子上的无限调用 API 的问题
- java - 为什么 Liveness / Readiness 探测失败?
- sqlalchemy - sqlalchemy.exc.InternalError: (psycopg2.errors.InternalError_) 找不到从未知到描述枚举的转换函数
- ios - 我想在 Xcode 上使用 Swift 让我的暗模式同时在所有视图控制器上工作。我该怎么做?
- sql - 在 Quill SQL 中连接多个中缀