1

次のように機能する静的Webサイトのビルドシステムを作成しています。

  • すべてのファイルに対してファイルsrc/123-some-title.txtを生成しますout/123.html

私の問題は、ルールを作成するときに、ターゲット ファイル名out/*.html( ) からソース ファイル名 ( ) を復元する直接的な方法がないことです。src/123-some-title.txtout/123.html

もちろん、src/ディレクトリをもう一度読み込んで で始まるファイルを検索することもできます123が、シェイクでこれを行うより良い方法はありますか?

4

1 に答える 1

1

最初に言及することは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関数を使用できます。実際には、どちらも問題になる可能性は低く、ファイルを使用するのがおそらく最も簡単です。

于 2014-07-20T05:18:24.437 に答える