这里可以找到最小的复制品:
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命令?难道这不应该和堆栈构建一样吗?
答案 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