TemplateHaskell 的 addDependentFile 当文件不存在时不起作用

问题描述 投票:0回答:1

我希望在依赖文件更改时重新编译 TemplateHaskell 表达式,并且如果它不存在,请使用后备文件。但是一旦创建了依赖文件,我也想重新编译。

以下是示例代码:

import Control.Monad.Cont (MonadIO (liftIO))
import Language.Haskell.TH.Syntax (Lift (liftTyped))
import Language.Haskell.TH.Syntax.Compat (SpliceQ, liftSplice)
import System.Directory (doesFileExist)


myFn :: SpliceQ String
myFn = 
   let filePath = "...."
       fallbackPath = "...."
   in do
      liftSplice (addDependentFile filePath >>= liftTyped)
      exists <- liftIO (doesFileExist filePath)
      let path = if exists then filePath else fallbackPath
      ... -- Then e.g. simply load the file using `path` and return contents

问题是,如果文件不存在,

addDependentFile
就会失败。如果我仅在
addDependentFile
exists
时运行
True
,一旦创建文件,它就不会重新编译。

如何实现这一目标? (如果无法实现,我也有一个解决方法 - 即一旦依赖文件不存在并且使用后备,则每次都重新编译。至少可以这样做吗?)

haskell template-haskell
1个回答
0
投票

由于 Template Haskell 只能将静态文件注册为依赖项,因此您可能需要使用

Setup.hs
挂钩将构建系统配置为上一级,如文档中所述:Cabal 用户指南:更复杂的包

© www.soinside.com 2019 - 2024. All rights reserved.