Haskell shake: 构建目录的特殊规则
Haskell shake: special rule for building directories
有时创建目录 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
之前创建了目录 project
,而 git clone
甚至没有 运行。有办法解决这个问题吗?
我怀疑这里要发布一个新的 Rule
,但我的文档很少,而且代码太混乱,我无法想出一个有效的解决方案。
将目录视为文件的容器。它们存在或不完全随机,但如果它们有文件,它们必须存在。特别是,您不能依赖具有 need
的目录或编写规则来创建目录。根据需要创建目录 - project/tool.txt
的规则将在必要时创建 project
目录。
如果您想依赖 git clone
的执行,请依赖特定的签出文件(例如 README.md
),创建它的规则是 git clone
.如果您想确保 make
是 运行,则取决于 make
生成的文件。
可以定义目录感知规则,请参阅 this discussion,但有很多注意事项,因此它不是推荐的方法或默认情况下不支持。
有时创建目录 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
之前创建了目录 project
,而 git clone
甚至没有 运行。有办法解决这个问题吗?
我怀疑这里要发布一个新的 Rule
,但我的文档很少,而且代码太混乱,我无法想出一个有效的解决方案。
将目录视为文件的容器。它们存在或不完全随机,但如果它们有文件,它们必须存在。特别是,您不能依赖具有 need
的目录或编写规则来创建目录。根据需要创建目录 - project/tool.txt
的规则将在必要时创建 project
目录。
如果您想依赖 git clone
的执行,请依赖特定的签出文件(例如 README.md
),创建它的规则是 git clone
.如果您想确保 make
是 运行,则取决于 make
生成的文件。
可以定义目录感知规则,请参阅 this discussion,但有很多注意事项,因此它不是推荐的方法或默认情况下不支持。