2017-02-21 39 views
1

我遇到不必要的重建,而使用这种匹配模式:什么将(getDirectoryFiles“”(dir</>“//*.c”))实际匹配?

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

的问题是,</>运营商已定义,以便:

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

这意味着,使用</>创建//价值几乎从来没有做正确的事。 <//>解决了这个问题,但正如你所注意的那样,这不是可预测的,而且相当恶劣。

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

至于其他问题:1)对于Windows,您可以在模式值中互换使用/\,所以编写foo//*.c就好了。 2)foo///*.c相当于foo//*.c,并且在Shake中有这种形式的广泛的测试套件。

+0

谢谢,很好的解释! ''和'“//”'的不幸组合。它让我很高兴它将在0.16中被替换。在0.15.11中,文档中提到“目前认为是实验性的”,这导致我甚至没有对它进行测试。 – nesqi