我尝试将现有的makefile迁移到Shake,到目前为止,我已经尝试了以下内容(只需创建一个包含目录内容的文件)
module Main where
import Development.Shake
main :: IO ()
main = shakeArgs shakeOptions{shakeFiles="_build"} $ do
let ls = "_build/ls.txt"
want [ls]
ls *> \out -> do
cmd "ls > " out
当我运行它时,我收到以下错误消息:
> runghc test.hs _build/ls.txt
# ls (for _build/ls.txt)
ls: >: No such file or directory
ls: _build/ls.txt: No such file or directory
Error when running Shake build system:
* _build/ls.txt
Development.Shake.cmd, system command failed
Command: ls > _build/ls.txt
Exit code: 1
Stderr:
ls: >: No such file or directory
ls: _build/ls.txt: No such file or directory
我做错了什么?如何执行sh
命令并重定向其输出?
答案 0 :(得分:12)
首先要进行转换:
cmd Shell "ls >" out
参数Shell
告诉Shake使用系统shell,这意味着重定向有效。稍后您可能希望切换到:
Stdout result <- cmd "ls"
writeFile' out result
现在你没有调用shell,而是使用Shake捕获输出。稍后,您可能希望切换到:
getDirectoryFiles "." ["*"]
获取文件列表的Shake跟踪方法是什么。