如何阻止 Rake 不必要地执行具有依赖项的文件任务?

How to stop Rake from unnecessarily executing file tasks with dependencies?

Rake 中的文件任务只应在其命名的文件尚不存在时执行。

我有一个构建 directory 的文件任务和一个在该目录中创建 file 的文件任务。现在除非目录存在,否则无法创建文件,所以我将目录任务设置为文件任务的依赖项:

file "directory" do
  mkdir_p "directory"
end

file "file" => "directory" do
  touch "directory/file"
end

desc "Create file"
task build: "file"

当我在这里首先 运行 build 任务时,一切都按计划进行:首先创建目录,然后创建文件:

$ rake -t build
** Invoke build (first_time)
** Invoke file (first_time)
** Invoke directory (first_time)
** Execute directory
mkdir -p directory
** Execute file
touch directory/file
** Execute build

当我在创建文件及其包含目录后第二次 运行 时,我希望 Rake 什么都不做 (not_needed),因为所有文件都是文件任务与已经存在相关。相反,目录任务被跳过但文件任务被执行:

$ rake -t build
** Invoke build (first_time)
** Invoke file (first_time)
** Invoke directory (first_time, not_needed)
** Execute file
touch directory/file
** Execute build

如果 directoryfile 都已经存在,我怎样才能让 Rake 不是 运行 file 任务?

您的 file 任务有误。它声明,就好像它在根目录中创建了 file,但实际上它在 directory 目录中创建了 file。 Rake 检查 file 是否存在于根目录中,如果不存在,则 运行 是任务。为了使其正常工作,您需要重命名 file task:

file "directory/file" => "directory" do
  touch "directory/file"
end

desc "Create file"
task build: "directory/file"

这样 Rake 会检查正确的文件是否存在,而不是 运行 'directory/file' 任务。

** Invoke build (first_time)
** Invoke directory/file (first_time, not_needed)
** Invoke directory (first_time, not_needed)
** Execute build