最初に言及することはgetDirectoryFiles
、同じ引数で複数回呼び出した場合need
、同じファイルで複数回呼び出した場合に 1 回しかビルドされないのと同じように、1 回だけ計算されるということです。1つのアプローチは次のとおりです。
"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
関数を使用できます。実際には、どちらも問題になる可能性は低く、ファイルを使用するのがおそらく最も簡単です。