如何使用TemplateHaskell';是否在与正在编译的文件相关的文件上添加addDependentFile?

如何使用TemplateHaskell';是否在与正在编译的文件相关的文件上添加addDependentFile?,haskell,template-haskell,Haskell,Template Haskell,我希望在更改文件时重新计算使用IO并依赖于文件MyDependency.txt的TemplateHaskell表达式 因此,我使用addDependentFile“MyDependency.txt”告诉ghc在编译代码时检查该文件是否有修改 不幸的是,这不起作用,因为addDependentFile仅相对于调用ghc的目录起作用 如何使用它来依赖于我正在编译的文件旁边的文件(与我正在编译的文件位于同一目录中?您可以使用Language.Haskell.TH.Syntax中的位置来提取正在编译的文

我希望在更改文件时重新计算使用IO并依赖于文件
MyDependency.txt
的TemplateHaskell表达式

因此,我使用
addDependentFile“MyDependency.txt”
告诉ghc在编译代码时检查该文件是否有修改

不幸的是,这不起作用,因为
addDependentFile
仅相对于调用ghc的目录起作用


如何使用它来依赖于我正在编译的文件旁边的文件(与我正在编译的文件位于同一目录中?

您可以使用
Language.Haskell.TH.Syntax
中的
位置
来提取正在编译的文件的文件名,并使用它来组合正确的路径:

-- | Uses 'addDependentFile' on a file relative to the current file
-- to mark it as being checked for changes when compiled with TemplateHaskell.
--
-- Returns an empty list of declarations so that it can be used with:
--
-- >$(addDependentFileRelative "MyDependency.txt")
addDependentFileRelative :: FilePath -> Q [Dec]
addDependentFileRelative relativeFile = do
    currentFilename <- loc_filename <$> location
    pwd             <- runIO getCurrentDirectory

    let invocationRelativePath = takeDirectory (pwd </> currentFilename) </> relativeFile

    addDependentFile invocationRelativePath

    return []
——|对相对于当前文件的文件使用“addDependentFile”
--在使用TemplateHaskell编译时将其标记为正在检查更改。
--
--返回声明的空列表,以便与以下内容一起使用:
--
-->$(addDependentFileRelative“MyDependency.txt”)
addDependentFileRelative::FilePath->Q[Dec]
addDependentFileRelative relativeFile=do
当前文件名