什么(getDirectoryFiles“”(dir <!---->“//*.c”))实际匹配?

时间:2017-02-21 14:44:30

标签: shake-build-system

在使用这种匹配模式时,我遇到了不必要的重建:

getDirectoryFiles "" $ "foo" </> "//*.c"

我在Linux上,所以根据我的理解,第二个参数将评估为

"foo///*.c"

我认为用

替换它是不正确的
"foo" </> "/*.c"

因为这不适用于Windows?然而,在Linux上,这可以像我期望的那样工作。

从测试中我得出结论,模式匹配“foo”之外的文件,这在我的世界中毫无意义。例如,上面的模式将匹配一个目录结构中的testA.c和testB.c,如下所示。

foo/testA.c
bar/testB.c

我现在看到有一个<//>运算符,所以也许我应该使用"foo" <//> "*.c"而不是。这是非常讨厌的,"foo///*.c"实际上做了什么?

1 个答案:

答案 0 :(得分:1)

问题是</>运算符的定义是:

"foo" </> "//*.c" == "//*.c"

这意味着使用</>创建//值几乎不是正确的事情。 <//>解决了这个问题,但正如你所指出的那样,它不可预测且非常讨厌。

解决方案是使用foo/**/*.c作为foo//*.c的替代模式。第一种形式的优点是它完全可预测,并且与</>配合得很好,无需<//>。由于Shake 0.15.6已成为允许的替代方案,并且在Shake 0.16中,它可能会推荐超过//

关于您的其他问题:1)对于Windows,您可以在模式值中互换使用/\,因此从字面上写foo//*.c就好了。 2)foo///*.c相当于foo//*.c,并且Shake中有大量的此类表单测试套件。