.js
和.css
文件缩小的常见做法是创建.min.js
和.min.css
文件。问题是Shake FilePatterns将使用此方案与缩小和非缩小文件匹配,格式为//*.js
。 docs似乎建议为每个reg.js
和min.js
制作唯一的附加信息,但我不确定这是我想要的路径。怎么能在Shake中解决这个问题?
编辑:问题在于使用getDirectoryFiles
:
js <- getDirectoryFiles "" ["//*.js"]
let jsMins = map (-<.> "min" <.> "js") js
need jsMins
"//*.min.js
的目标工作正常但getDirectoryFiles "" ["//*.js"]
开始获取生成的.min.js
文件。
答案 0 :(得分:2)
为.js
与.min.js
编写不同的生成规则有几种方法:
如果您没有生成.js
或.css
个文件,只使用现有的源文件,因此不需要//*.js
个规则,那么只需进行最小化模式为//*.min.js
,它将起作用。
如果要生成.js
(例如来自CoffeeScript文件),那么如果要在不同目录中生成.min.js
和.js
文件,则可以区分等级,例如dist/*.min.js
,decafinate/*.js
。
使用?>
模式,例如:
(\x -> takeExtensions x == ".js") ?> \out -> ...
请注意,takeExtensions
(尾随s
)只会匹配完整扩展名为.js
的文件,因此不会与myfile/test.min.js
匹配。
如果解决方案1有效,请使用它(这是最简单的)。如果解决方案2自然失效(例如,那与你想要做的事情相匹配),那么可以更容易地拥有更多限制性模式,但是选项3“只适用于”所有地方,所以可能就是我要做的。
请注意,p *> a
定义为(p ?==) ?> a
(加上大量额外的管道以获取良好的错误消息!),因此?>
并不特别,并且可以很好地使用现有规则。我通常会发现约有5-10%的规则使用?>
模式。
答案 1 :(得分:2)
我可以想到两种替代方法:
发布流程getDirectoryContents
致电getDirectoryContents
,然后过滤掉您不关心的值。类似的东西:
xs <- getDirectoryFiles "" ["//*.js"]
need [x -<.> "min.js" | x <- xs, takeExtensions x == ".js"]
如果您在规则之外运行此代码,例如在action
中,它是100%正确的。如果您在规则中运行代码,则规则将运行一次,将出现新文件,然后规则将再次运行(这也是一个lint违规,而不是很好的构建hygine)。我怀疑你是在规则之外运行,所以这种方法可能很好。
撰写Oracle
如果您在规则范围内,则可以定义类似于getDirectoryFiles
的Oracle,但会跳过min
个文件。
newtype JsFiles = JsFiles () deriving (Show,Typeable,Eq,Hashable,Binary,NFData)
addOracle $ \(JsFiles _) -> fmap (\x -> takeExtensions x == ".js") $ getDirectoryFiles "" ["//*.js"]
现在,您可以在规则中使用askOracle $ JsFiles ()
,只有在添加新的非min
文件时才会更改。