使用依赖 pandoc-citeproc 在 Haskell 中构建一个独立的二进制可执行文件

问题描述

我正在尝试为用 Haskell 编写的 CLI 工具编译一个独立的可执行文件。我按照 this 示例,使用 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 文档中发现了以下这句话:

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

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

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

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

我试过了

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

无济于事。

解决方法

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

packages: ./*.cabal

package pandoc-citeproc
    flags: +embed_data_files

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