3

.js文件缩小的常见做法.css是创建.min.js文件.min.css。问题是Shake FilePatterns将使用此方案匹配缩小和非缩小文件,其模式类似于//*.js. 文档似乎建议为每个喜欢制作独特的扩展,reg.jsmin.js我不确定这是我想走的路。如何在 Shake 中解决这个问题?

编辑:问题在于使用getDirectoryFiles

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

有一个目标可以"//*.min.js正常工作,但getDirectoryFiles "" ["//*.js"]开始拾取生成的.min.js文件。

4

2 回答 2

2

有几种方法可以为.jsvs编写不同的生成规则.min.js

  1. 如果您从不生成.js文件.css,只使用现有的源文件,因此不需要//*.js规则,那么只需将您的最小化模式设置为即可//*.min.js

  2. 如果您正在生成.js(例如从 CoffeeScript 文件),那么如果您正在不同目录中生成.min.js.js文件,您可以区分该级别的模式,dist/*.min.js例如decafinate/*.js.

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

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

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

如果解决方案 1 有效,请使用它(这是最简单的)。如果解决方案 2 自然而然地失败(例如,它与您想要做的事情相匹配),那么拥有更多限制性模式可能会更容易,但选项 3 在任何地方都“正常工作”,所以我可能会这样做。

请注意,它p *> a被定义为(p ?==) ?> a(加上大量额外的管道以获得良好的错误消息!),所以?>没有什么特别的,并且可以与您现有的规则一起愉快地工作。我通常会发现大约 5-10% 的规则使用?>模式。

于 2014-03-29T19:41:12.593 回答
2

我可以想到两种替代方法:

后期处理getDirectoryContents

调用getDirectoryContents然后过滤掉您不关心的值。就像是:

xs <- getDirectoryFiles "" ["//*.js"]
need [x -<.> "min.js" | x <- xs, takeExtensions x == ".js"]

如果您在规则之外运行此代码,例如在 an 中action,那么它是 100% 正确的。如果您在规则中运行代码,则该规则将运行一次,新文件将出现,然后该规则将再次运行(这也是 lint 违规,不是很好的构建卫生)。我怀疑您超出了规则范围,因此这种方法可能是一种不错的方法。

写一个甲骨文

如果您在规则内,您可以定义一个类似于 的 Oracle getDirectoryFiles,但会跳过min文件。

newtype JsFiles = JsFiles () deriving (Show,Typeable,Eq,Hashable,Binary,NFData)
addOracle $ \(JsFiles _) -> fmap (\x -> takeExtensions x == ".js") $ getDirectoryFiles "" ["//*.js"]

现在您可以askOracle $ JsFiles ()在您的规则中使用,它只会在min添加新的非文件时更改。

于 2014-03-30T18:53:56.307 回答