haskell - 摇一摇: Signal whether anything had to be rebuilt at all

标签 haskell shake-build-system

我使用 shake 构建了一堆静态网页,然后我必须使用 sftp 将其上传到远程主机。目前,cronjob 正在运行

git pull # get possibly updated sources
./my-shake-system 
lftp ... # upload

如果 shake 实际上没有重建任何东西,我想避免运行最终命令。有没有办法告诉 shake “运行命令 foo,在执行其他操作之后,并且仅当您更改某些内容时!”?

或者,摇动报告是否在进程退出代码中执行了某些操作?

我想我可以添加一个依赖于所有可能生成的文件的规则,但这似乎是多余的并且容易出错。

最佳答案

目前没有直接/简单的方法来确定是否已构建任何内容。对于更简单的构建系统来说,这也不是一个有用的概念,因为某些规则(尤其是那些定义 storedValue 返回 Nothing 的规则)总是会“重新运行”,但很快就会“重新运行”决定他们不需要运行依赖于他们的规则。对于Shake来说,这与重新运行是一样的。我可以想到几种方法,哪一种最好可能取决于您的情况:

标记有趣的规则

您可以使用写入特定文件的函数来标记每个有趣的规则(生成需要上传的内容的规则)。如果该特定文件存在,则需要上传。这可能会稍微好一些,就像您执行多次 Shake 运行一样,在第一次运行中有些内容发生了变化,但第二次没有任何变化,文件仍然存在。如果有意义,请使用 IORef 而不是文件。

使用分析

Shake 具有相当先进的分析功能。如果您传递 shakeProfile=["output.json"] ,它将生成一个 JSON 文件,详细说明构建内容和构建时间。运行由 Int 索引,0 表示最近的运行,并且排除任何未构建任何内容的运行。如果您有一条始终触发的规则(例如使用 alwaysRerun 写入虚拟文件),那么如果同时触发任何内容,则会重建。

观察.shake.database文件大小

Shake 有一个数据库,存储在 shakeFiles 下。每次无趣的运行它都会增长相当小的量(~100 字节) - 但给定您的系统的大小是固定的。如果它的大小变化幅度更大,那么它做了一些有趣的事情。

在这些方法中,标记有趣的规则可能是最简单、最直接的(尽管确实存在忘记标记某些内容的风险)。

关于haskell - 摇一摇: Signal whether anything had to be rebuilt at all,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30284679/

相关文章:

haskell - 如何使用Shake执行sh命令

haskell - 为什么 Shake 建议禁用空闲垃圾收集?

javascript - Shake FilePatterns 如何用于缩小 JS 和 CSS 文件?

shake-build-system - Shake如何决定是否重建目标?

haskell - 如何使用 Shake 库构建响应式(Reactive)构建系统?

haskell - 我是否必须仅仅因为我想提取一些功能而将隐藏包移动到 Haskell 项目中的项目依赖项?

haskell - 如何从(大多数)图片中提取 RGB 值?

haskell - 为什么Num可以表现为分数形式?

haskell - head.reverse 与 last 的空间复杂度

wpf - Haskell 中 MVC 框架的镜头