如何让cabal检测到非Haskell源文件的变更?
如何让cabal检测到非Haskell源文件的变更?
我太懂这种烦恼了——每次改完非Haskell文件就得跑cabal clean; cabal build全量重建,慢得让人跺脚!其实核心就是要让cabal和GHC意识到这些文件是构建过程的依赖项,下面给你两个实用的解决办法:
方法一:在Template Haskell代码里显式声明依赖
这是最精准的方式,能让GHC明确知道某个TH代码片段依赖了特定的非Haskell文件。你只需要在TH逻辑里调用Language.Haskell.TH.Syntax.addDependentFile函数,把读取的文件路径传进去就行。比如:import Language.Haskell.TH.Syntax (Q, addDependentFile) loadMyContent :: Q Exp loadMyContent = do -- 告诉GHC这个文件是当前模块的依赖 addDependentFile "configs/my-settings.yaml" -- 正常读取、解析文件的逻辑 content <- runIO $ readFile "configs/my-settings.yaml" [| parseMyConfig content |]这样一来,只要这个yaml文件有改动,只会重新编译对应的模块,不用整个项目从头建一遍。
方法二:在.cabal文件里配置
extra-source-files
如果你有一堆非Haskell文件要监控,直接在.cabal文件里批量配置更省心。可以在全局部分或者特定的target(比如library、executable)下添加这个字段,把需要追踪的文件列进去,还支持通配符:extra-source-files: configs/*.yaml templates/*.html data/*.csv这样cabal在构建时会自动检查这些文件的修改时间,一旦有变化就触发相关模块的重新编译。这种方式是全局层面的,虽然不如第一种精准胜在配置简单。
另外提一句,如果你用的是file-embed这类库,它的embedFile函数内部已经自动调用了addDependentFile,所以用这类工具的话,不用手动写依赖声明,cabal也能自动追踪文件变化。
备注:内容来源于stack exchange,提问作者GTF
相关产品推荐
相关产品推荐

