1

如果我有针对目标文件的通用构建规则,*.o但针对目标文件有更具体的构建规则foo.o,那么定义顺序是否重要?

4

1 回答 1

1

%>操作员文档中所述:

没有通配符的模式比有通配符的模式具有更高的优先级,并且系统所需的任何文件都不能与多个具有相同优先级的模式匹配(请参阅priorityalternatives修改此行为)。

所以定义顺序无关紧要,但文件不能以相同的优先级匹配多个规则。

因此,在 and 的情况下*.ofoo.o它会很好。这是一个示例(使用foo.txtand *.txt):

import Development.Shake

main = shakeArgs shakeOptions $ do
    want ["foo.txt", "bar.txt"]
    "foo.txt" %> \out -> writeFile' out "foo"
    "*.txt"   %> \out -> writeFile' out "anything"

对比

import Development.Shake

main = shakeArgs shakeOptions $ do
    want ["foo.txt", "bar.txt"]
    "*.txt"   %> \out -> writeFile' out "anything"
    "foo.txt" %> \out -> writeFile' out "foo"

在这两种情况下foo.txt都将包含“foo”bar.txt并将包含“anything”,因为“foo.txt”的定义不包含任何通配符。


或者,如果你使用定义顺序,你可以使用alternatives使用“first-wins”匹配语义的函数:

alternatives $ do
    "hello.*" %> \out -> writeFile' out "hello.*"
    "*.txt" %> \out -> writeFile' out "*.txt"

hello.txt将匹配第一条规则,因为它是之前定义的。

最后,您可以使用函数直接分配规则的优先级priority

priority 4 $ "hello.*" %> \out -> writeFile' out "hello.*"
priority 8 $ "*.txt" %> \out -> writeFile' out "*.txt"

hello.txt将匹配第二条规则,因为它具有更高的优先级。

于 2019-08-09T10:01:56.653 回答