震动规则可以确定自上次构建以来哪些"需求"发生了变化吗?

mav*_*vnn 4 shake-build-system

我正在为一个大型Ruby(+其他东西)代码库构建一个基于摇动的构建系统,但我正在努力处理期望将文件列表传递给"构建"的Ruby命令.

拿Rubocop(一种linting工具).我可以看到三个选项:

  • 需要单独的所有Ruby文件; 如果他们改变了,对每个改变的文件改变单个文件运行rubocop(在第一次构建时非常慢或者因为rubocop有很大的启动时间而导致许多ruby文件发生变化)
  • 需要所有Ruby文件; 如果有任何更改,请对所有 ruby文件运行rubocop (如果只有一个或两个文件已更改,则速度非常慢,因为如果文件已更改,则rubocop运行缓慢)
  • 需要所有Ruby文件; 如果有任何更改,请通过rubocop传递Shake检测到的已更改依赖项列表

前两个规则很容易构建,但我的问题是我无法弄清楚如何将最后一个案例表示为一个动摇规则.有人可以帮忙吗?

Nei*_*ell 5

使用batch或使用Shake有两种方法needHasChanged.对于你的情况rubocop,如果存在lint违规,我假设只是错误,所以标准的一次一个规则是:

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

使用 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)
Run Code Online (Sandbox Code Playgroud)

使用 needHasChanged

该函数needHasChanged将自身描述为:

喜欢need但返回重建依赖项列表,因为调用规则最后成功构建.

所以你会写:

 "stamp.lint" *> \out -> do
     changed <- needHasChanged listOfAllRubyFiles
     cmd_ "rubocop" changed
     writeFile' out ""
Run Code Online (Sandbox Code Playgroud)

对照

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