haskell - 如何使用Shake执行sh命令

标签 haskell shake-build-system

我正在尝试将现有的 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 命令并重定向其输出?

最佳答案

从您可能想要的转换开始:

cmd Shell "ls >" out

参数 Shell 告诉 Shake 使用系统 shell,这意味着重定向有效。稍后您可能希望切换到:

Stdout result <- cmd "ls"
writeFile' out result

现在您不再调用 shell,而是使用 Shake 捕获输出。一段时间后,您可能希望切换到:

getDirectoryFiles "." ["*"]

这是通过 Shake 跟踪获取文件列表的方式。

关于haskell - 如何使用Shake执行sh命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24891061/

相关文章:

javascript - Shake FilePatterns 如何用于缩小 JS 和 CSS 文件?

haskell - 摇一摇: Signal whether anything had to be rebuilt at all

scala - 一步一步/深入解释 : The Power of (Co)Yoneda (preferably in scala) through Coroutines

haskell - 对 Maybe a 进行约束,其中 Eq a

haskell - 如何使用 Shake 编译 Haskell 程序

haskell - 如何在 Shake 中定义定时器规则

Haskell 函数转换为类型

unit-testing - 单元测试功能数据结构的几种实现,无需重复代码

haskell - 用join而不是bind表示的Monad法则?

haskell - 摇一摇: how do I depend on dynamically generated source files?