让 Cabal 了解外部 TemplateHaskell 依赖项

Making Cabal Aware of External TemplateHaskell Dependencies

要在构建中嵌入一些静态文件,我正在使用:https://hackage.haskell.org/package/file-embed-0.0.10.1/docs/Data-FileEmbed.html

它允许你做:

MyFile.hs

myFile :: Data.ByteString.ByteString
myFile = $(embedFile "something/external.txt")

将文件嵌入到生成的二进制文件中。

然而,一件令人讨厌的事情是 cabal 不知道使用 embedFile 的文件取决于它加载的文件(因此更改为 something/external.txt 不会导致 MyFile 将在构建时重新构建)。

有什么办法可以告诉 cabal 这种依赖关系吗?我现在唯一的解决方案是 touch Haskell 文件以使其重新编译,但这很乏味。

addDependentFile 是模板 Haskell 的一部分。它告诉 ghc 在依赖计算中使用该文件——甚至不需要 cabal。

embedFile 应该这样调用。它不是的事实让我对图书馆产生了怀疑。不过,您可以创建一个如下所示的助手:

embed :: FilePath -> Q Exp
embed p = addDependentFile p >> embedFile p

请注意 TH 的暂存限制,并将其放入不使用它的文件中。