5

我正在为大型 Rub​​y(+ 其他东西)代码库构建一个基于抖动的构建系统,但我正在努力处理期望传递文件列表以“构建”的 Ruby 命令。

以 Rubocop(一种 linting 工具)为例。我可以看到三个选项:

  • 单独需要所有 Ruby 文件;如果它们发生更改,请针对每个更改的文件运行 rubocop
  • 需要所有 Ruby 文件;如果有任何更改,请对所有ruby​​ 文件运行 rubocop (如果只有一个或两个文件已更改,则非常慢,因为如果文件已更改,rubocop 计算速度很慢)
  • 需要所有 Ruby 文件;如果有任何更改,请将 Shake 检测到的更改依赖项列表传递给 rubocop

前两个规则在抖动中构建起来很简单,但我的问题是我无法弄清楚如何将最后一种情况表示为抖动规则。任何人都可以帮忙吗?

4

1 回答 1

5

有两种使用 Shake 的方法,使用batchor needHasChangedrubocop对于您的情况,如果存在 lint 违规,我假设只是错误,因此标准的一次一个规则将是:

"*.rb-lint" %> \out -> do
    need [out -<.> "rb"]
    cmd_ "rubocop" (out -<.> "rb")
    writeFile' out ""

利用batch

该函数batch将自身描述为:

当一个命令的启动成本很高时很有用——例如apt-get install foo bar baz比三个单独的调用便宜很多apt-get install

代码大致是:

batch 3 ("*.rb-lint-errors" %>)
    (\out -> do need [out -<.> "rb"]; return out) $
    (\outs -> do cmd_ "rubocop" [out -<.> "rb" | out <- outs]
                 mapM_ (flip writeFile' "") pits)

利用needHasChanged

该函数needHasChanged将自身描述为:

Likeneed但返回自上次成功构建调用规则以来重建的依赖项列表。

所以你会写:

 "stamp.lint" *> \out -> do
     changed <- needHasChanged listOfAllRubyFiles
     cmd_ "rubocop" changed
     writeFile' out ""

比较

的优点batch是它能够并行运行多个批次,并且您可以设置批次数量的上限。相比之下needHasChanged更简单但非常实用。对于很多问题,两者都是合理的解决方案。这两个功能都是最近添加到 Shake 的,因此请确保您使用的是 0.17.2 或更高版本,以确保它具有所有必要的错误修复。

于 2018-12-05T12:50:25.763 回答