在Shake函数`want`和`need`中使用`FilePattern` / wildcards

时间:2015-10-28 11:30:29

标签: haskell shake-build-system

函数wantneed都要求输入的类型为FilePath,而不是FilePattern。输出和输入的文件名遵循不同的模式,输出为_build/*checker.sh,输入为./*.py。因此,我宁愿做want形式:

want ['_build/*checkers.sh']

大于

want ['_build/dbchecker.sh', '_build/henk_checker.sh', ..., '_build/derp_checker.sh']

我尝试通过合并want来构建更复杂的getDirectoryFiles, action, need,但由于getDirectoryFiles返回Action [FilePath]而不是FilePath,因此无效。

这个问题的正确解决方案是什么?

2 个答案:

答案 0 :(得分:2)

<{> ActiongetDirectoryFiles返回的内容,似乎是Monad,因此您可以使用do - 表示法:

do
  paths <- getDirectoryFiles "" ["_build//*checkers.sh"]
  want paths

或只是

getDirectoryFiles "" ["_build//*checkers.sh"] >>= want

want =<< getDirectoryFiles "" ["_build//*checkers.sh"]    

编辑:根据Neil Mitchell的评论,want需要替换为need

答案 1 :(得分:1)

Erik关于Action成为monad的评论已被证明非常有用。问题是行动已经存在于Rules monad中 - 而不是相反(对不起Eric,因为不够具体)。以下代码是我最终解决的问题。

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

main :: IO ()
main = shakeArgs shakeOptions{shakeFiles="_build"} (do
  action $ do dependencies <- getDirectoryFiles "" ["*checker.py"]
              let scripts = map (\file -> "_build" </> file -<.> "sh") dependencies
              need scripts)