为什么明确“需要”Shake 依赖项?

Why Shake dependencies are explicitly `needed`?

我发现第一个 exampleShake 用法演示了一个似乎容易出错的模式:

    contents <- readFileLines $ out -<.> "txt"
    need contents
    cmd "tar -cf" [out] contents

readFileLines 读取它们并且 cmd 引用它们时,为什么我们需要 need contents?这是为了避免要求 ApplicativeDo?

我认为部分混淆可能是 contents 的 types/semantics。文件 out -<.> "txt" 包含文件名列表,因此 contents 是文件名列表。当我们 need contents 时,我们要求创建并依赖文件本身,使用文件名来指定哪些文件。当我们将 contents 传递给 cmd 时,我们传递的是 tar 将用于查询文件的文件名。

所以关键点是 readFileLines 不会读取有问题的文件,它只会从另一个文件中读取文件名。我们要使用need来确定使用文件没问题,然后我们才真正使用cmd中的文件。另一种查看三行的方法是:

  1. 我们要对哪些文件进行操作?
  2. 确保这些文件已准备就绪。
  3. 使用这些文件。

这有意义吗?与 ApplicativeDo 没有任何关系 - 它的存在对我们根本没有帮助。