Haskell震动:构建目录的特殊规则

时间:2016-03-11 11:21:26

标签: haskell shake-build-system

有时创建目录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并且git clone甚至不运行。有办法解决这个问题吗?

我怀疑这里有一个新的Rule,但我的文档很少,而且代码对我来说太困惑了,无法提出一个有效的解决方案。

1 个答案:

答案 0 :(得分:1)

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

如果您想依赖git clone正在执行,请改为依赖特定的签出文件(例如README.md),并使用规则创建git clone。如果您想确保运行make,请依赖make生成的文件。

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