mav*_*vnn 4 shake-build-system
我正在为一个大型Ruby(+其他东西)代码库构建一个基于摇动的构建系统,但我正在努力处理期望将文件列表传递给"构建"的Ruby命令.
拿Rubocop(一种linting工具).我可以看到三个选项:
前两个规则很容易构建,但我的问题是我无法弄清楚如何将最后一个案例表示为一个动摇规则.有人可以帮忙吗?
使用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或更高版本,以确保它具有所有必要的错误修复.