为什么使用 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
但没有 popoverModal
或 popoverPosition
.
然后我切换到另一台装有另一个 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
期间,我的系统是否在本地生成任何依赖项?
- Ubuntu Studio 16.04 LTS:libgtk2.0-0 v2.24.30、libgtk-3-0 v3.18.9
- 初级OS:libgtk2.0-0 v2.24.30,libgtk-3-0 v3.18.9
- Fedora 26:gtk2 v2.24.31、gtk3 v3.22.21
- Fedora 27:gtk2 v2.24.32、gtk3 v3.22.26
好的,现在我可以看到(与我之前的想法相反)Haskell-GTK 绑定 是 在构建 gi-gtk
期间在我的计算机上生成的包裹。事实上在 GTK v3.18 中没有像 gtk_popover_popdown
这样的东西,这就是为什么根本没有生成 Haskell 函数 popoverPopdown
的原因。我猜它与 gtk_button_set_image
.
类似
现在我需要记住这个 Stackage/Hackage 包是 另一种 。我必须跟踪我正在构建我的应用程序的 GTK 的精确版本,而不是依赖 stack
在这件事上。
我在 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
但没有 popoverModal
或 popoverPosition
.
然后我切换到另一台装有另一个 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
期间,我的系统是否在本地生成任何依赖项?
- Ubuntu Studio 16.04 LTS:libgtk2.0-0 v2.24.30、libgtk-3-0 v3.18.9
- 初级OS:libgtk2.0-0 v2.24.30,libgtk-3-0 v3.18.9
- Fedora 26:gtk2 v2.24.31、gtk3 v3.22.21
- Fedora 27:gtk2 v2.24.32、gtk3 v3.22.26
好的,现在我可以看到(与我之前的想法相反)Haskell-GTK 绑定 是 在构建 gi-gtk
期间在我的计算机上生成的包裹。事实上在 GTK v3.18 中没有像 gtk_popover_popdown
这样的东西,这就是为什么根本没有生成 Haskell 函数 popoverPopdown
的原因。我猜它与 gtk_button_set_image
.
现在我需要记住这个 Stackage/Hackage 包是 另一种 。我必须跟踪我正在构建我的应用程序的 GTK 的精确版本,而不是依赖 stack
在这件事上。