首页 > 解决方案 > 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

关于这个警告,我不清楚有两件事:

  1. 如果 GHC 发出警告,并且编译没有失败,一切都好吗?也就是说,同一包的微妙冲突实例是否仍会导致不良行为?(我想像(Int, Int)公共接口中的一种类型,包的两个实例都会切换字段的顺序。)
  2. 有没有办法让 GHC 因这个警告而失败?

标签: haskellghccompiler-warnings

解决方案


这不是 GHC 警告你关于多个包版本的东西。GHC 只是编译指定的包......几乎没有人手工完成,但让 Stack 或 Cabal 为他们完成。在这种情况下,是阴谋集团发出警告信息。

如果不同版本导致问题,实际上您几乎总是会在编译时看到它。这通常是一个缺少实例的错误,因为您正在尝试将类Foofrompkg-1.0与类型Barfrom一起使用pkg-2.0。公共接口中数据类型的直接版本不匹配也可能发生。
从理论上讲,我认为也有可能出现错误,比如(Int,Int)意味着两种不同的东西,编译器不会捕捉到。但是,这种变化无论如何都是自找麻烦。每当某些数据字段的顺序不完全明显并且将来可能会更改时,data应使用记录以确保编译器可以捕获它。(这在很大程度上与different-versions-of-same-package问题正交。)

如果你想避免任何版本不匹配的问题,你可以使用 Stack 而不是 Cabal。我认为这是许多 Haskeller 更喜欢 Stack 的一个很好的部分原因。


推荐阅读