有时创建目录mkdir
不是正确的工具。它可能是git clone
或rsync
或mount
。所以当我们有这样的规则时:
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
,但我的文档很少,而且代码对我来说太困惑了,无法提出一个有效的解决方案。
答案 0 :(得分:1)
将目录视为文件的容器。它们存在或不是随机存在,但如果它们有文件,它们必须存在。特别是,您不能依赖具有need
的目录或编写规则来创建目录。根据需要创建目录 - 如果需要,project/tool.txt
的规则将创建project
目录。
如果您想依赖git clone
正在执行,请改为依赖特定的签出文件(例如README.md
),并使用规则创建git clone
。如果您想确保运行make
,请依赖make
生成的文件。
可以定义目录感知规则,请参阅this discussion,但有很多警告,因此它不是推荐的方法或默认支持。