函数want
和need
都要求输入的类型为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
,因此无效。
这个问题的正确解决方案是什么?
答案 0 :(得分:2)
Action
,getDirectoryFiles
返回的内容,似乎是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)