在Shake规则中恢复源文件名

时间:2014-07-19 19:49:57

标签: haskell shake-build-system

我正在为静态网站编写一个构建系统,其工作原理如下:

  • 为每个文件src/123-some-title.txt生成一个文件out/123.html

我的问题是,在为out/*.html编写规则时,我无法直接从目标文件名(src/123-some-title.txt)恢复源文件名(out/123.html)。

当然,我可以再次阅读src/目录并搜索以123开头的文件,但是有更好的方法可以使用Shake吗?

1 个答案:

答案 0 :(得分:1)

首先要提到的是,如果您使用相同的参数多次调用getDirectoryFiles,它将只计算一次,就像您在同一文件上多次调用need一样只会建一次。一种方法是:

"out/*.fwd" *> \out -> do
    res <- getDirectoryFiles "src" ["*.txt"]
    let match = [(takeBaseName out ++ "-") `isPrefixOf` takeBaseName x  | x <- res]
    when (length match /= 1) $ error "fail, because wrong number of matches"
    writeFileChanged out $ head match

"out/*.html" *> \out -> do
    src <- readFile' (out -<.> "fwd")
    txt <- readFile' ("src" </> src)
    ...

这里的想法是文件out/123.txt包含内容123-some-title.txt。通过使用writeFileChanged,我们只会在目录的相关部分发生更改时更改.fwd文件。

如果要避免使用.fwd文件,可以使用Oracle机制。如果您想避免对getDirectoryFiles结果进行线性扫描,可以使用newCache函数。在实践中,两者都不可能有问题,并且使用文件可能是最简单的。