0

我正在使用 Shake 构建 lilypond 文件,然后将其放入网页中。我试图模仿手册中Build.hs第一个示例

import Development.Shake
import Development.Shake.Command
import Development.Shake.FilePath
import Development.Shake.Util

dest = "www/static"

main :: IO ()
main = shakeArgs shakeOptions{shakeFiles="_build"} $ do
  want ["www/index.html"]

  phony "clean" $ do
    putNormal "Cleaning files"
    removeFilesAfter dest ["//*"]

  "www/index.html" %> \out -> do
    fs <- getDirectoryFiles "src/lilypond" ["*.ly"]
    let pdfs = ["www/static" </> (takeBaseName sourceFile) -<.> "pdf" | sourceFile <- fs]
    need pdfs

    cmd_ "cp" "src/www/index.html" "www/index.html"

  dest <> "//*.pdf" %> \outp -> do
    let c = "src/lilypond" </> (dropDirectory1 . dropDirectory1 $ outp -<.> "ly")
    let o = dropExtension outp
    cmd_ "lilypond" "-o" [o] [c]

预期的行为是“构建 index.html 文件,所有 PDF 都应www/static从各自的src/lilypond/*.ly文件生成”。这适用于干净的构建,但编辑源.ly文件不会触发重建,我不知道为什么。(更新:编辑src/www/index.html也不会触发重建)

我尝试过的事情:

  • 通过诸如shake-build www/static/muppets.pdf. 相同的行为。
  • 生成一个--profile. 这里没有什么让我感到兴奋的。
  • 详细输出。不知道在这里寻找什么,所以怀疑 PDF 规则实际上并不取决于.ly文件?在输出中看到depends = [],预计非空。
  • need [c]在 PDF 规则中明确。

我觉得这里有一个我错过的基本概念:/

完整的项目在这里。

4

1 回答 1

1

您错过了对need [c]之前的呼叫cmd_ "lilypond" ...。这将导致它添加必要的依赖项 - 作为一般的经验法则,在调用之前cmd,您调用need它将使用的所有东西。

于 2019-08-19T06:33:00.953 回答