我使用shake 构建了一堆静态网页,然后我必须使用sftp 将这些网页上传到远程主机。目前,cronjob 运行
git pull # get possibly updated sources
./my-shake-system
lftp ... # upload
如果shake 没有真正重建任何东西,我想避免运行最终命令。有没有办法告诉震动“运行命令
foo
,在其他一切之后,并且只有当你改变了一些东西!”?或者,是否有震动报告它是否在进程退出代码中做了一些事情?
我想我可以添加一个取决于所有可能生成的文件的规则,但这似乎是多余的并且容易出错。
最佳答案
目前没有直接/简单的方法来确定是否构建了任何东西。对于更简单的构建系统,这也不是一个有用的概念,因为某些规则(尤其是那些定义 storedValue
以返回 Nothing
的规则)将始终“重新运行”,但很快就决定他们不需要运行依赖于它们的规则.摇一摇,这和重新跑是一样的。我可以想到几种方法,哪种方法最好可能取决于您的情况:
标记有趣的规则
您可以使用写入特定文件的函数标记每个有趣的规则(产生需要上传的内容的规则)。如果该特定文件存在,则您需要上传。这可能会稍微好一点,就好像您执行多次 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/