运行`stack ghc`时,两个版本的gtk包都可见

时间:2017-10-24 19:35:51

标签: haskell gtk gtk3 haskell-stack gtk2hs

这里可以找到最小的复制品:

https://github.com/IvanMalison/stack-gtk2hs-bug

当我使用普通堆栈命令时,一切都按预期工作,但是当我运行失败命令时:

stack ghc -- --make main.hs

我收到以下错误:

main.hs:3:1: error:
Ambiguous interface for ‘Graphics.UI.Gtk’:
  it was found in multiple packages: gtk-0.14.6 gtk3-0.14.6

main.hs:4:1: error:
Ambiguous interface for ‘Graphics.UI.Gtk.Abstract.Widget’:
  it was found in multiple packages: gtk-0.14.6 gtk3-0.14.6

main.hs:5:1: error:
Ambiguous interface for ‘Graphics.UI.Gtk.Layout.Table’:
  it was found in multiple packages: gtk-0.14.6 gtk3-0.14.6

stack exec ghc-pkg -- --no-user-package-db list的输出为https://gist.github.com/f19f900988f49e4d03cd61f1cab48baa。这个输出让我期望发生这种情况的原因是某些其他堆栈安装需要gtk(不是gtk3,这是在此包中指定为依赖关系),并且由于某种原因,这个包在stack ghc命令中是可见的。

我是否误解了stack ghc命令?难道这不应该和堆栈构建一样吗?

1 个答案:

答案 0 :(得分:0)

目前还没有内置方法可以使用堆栈。但是,可以stack ghci来执行此操作。最直接的方法是制作一个具有可执行目标的cabal包。但是,如果你真的想直接使用ghc,那就有办法了。从我的评论here复制粘贴:

stack ghc的工作方式与stack ghci略有不同。它本质上是stack exec -- ghc的同义词,它将使用正确的数据库运行正确的编译器,但不会设置与本地包相关的任何内容,如包含目录等。注意{{1需要TARGET参数,而stack ghci没有。回顾一下,这有点不一致,但stack ghc来自stack ghc

有能力做这样的事情是有道理的,虽然不知道如何最好地实现这一目标。一些潜在的选择:

    关于stack ghci
  • --no-interactive参数。会有点迟钝。虽然它会使用stack ghci逻辑,但运行ghci命令时很奇怪。

  • stack ghci选项添加到--target TARGET,告诉它使用特定本地包目标的环境。

现在这是一个解决方法。将以下内容放在stack ghc中并使其成为用户可执行文件:

~/.local/bin/stack-run-ghc.sh

这将获取参数,删除#/bin/sh ghc $(echo "$*" | sed 's/--interactive//g') ,并调用ghc。有了这个,我可以通过以下方式使用ghc构建堆栈:

--interactive