【问题标题】:How to stop Rake from unnecessarily executing file tasks with dependencies?如何阻止 Rake 不必要地执行具有依赖关系的文件任务?
【发布时间】:2020-05-20 06:18:15
【问题描述】:

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 任务?

【问题讨论】:

    标签: ruby rake rakefile


    【解决方案1】:

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

    file "directory/file" => "directory" do
      touch "directory/file"
    end
    
    desc "Create file"
    task build: "directory/file"
    

    这样 Rake 会检查正确的文件是否存在并且不会运行“目录/文件”任务。

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

    【讨论】:

    • 谢谢,你是对的。遗憾的是,这个问题仅在我的示例中引入,我的潜在问题是另一个问题,其中所有任务名称都匹配它们的路径。看来我设法通过不使用简单的file 任务来解决实际问题,而是使用 Rake 还提供的特殊directory 任务。
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    相关资源
    最近更新 更多