【问题标题】:Haskell stack, how to revert ambiguous module names found in multiple packages globallyHaskell堆栈,如何恢复全局多个包中发现的模棱两可的模块名称
【发布时间】:2019-04-16 20:57:56
【问题描述】:

trying to debug a different question 时,我安装了一个似乎与我安装的其他一些包冲突的包。

我跑了

$ stack install regex-pcre-text
regex-pcre-builtin-0.94.4.8.8.35: configure
regex-tdfa-1.2.3.1: download
regex-pcre-builtin-0.94.4.8.8.35: build
regex-tdfa-1.2.3.1: configure
regex-tdfa-1.2.3.1: build
regex-pcre-builtin-0.94.4.8.8.35: copy/register
regex-tdfa-1.2.3.1: copy/register
regex-tdfa-text-1.0.0.3: download    
regex-tdfa-text-1.0.0.3: configure   
regex-tdfa-text-1.0.0.3: build       
regex-tdfa-text-1.0.0.3: copy/register
regex-pcre-text-0.94.0.1: download    
regex-pcre-text-0.94.0.1: configure   
regex-pcre-text-0.94.0.1: build       
regex-pcre-text-0.94.0.1: copy/register
Completed 4 action(s).                

我不能再简单地导入

Text.Regex.PCRE

当我尝试时,我现在看到了:

$ stack ghci
Prelude> :set -XOverloadedStrings
Prelude> import Text.Regex.PCRE

产量

<no location info>: error:
    Ambiguous module name ‘Text.Regex.PCRE’:
      it was found in multiple packages:
      regex-pcre-0.94.4 regex-pcre-builtin-0.94.4.8.8.35

我想将我的安装恢复到较早的状态,以便我的机器上没有资格导入 Text.Regex.PCRE 的代码继续像以前一样工作。

但是,堆栈似乎没有明确的卸载:

$ stack uninstall regex-pcre-text

Error: stack does not manage installations in global locations. The only global mutation stack performs is executable copying. For the default executable destination, please run stack path --local-bin

我对简单地运行这个stack path --local-bin 犹豫不决,因为我不知道它会做什么,或者它是否可以逆转(这是我安装上述软件包时的错误)。我的导入问题的正确解决方法是什么?

更新 1

我尝试了建议here

$ ghc-pkg unregister regex-pcre-text
ghc-pkg: cannot find package regex-pcre-text

$ stack exec ghc-pkg unregister regex-pcre-text
ignoring (possibly broken) abi-depends field for packages

【问题讨论】:

  • 一般情况下,您可以使用PackageImports 处理此类事情。
  • 根据我的经验,您不应该真正使用堆栈来全局安装东西。它只会导致每次这样的头痛。相反,您可以为您的项目目录创建一个沙箱环​​境,所有依赖项(包括您的 ghc 二进制文件)都将在该目录中独立管理。 resource
  • 在您的具体情况下,据我所知,regex-pcreregex-pcre-builtin 是同一包的不同版本,因此它们应该可以互换。由于regex-pcre-text 需要regex-pcre-builtin,只要您的依赖项都不需要regex-pcre,我会删除它。然后当您导入Text.Regex.PCRE 时,它将使用regex-pcre-builtin,它应该可以按预期工作。
  • 简单地import Text.Regex.PCRE 产生&lt;interactive&gt;:1:1: error: Ambiguous module name ‘Text.Regex.PCRE’: it was found in multiple packages: regex-pcre-0.94.4 regex-pcre-builtin-0.94.4.8.8.35

标签: haskell ghci haskell-stack


【解决方案1】:

问题是regexp-pcre-text 安装了它的依赖项regex-pcre-builtin 导致了冲突。您想在全局项目中(即在任何特定项目目录之外)运行两个以下命令:

$ stack exec ghc-pkg unregister regex-pcre-text
$ stack exec ghc-pkg unregister regex-pcre-builtin

您已经运行了第一个,我怀疑它已成功完成,尽管有关于 abi-depends 字段的警告消息,所以您只需要运行第二个。

(这些可以组合成一个命令:

$ stack exec ghc-pkg unregister regex-pcre-text regex-pcre-builtin

但鉴于您已经删除了第一个包,我相信这会失败,并显示未找到 regex-pcre-text 的消息。)

@DarthFennec 提到的解决方案是使用PackageImports 扩展来解决冲突。在 GHCi 中,使用 regex-pcre 包中的模块,即使同时安装了两个包:

Prelude> :set -XPackageImports
Prelude> import "regex-pcre" Text.Regex.PCRE
Prelude Text.Regex.PCRE>

【讨论】:

  • 谢谢,就是这样——我都必须在项目目录之外运行它,即使它显示了一条错误消息,它也可能成功了,这让我很困惑。这样做解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多