1

我正在为一个静态网站编写一个构建系统,它的工作方式如下:

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

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

当然,我可以src/再次读取目录并搜索以 开头的文件123,但是有没有更好的方法来使用 Shake 来做到这一点?

4

1 回答 1

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函数。在实践中,两者都不太可能有问题,使用文件可能是最简单的。

于 2014-07-20T05:18:24.437 回答