如果我有针对目标文件的通用构建规则,*.o
但针对目标文件有更具体的构建规则foo.o
,那么定义顺序是否重要?
问问题
35 次
1 回答
1
如%>
操作员文档中所述:
没有通配符的模式比有通配符的模式具有更高的优先级,并且系统所需的任何文件都不能与多个具有相同优先级的模式匹配(请参阅
priority
和alternatives
修改此行为)。
所以定义顺序无关紧要,但文件不能以相同的优先级匹配多个规则。
因此,在 and 的情况下*.o
,foo.o
它会很好。这是一个示例(使用foo.txt
and *.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 回答