1

Shake 使用各种形式的匹配,文件路径对模式。有没有可以用来排除模式的?

示例:我有三个目录a, b, c(在 directory 中的某个位置x),每个目录都需要html文件。有一个规则

(dir <> "//*.html") %> \out -> do -- deal with a and b

它应该只处理目录 a 和 b 以及处理 c 中文件的类似规则。

有没有办法(可能使用?>)将两个规则分开

(\f -> "x" prefixOf f && not "x/c" prefixOf f) <> "//*.html")
(\f -> "x/x" prefixOf f ) <> "//*.html")

和其他类似?

推荐的使用方法在这里是不可能的,因为文件是用其他需要常规扩展名的程序处理xx.a.html的。xx.b.htmlhtml

或者

4

2 回答 2

2

规则:

pattern %> action

相当于:

(pattern ?==) ?> action

所以你可以写:

(\x -> "//*.html" ?== x && not ("c//*.html" ?== x) ?> action

匹配规则匹配//*.html,但不匹配c//*.html

更一般地说,根本不需要使用FilePattern ?==运算符,因此可以使用任意匹配的谓词来代替。

于 2019-03-06T22:31:41.113 回答
0

有了建议(尤其是关于 using 的提示**/*.html),我就可以正常工作了。路径bakedD是 of 的前缀,staticD第一条规则只处理bakedD不在的文件staticD,另一条只处理这些:

(\x -> ((bakedD <> "**/*.html") ?== x) 
     && not  ((staticD <> "**/*.html") ?== x)) ?> \out -> do
            let md =   doughD </>  (makeRelative bakedD $ out -<.> "md")
            runErr2action $ bakeOneFileFPs  md  doughD templatesD out

(staticD <> "**/*.html" ) %> \out -> do
        copyFileChanged (replaceDirectory out doughD) out

两条规则之间没有重叠。

我希望这对其他有相同类型问题的人有用。

于 2019-03-08T11:25:06.087 回答