Haskell shake: 构建目录的特殊规则

Haskell shake: special rule for building directories

有时创建目录 mkdir 不是正确的工具。它可能是 git clonersyncmount。所以当我们有这样的规则时:

needDir dirs = filterM ((fmap not) . doesDirectoryExist) dirs >>= need

rules = do {
  "project" </> "tool" %> \out -> do {
    needDir [takeDirectory out];
    cmd "make -C" [takeDirectory out];
    }

  "project" %> \out -> cmd "git clone a.url.to/repo.git" [out]
  }

正如人们可能预料的那样,"project" </> "tool" 在创建目录 project 之前创建了目录 project,而 git clone 甚至没有 运行。有办法解决这个问题吗?

我怀疑这里要发布一个新的 Rule,但我的文档很少,而且代码太混乱,我无法想出一个有效的解决方案。

将目录视为文件的容器。它们存在或不完全随机,但如果它们有文件,它们必须存在。特别是,您不能依赖具有 need 的目录或编写规则来创建目录。根据需要创建目录 - project/tool.txt 的规则将在必要时创建 project 目录。

如果您想依赖 git clone 的执行,请依赖特定的签出文件(例如 README.md),创建它的规则是 git clone.如果您想确保 make 是 运行,则取决于 make 生成的文件。

可以定义目录感知规则,请参阅 this discussion,但有很多注意事项,因此它不是推荐的方法或默认情况下不支持。