4

我正在尝试为用 Haskell 编写的 CLI 工具编译一个独立的可执行文件。我按照这个示例使用 Cabal v3.2 和 ghc v8.10.3 使用 Github Actions 为不同的操作系统自动构建可执行文件。

这似乎运行良好,并且可执行文件在表面上确实起作用,但是当实际应用于数据时,我收到以下 Linux 版本的错误消息(我没有测试 Windows 版本,但一位同事确认 MacOS 版本有同样的问题):

myprogram-0.3.2-Linux-ghc-8.10.3: 
/home/runner/.cabal/store/ghc-8.10.3/pandoc-citeproc-0.17.0.2-
0607b6a3d51d41b0211d235af7fcf6eeb452dc6738775583dac1146860db61b1/
share/locales/locales-en-US.xml: openBinaryFile: does not exist (No such file or directory)

这告诉我,我依赖于 BibTeX 文件解析的 pandoc-citeproc 有一些额外的数据文件没有被打包到可执行文件中。事实上,我在 cabal-install 文档中找到了以下句子:

请注意,复制的可执行文件不是独立的,因为它们可能使用存储中的数据文件。来源

我也确实阅读了 pandoc 文档,它可以以一种已经包含这些额外文件的方式构建。

可以编译 pandoc,使 pandoc 使用的数据文件嵌入到二进制文件中。生成的二进制文件可以从任何目录运行,并且是完全独立的。使用 cabal,将 -fembed_data_files 添加到 cabal 配置或 cabal 安装命令。对于堆栈,使用 --flag pandoc:embed_data_files。来源

如何构建可执行文件cabal install以防止出现上述错误消息?我希望这是可能的,而且我不会在这里遗漏一些重要的东西。

我试过

cabal install exe:myprogram --install-method=copy --overwrite-policy=always -fembed_data_files

无济于事。

4

1 回答 1

1

在命令中添加embed_data_files标志cabal install exe:myprogram将不起作用,因为 cabal-install 会将其传递给您的可执行文件,而不是将其转发给pandoc-citeproc。设置它最方便的方法是通过cabal.project文件. 如果您没有,请使用以下最少内容创建它:

packages: ./*.cabal

package pandoc-citeproc
    flags: +embed_data_files

cabal-install 将在您下次请求构建时使用标志重新编译pandoc-citeproc依赖项。

于 2021-02-08T01:02:07.663 回答