我正在为静态网站编写一个构建系统,其工作原理如下:
src/123-some-title.txt
生成一个文件out/123.html
我的问题是,在为out/*.html
编写规则时,我无法直接从目标文件名(src/123-some-title.txt
)恢复源文件名(out/123.html
)。
当然,我可以再次阅读src/
目录并搜索以123
开头的文件,但是有更好的方法可以使用Shake吗?
答案 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
函数。在实践中,两者都不可能有问题,并且使用文件可能是最简单的。