为什么使用 haskell/stack 编译 GTK (gi-gtk) 应用程序不可重现?

Why compiling GTK (gi-gtk) application with haskell/stack is not reproducible?

我在 Haskell 中创建了一个通过 gi-gtk 使用 GTK 的应用程序,使用堆栈 (lts-9.2) 管理依赖项。我在 Fedora 26 上成功编译了它。然后我也在其他 Linux 发行版上成功执行了二进制文件。

一段时间后,我想在其他系统上编译相同的应用程序(初级 OS)。我克隆了存储库,在项目目录中称为 stack setup,然后是 stack build。它抱怨缺少一些依赖项,所以我安装了它们,最后,我从 GHC 收到了关于我自己的代码的错误:

Not in scope: 'GTK.popoverPopdown'
Perhaps you meant one of these:
  'GTK.popoverModal' (imported from GI.Gtk)
  'GTK.popoverPosition' (imported from GI.Gtk)
Module 'GI.Gtk' does not export 'popoverPopdown'.

为什么?当我查看文档 (https://hackage.haskell.org/package/gi-gtk-3.0.17/docs/GI-Gtk-Objects-Popover.html) 时,有 popoverPopdown 但没有 popoverModalpopoverPosition.

然后我切换到另一台装有另一个 Linux 发行版的机器 (Ubuntu Studio) 并得到了同样的错误。最后我拿了一台装有 Fedora 27 的机器,做了同样的事情并得到了另一个错误(也在我的应用程序代码中):

Couldn't match expected type 'Maybe b1'
            with actual type 'GTK.Image'
In the second argument of 'GTK.buttonSetImage', namely 'icon'
In a stmt of a 'do' block: btn `GTK.buttonSetImage` icon

文档 (https://hackage.haskell.org/package/gi-gtk-3.0.17/docs/GI-Gtk-Objects-Button.html#g:26) 再次声称与 GHC 有所不同。有人能给我解释一下这是怎么回事吗?

回答其中一条评论: 以下是上述系统中安装的 GTK 版本。尽管如此,GHC 抱怨 Haskell 代码,我认为所有 Haskell 代码都是从 Stackage 下载的。在 stack build 期间,我的系统是否在本地生成任何依赖项?

好的,现在我可以看到(与我之前的想法相反)Haskell-GTK 绑定 在构建 gi-gtk 期间在我的计算机上生成的包裹。事实上在 GTK v3.18 中没有像 gtk_popover_popdown 这样的东西,这就是为什么根本没有生成 Haskell 函数 popoverPopdown 的原因。我猜它与 gtk_button_set_image.

类似

现在我需要记住这个 Stackage/Hackage 包是 另一种 。我必须跟踪我正在构建我的应用程序的 GTK 的精确版本,而不是依赖 stack 在这件事上。