我使用shake构建一堆静态网页,然后使用sftp将其上传到远程主机。当前,cronjob正在运行
git pull # get possibly updated sources
./my-shake-system
lftp ... # upload
如果shake实际上没有重新构建任何东西,我希望避免运行最后一个命令。有没有办法告诉shake“运行命令foo
,在所有事情之后,只有当你改变了一些东西!”?
或者,让shake报告它是否在进程退出代码中做了什么?
我想我可以添加一个依赖于所有可能生成的文件的规则,但这似乎是多余的,而且容易出错。
发布于 2015-05-17 20:00:32
目前还没有直接/简单的方法来确定是否构建了任何东西。对于更简单的构建系统,它也不是一个有用的概念,因为某些规则(特别是那些定义storedValue
返回Nothing
的规则)总是会“重新运行”,但很快就会决定不需要运行依赖于它们的规则。对Shake来说,这和重新运行是一样的。我能想到几种方法,哪一种最好可能取决于你的情况:
标记有趣的规则
您可以使用一个写入特定文件的函数来标记每个有趣的规则(生成需要上载的内容的规则)。如果该特定文件存在,则需要上载。这可能会稍微好一点,就像你运行了多个Shake,在第一次有变化但第二次没有变化时,文件仍然存在。如果有意义,可以使用IORef
而不是文件。
使用性能分析
Shake具有相当高级的分析功能。如果您传递shakeProfile=["output.json"]
,它将生成一个JSON文件,详细说明构建内容和构建时间。运行由Int索引,0
表示最近的运行,并且排除不生成任何内容的任何运行。如果你有一个总是触发的规则(例如,用alwaysRerun
写到一个虚拟文件),那么如果有任何东西同时触发,它就会重新构建。
查看.shake.database
文件大小
Shake有一个数据库,存储在shakeFiles
下。每一次不感兴趣的运行,它都会增长一个相当小的量(~100字节)-但给你的系统一个固定的大小。如果它的大小变化更大,那么它就做了一些有趣的事情。
在这些方法中,标记有趣的规则可能是最简单和最直接的(尽管确实存在忘记标记某些东西的风险)。
https://stackoverflow.com/questions/30284679
复制