3

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

我怀疑Rule这里应该有一个新的,但我的文档很少,而且代码太混乱了,我无法想出一个可行的解决方案。

4

1 回答 1

1

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

如果您想依赖git clone正在执行的操作,请改用特定的签出文件(例如README.md),创建它的规则是git clone. 如果要确保 amake已运行,请依赖于生成的文件make

可以定义目录感知规则,参见这个讨论,但是有很多警告,所以它不是推荐的方法,也不是默认支持的。

于 2016-04-15T20:07:45.693 回答