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

时间:2014-10-20 20:06:38

标签: 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,因为没有规则正式定义如何。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

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

我的第一个想法是让你的“test-bins-x86”变得虚假,并且让need特定的可执行文件而不是need的所有操作都是虚假的。这可能会有效,除非你需要每次摇动构建运行多次调用VS构建系统。

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

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

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

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