使用rake任务接受参数作为先决条件

时间:2010-09-29 18:14:59

标签: ruby rake

根据http://rake.rubyforge.org/files/doc/rakefile_rdoc.html,您可以创建一个接受参数且具有先决条件的任务:

task :name, [:first_name, :last_name] => [:pre_name] do |t, args|

但是如果:pre_name是一个也接受参数的任务呢?在将参数用作先决条件时,将参数传递给:pre_name的语法是什么?

4 个答案:

答案 0 :(得分:9)

实际上非常简单 - :pre任务将接收与原始任务相同的参数。您需要做的就是确保签名类似 - 例如,如果第一个任务收到:a,:b:pre任务也需要接收它们。

在此处查看更多内容:rake with params

答案 1 :(得分:4)

我知道我迟到了,但是我遇到了同样的问题并想出了一些没有使用环境变量的东西。您可以使用Rake::Task.invoke执行此操作。以下是数据库备份rake任务的示例:

namespace :db do
    task :dump_db, [:dump_file, :rails_env] do |t, args|
        puts "dumping to #{args[:dump_file]} with rails env = #{args[:rails_env]}"
    end

    task :stop_slave do
        puts "stopping slave"
    end

    task :start_slave do
        puts "starting slave"
    end

    task :upload_dump, [:dump_file] do |t, args|
        puts "uploading #{args[:dump_file]}"
    end

    task :backup_to_s3, [:dump_file, :rails_env] do |t, args|
        Rake::Task["db:stop_slave"].invoke()
        Rake::Task["db:dump_db"].invoke(args[:dump_file], args[:rails_env])
        Rake::Task["db:start_slave"].invoke()
        Rake::Task["db:upload_dump"].invoke(args[:dump_file])
    end
end

答案 2 :(得分:0)

我没有直接答案,但我确实有一个可能适合您的替代解决方案。我的rake任务都没有使用参数。 (我想我试图使用参数并且无法让它们工作。)相反,我依赖于ENV数组。因此,例如,我会将该示例任务编写为:

task :name =>:pre_name do
  do_something_with_name(ENV['first_name'], ENV['last_name'])
end

将被调用为:

$ rake name first_name=John last_name=Smith

ENV阵列数据也可用于pre_name任务。

答案 3 :(得分:-1)

namespace :shell do

  desc "Local hostname"
  task :hostname do
    puts "Local hostname"
    sh "hostname"
  end

  desc "Local uptime"
  task :uptime do
    puts "Local uptime"
    sh "uptime"
  end

  desc "Echo something"
  task :echo,[:someword] do |t,args|
    puts "--- #{args[:someword]} ---"
  end

end 


desc "Run all tasks"
task :all , [:someword] => ["shell:hostname","shell:uptime","shell:echo"] do
  puts "Done."
end