我正在为一个静态网站编写一个构建系统,它的工作方式如下:
- 为每个文件
src/123-some-title.txt
生成一个文件out/123.html
我的问题是,在编写规则时,out/*.html
我没有直接的方法可以src/123-some-title.txt
从目标文件名 () 中恢复源文件名 ( out/123.html
)。
当然,我可以src/
再次读取目录并搜索以 开头的文件123
,但是有没有更好的方法来使用 Shake 来做到这一点?
我正在为一个静态网站编写一个构建系统,它的工作方式如下:
src/123-some-title.txt
生成一个文件out/123.html
我的问题是,在编写规则时,out/*.html
我没有直接的方法可以src/123-some-title.txt
从目标文件名 () 中恢复源文件名 ( out/123.html
)。
当然,我可以src/
再次读取目录并搜索以 开头的文件123
,但是有没有更好的方法来使用 Shake 来做到这一点?
首先要提到的是,如果您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
函数。在实践中,两者都不太可能有问题,使用文件可能是最简单的。