gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:43:08 26 4
gpt4 key购买 nike

我对规则感到困惑 Shake用于确定输出是否需要重建。我有一个简单的文档构建,包含两个步骤。完整的构建文件如下,但总而言之,asciidoc 用于将 .txt 文件转换为 .dbxml(Docbook XML)文件,然后使用 dblatex 将其转换为 PDF。

我希望如果我触摸 PDF 并重新运行抖动,应该不会发生任何事情,因为输出比两个输入都新。然而,shake 实际上执行了 dblatex 步骤。

接下来,我希望如果我触摸 .dbxml 文件,那么 shake 将执行 dblatex 而不是 asciidoc,因为 dbxml 比它的输入更新(即 .txt).然而 shake 实际上同时执行了 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

最佳答案

在 Shake 中,如果文件的最后修改时间与构建时的时间发生变化,则该文件被认为是脏的。在 make 中,如果文件的最后修改时间比其依赖项,则该文件被认为是脏的。我怀疑您的观察都源于这种差异。为了直接回答这个问题,Shake 会在文件或其任何直接依赖项发生更改时重建该文件。

为什么 Shake 要做一些不同的东西?三个原因:

  1. 如果修改时间发生变化,Make 不会存储足够的信息来重建,因为它不会记录任何关于上次构建中的修改时间的额外元数据。
  2. 通过进行时间比较,make 依赖于单调递增的时钟,如果用户更改其系统时间,该时钟就会中断,并且似乎特别容易在 NFS 文件系统上中断。
  3. 假设 A 依赖于 B,B 依赖于 C。C 发生变化,B 重建,但是 B 的规则足够聪明,可以发现旧的 B 不需要更新。在 make 中,您有两个错误的选择——无论如何触摸 B 并重建 A,或者不触摸 B,然后在每次运行 make 时运行 B 的规则。在 Shake 中,您不碰 B,A 不会重建,B 下次也不会重建。

至于你的构建系统,我觉得一切都很好。我唯一的小调整是使用中缀运算符 -<.>而不是 replaceExtension - 它们的功能相同,但操作符在我看来更清晰。

关于shake-build-system - Shake如何决定是否重建目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com