【发布时间】:2019-12-18 03:17:52
【问题描述】:
我在源目录中有一个 xml 文件目录,我想将其转换为目标目录中的 html 文件目录。看来我可以使用getDirectoryFiles 从目录中获取文件,但这是一个动作,而want 不需要Action [FilePath],而只需[FilePath]。我怎样才能在 Shake 中做类似want ["dest/*.html"] 的事情?
【问题讨论】:
我在源目录中有一个 xml 文件目录,我想将其转换为目标目录中的 html 文件目录。看来我可以使用getDirectoryFiles 从目录中获取文件,但这是一个动作,而want 不需要Action [FilePath],而只需[FilePath]。我怎样才能在 Shake 中做类似want ["dest/*.html"] 的事情?
【问题讨论】:
getDirectoryFiles 在Action monad 中返回结果,但want 在Rules monad 中返回结果。您可能指的是need,它与want 基本相同,但在Action 中。然后像使用任何其他 monad 一样使用 >>= 或 do 块:
do
directoryFiles <- getDirectoryFiles path patterns
need directoryFiles
如果您想在此之后返回 Rules,则将整个 do 块包装在对 action 的调用中。
【讨论】:
want 和 need 不能互换。 want 似乎是:“要求参数文件按规则构建,用于指定目标。”而need 声明该目标的依赖项。您能否将答案更改为最小工作示例,以显示如何将任意数量文件的目录转换为具有相同数量文件的另一个目录?
action 是您从Action 移动到Rules 的方式,而want 基本上只是action . need。
如果我理解正确,你可以这样做。
首先,编写一个从xml创建html文件的规则。
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。
【讨论】: