(getDirectoryFiles "" (dir </> "//*.c")) 实际上会匹配什么?

What will (getDirectoryFiles "" (dir </> "//*.c")) actually match?

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

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" 到底做了什么?

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

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

这意味着使用 </> 来创建 // 值几乎从来都不是正确的做法。 <//> 解决了这个问题,但正如您所注意到的,它是不可预测的,而且非常讨厌。

解决方案是使用 foo/**/*.c 作为 foo//*.c 的替代模式。第一种形式的优点是它是完全可预测的并且与 </> 一起工作得很好,消除了对 <//> 的需要。由于 Shake 0.15.6 是一个允许的替代品,在 Shake 0.16 中它可能会被推荐超过 //.

关于您的其他问题:1) 对于 Windows,您可以在模式值中互换使用 /\,因此直接写 foo//*.c 就可以了. 2) foo///*.c等同于foo//*.c,在Shake中有大量针对此类表单的测试套件。