首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何决定是否重建一个目标?

如何决定是否重建一个目标?
EN

Stack Overflow用户
提问于 2013-10-19 18:00:10
回答 1查看 221关注 0票数 3

我对摇动用于计算是否需要重建输出的规则感到困惑。我用两个步骤构建了一个简单的文档。完整的构建文件如下所示,但概括地说,asciidoc用于将.txt文件转换为.dbxml (Docbook )文件,然后使用dblatex将其转换为PDF。

我希望如果我触摸PDF和重新运行抖动,什么都不会发生,因为输出比这两个输入都要新。然而,抖动实际上执行dblatex步骤。

接下来,我希望如果我触摸.dbxml文件,shake将执行dblatex,而不是asciidoc,因为dbxml比它的输入(即.txt)更新。然而,steps实际上同时执行asciidoc和dblatex步骤。

我的依赖关系犯了错误吗?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-19 22:05:31

在Shake中,如果文件的上一次修改时间与生成时相比发生了变化,则该文件被认为是脏的。在make中,如果文件上一次修改的时间比它的依赖项更长,则被认为是脏的。我怀疑你的观察都源于这种差异。为了直接回答这个问题,如果一个文件或它的任何直接依赖项已经改变,Shake就会重新构建它。

为什么Shake要做一些不同的事情?原因有三:

  1. Make没有存储足够的信息,无法在修改时间发生变化时重新生成,因为它没有记录任何关于上次构建中修改时间的额外元数据。
  2. 通过做时间比较,make依赖于一个单调增加的时钟,如果用户更改他们的系统时间,这个时钟就会中断,并且似乎特别容易在NFS文件系统上损坏。
  3. 假设A依赖于B,B依赖于C. C的更改,而B则重新构建,但是B的规则足够聪明,可以发现旧的B不需要更新。在make中,您有两个糟糕的选项--无论如何触摸B并重建A,或者每次运行make时不要碰B,然后运行B的规则。在摇动中,你不碰B,A不重建,B下次也不重建。

至于你的构建系统,我觉得一切都很好。我唯一的小改动是使用infix操作符-<.>而不是replaceExtension --它们都是相同的函数,但在我看来操作符更清晰。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19469233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档