如何使用Shake FilePatterns来缩小JS和CSS文件?

时间:2014-03-29 18:44:06

标签: javascript css haskell minify shake-build-system

.js.css文件缩小的常见做法是创建.min.js.min.css文件。问题是Shake FilePatterns将使用此方案与缩小和非缩小文件匹配,格式为//*.jsdocs似乎建议为每个reg.jsmin.js制作唯一的附加信息,但我不确定这是我想要的路径。怎么能在Shake中解决这个问题?

编辑:问题在于使用getDirectoryFiles

js <- getDirectoryFiles "" ["//*.js"]
let jsMins = map (-<.> "min" <.> "js") js
need jsMins

"//*.min.js的目标工作正常但getDirectoryFiles "" ["//*.js"]开始获取生成的.min.js文件。

2 个答案:

答案 0 :(得分:2)

.js.min.js编写不同的生成规则有几种方法:

  1. 如果您没有生成.js.css个文件,只使用现有的源文件,因此不需要//*.js个规则,那么只需进行最小化模式为//*.min.js,它将起作用。

  2. 如果要生成.js(例如来自CoffeeScript文件),那么如果要在不同目录中生成.min.js.js文件,则可以区分等级,例如dist/*.min.jsdecafinate/*.js

  3. 使用?>模式,例如:

    (\x -> takeExtensions x == ".js") ?> \out -> ...

    请注意,takeExtensions(尾随s)只会匹配完整扩展名为.js的文件,因此不会与myfile/test.min.js匹配。

  4. 如果解决方案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文件时才会更改。