在使用这种匹配模式时,我遇到了不必要的重建:
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"
实际上做了什么?
答案 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中有大量的此类表单测试套件。