0

以下文件任务不执行。它是一个简单的 Rakefile 的内容,旨在创建一个名为 的文件hello.txt,如果它不存在的话。

task :default do
    puts "before file task"
    file "hello.txt" do
        puts "in file task"
        sh "touch hello.txt"
    end
    puts "after file task"
end

rake在Rakefile所在目录的shell提示符下运行后,输出为:

before file task
after file task

并且没有hello.txt创建文件。

我不确定为什么文件任务不起作用,因为在我看来,Rakefile 的文件任务部分的语法看起来不错。我在这里做错了什么?

4

2 回答 2

3

当你调用default-task 它会做三件事

  1. 在文件任务之前
  2. 定义文件任务'hello.txt'
  3. 后文件任务

重复重要的事情:文件任务hello.txt定义,未执行

也许你想做类似的事情:

task :default do
    puts "before file creation"
    File.open("hello.txt","w") do |f|
        puts "in file creation"
        f << "content for hello.txt"
    end
    puts "after file creation"
end

这总是会创建文件。

您也可以使用pyotr6 answer中的方法:

task :default => 'hello.txt' do
    puts "default task, executed after prerequistes"
end

file 'hello.txt' do |tsk|
  File.open(tsk.name, "w") do |f|
    puts "in file creation of #{f.path}"
    f << "content for hello.txt"
  end
end

这将创建一次 hello.txt。如果 hello.txt 已经存在,文件任务将不会启动。

要重新生成 hello.txt,您需要一个先决条件(通常这是另一个文件,它是 hello.txt 的来源)。

您可以使用虚拟任务强制重新生成:

task :force #Dummy task to force file generation
file 'hello.txt' => :force
于 2013-07-26T19:04:56.987 回答
1

文件任务必须像常规任务方法那样直接调用或引用。例如

task :default => "hello.txt" do
    puts "after file task"
end

file "hello.txt" do
    puts "in file task"
    sh "touch hello.txt"
end
于 2013-07-26T14:03:09.420 回答