GHC多个软件包版本严重性警告

时间:2019-07-18 18:22:56

标签: haskell ghc compiler-warnings

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无法发出此警告?

1 个答案:

答案 0 :(得分:4)

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

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

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