需要 "ensure dependency is up to date"

need "ensure dependency is up to date"

我在 ICFP 看尼尔的 discussing shake。他在演讲中提到 need 函数确保依赖项是“最新的”。这到底是什么意思?以下是演讲中使用的代码:

"Foo.o" *> \_ -> do
   need ["Foo.c"]
   ...
   ...
   system' "gcc" ["-c", "Foo.c"]

这是否意味着 Shake 框架期望有一个关于如何构建“Foo.c”的“规则”,并且在确定是否需要重新构建时运行该规则运行 构建“Foo.o”的规则?如果是这样的话,Shake 本质上是否有从文件到规则的映射?当我的依赖项是一个只存在于我的系统上的文件时会发生什么?如果不使用 Shake 生成它,而我使用 need ["Somefile.txt"],则不会存在如何构建“Somefile.txt”的规则。 Shake 会崩溃吗?归根结底,我们必须从一些已经存在的文件开始。

P.S。我是构建系统和 Shake 的新手;任何指导表示赞赏。

如果一个依赖项的所有依赖项都是最新的,那么该依赖项就是“最新的”,并且这些依赖项的当前值已经 运行。但是这个问题的重点似乎是Shake中的Foo.o可以指两件事:

  • 可以有一个规则 "Foo.o" *> 运行 一些命令,可能取决于源文件,并生成一个输出文件 Foo.o
  • 如果没有生成 Foo.o 的规则,那么 Shake 会假定 Foo.o 是一个源文件。在叶子必须有文件是源文件。

您可以在 Shake 产生的错误消息中看到这一点:

$ shake shakeOptions $ action $ need ["hello.txt"]
Error, file does not exist and no rule available:
  hello.txt

规则是根据它们生成的文件命名的,没有规则意味着它是一个与 Make 等构建系统共享的源文件。但是,此 属性 不同于 Buck/Bazel 等构建系统,其中目标和源具有不同的命名空间。