在Haskell摇一摇,我要文件模式怎么办?

In Haskell Shake, how can I want a file pattern?

我在源目录中有一个包含 xml 个文件的目录,我想将其转换为目标目录中包含 html 个文件的目录。似乎我可以使用 getDirectoryFiles 从目录中获取文件,但那是一个 Action,want 不需要 Action [FilePath] 而只需要 [FilePath]。我怎样才能在 Shake 中做类似 want ["dest/*.html"] 的事情?

getDirectoryFiles returns 是 Action monad 的结果,但是 want returns 是 Rules monad 的结果。您可能指的是 need,这与 want 基本相同,但在 Action 中。然后像使用任何其他 monad 一样使用 >>=do 块:

do
  directoryFiles <- getDirectoryFiles path patterns
  need directoryFiles

如果你想在那之后回到 Rules,然后将整个 do 块包装在对 action.

的调用中

如果我没理解错的话,你可以这样做。

首先,编写一个规则,从 xml.[= 创建 html 文件15=]

main = shakeArgs shakeOptions $ do
    "dest/*.html" %> \out -> do
        let src = "source" </> dropDirectory1 out -<.> "xml"
        -- todo: generate out (HTML) from src (XML)

然后您可以通过 action 编写一个规则,在每次构建执行中都将 运行。

main = shakeArgs shakeOptions $ do
    action $ do
        srcs <- getDirectoryFiles "source" ["*.xml"]
        need ["dest" </> src -<.> "html" | src <- srcs]

    "dest/*.html" %> \out -> do
        let src = "source" </> dropDirectory1 out -<.> "xml"
        -- todo: translate HTML(out) from XML(src)

供您参考,want 定义如下:want xs = action $ need xs