haskell - 使用 shake 为一组文件定义规则,在构建时未知

标签 haskell shake-build-system

我正在使用 Shake 开发一个复杂的构建脚本,但(目前)我正在使用 Visual Studio 解决方案来构建所有二进制文件。因此,我需要定义一个规则,在一次扫描中构建数十个文件。在完成之前我不知道构建输出是什么。

例如,我想编写这样的规则:

"test-bins-x86" ~> do
    vsBuild unitTestSln X86 Release -- produces dozens of outputs to .\x86\Release

"x86/Release/*.test-results" *> \out -> do
    let testExe = out -<.> exe
    need [testExe]
    Stdout results <- cmd testExe
    writeFile' out results

但是,就目前情况而言,*.test-results 的规则不知道如何构建 testExe,因为没有规则正式定义如何构建。我该如何解决这个问题?

最佳答案

我有两个可能的解决方案和评论。首先评论:如果你事先不知道构建的输出是什么,你怎么知道 testExe 会存在?如果没有,你该怎么办?是否存在您可以假设始终构建的可执行文件子集?它是否依赖于可能存在的其他文件或环境?

我的第一个想法是让你的“test-bins-x86”成为一个假的,并且让每个需要特定可执行文件的操作都需要那个假的。这可能会起作用,除非您需要在每次摇动构建运行时多次调用 VS 构建系统。

另一种方法可能是使用 FilePattern%>,如下所示:

"x86/Release/*" %> \ _ -> need ["test-bins-x86"]

如果需要,可以对此进行扩展,此外,您可以检查可执行文件是否实际上是通过此规则生成的,如果不是,则执行其他操作。

如果可以提前确定构建输出是什么,我建议您使用 &%>,但如果该信息不可用,您就无法使用该运算符。

关于haskell - 使用 shake 为一组文件定义规则,在构建时未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26473969/

相关文章:

haskell - 奇怪的 Haskell 行为 : misplaced error in record syntax?

haskell - 瓦德勒的论文 : How is a tuple a function?

haskell - 如何在没有堆栈的情况下运行 shake

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

haskell - Shake 可以跟踪构建命令使用的线程数(这些命令本身是并行的)吗?

haskell - 了解秒差距类型注释

haskell - 是否有 (return a) >>= b 的标准 Haskell 函数?

haskell - 我可以为 IO Monad 取 "snapshots"吗?

haskell - 如何检查运行抖动是否会重建目标(而不实际尝试构建它)?

haskell - 在 Shake 函数 `FilePattern` 和 `want` 中使用 `need`/通配符