我对摇动用于计算是否需要重建输出的规则感到困惑。我用两个步骤构建了一个简单的文档。完整的构建文件如下所示,但概括地说,asciidoc用于将.txt文件转换为.dbxml (Docbook )文件,然后使用dblatex将其转换为PDF。
我希望如果我触摸PDF和重新运行抖动,什么都不会发生,因为输出比这两个输入都要新。然而,抖动实际上执行dblatex步骤。
接下来,我希望如果我触摸.dbxml文件,shake将执行dblatex,而不是asciidoc,因为dbxml比它的输入(即.txt)更新。然而,steps实际上同时执行asciidoc和dblatex步骤。
我的依赖关系犯了错误吗?
import Development.Shake
import Development.Shake.FilePath
-- List of output files
outputs = ["process.pdf"]
main = shakeArgs shakeOptions{shakeVerbosity=Diagnostic} $ do
want outputs
-- Rule to produce pdf files from dbxml inputs
"*.pdf" *> \out -> do
let dbxml = out `replaceExtension` "dbxml"
need [dbxml]
cmd "dblatex" "-o" out dbxml
-- Rule to produce dbxml files from txt (asciidoc) inputs
"*.dbxml" *> \out -> do
let src = out `replaceExtension` "txt"
need [src]
cmd "asciidoc" "--backend=docbook45" "--doctype=article" "-o" out src发布于 2013-10-19 22:05:31
在Shake中,如果文件的上一次修改时间与生成时相比发生了变化,则该文件被认为是脏的。在make中,如果文件上一次修改的时间比它的依赖项更长,则被认为是脏的。我怀疑你的观察都源于这种差异。为了直接回答这个问题,如果一个文件或它的任何直接依赖项已经改变,Shake就会重新构建它。
为什么Shake要做一些不同的事情?原因有三:
至于你的构建系统,我觉得一切都很好。我唯一的小改动是使用infix操作符-<.>而不是replaceExtension --它们都是相同的函数,但在我看来操作符更清晰。
https://stackoverflow.com/questions/19469233
复制相似问题