我能够提出如下论点:
desc "Testing args"
task: :hello, :user, :message do |t, args|
args.with_defaults(:message => "Thanks for logging on")
puts "Hello #{args[:user]}. #{:message}"
end
我还能够为Rails应用程序加载当前环境
desc "Testing environment"
task: :hello => :environment do
puts "Hello #{User.first.name}."
end
我想做的是能够有变量和环境
desc "Testing environment and variables"
task: :hello => :environment, :message do |t, args|
args.with_defaults(:message => "Thanks for logging on")
puts "Hello #{User.first.name}. #{:message}"
end
但这不是一个有效的任务调用。有人知道我该怎么做吗?
TLDR;
task :t, [args] => [deps]
原来的答案
当您向rake任务传递参数时,您可以使用:needs选项来要求环境。例如:
desc "Testing environment and variables"
task :hello, :message, :needs => :environment do |t, args|
args.with_defaults(:message => "Thanks for logging on")
puts "Hello #{User.first.name}. #{args.message}"
end
根据下面@Peiniau的评论更新
至于Rails > 3.1 .
task :t, arg, :needs => [deps] # deprecated
请使用
task :t, [args] => [deps]
为了完整起见,这里是上面提到的文档中的例子:
task :name, [:first_name, :last_name] => [:pre_name] do |t, args|
args.with_defaults(:first_name => "John", :last_name => "Dough")
puts "First name is #{args.first_name}"
puts "Last name is #{args.last_name}"
end
注:
显然,您可以省略#with_defaults调用。
你必须为你的参数使用一个数组,即使只有一个。
先决条件不需要是Array。
args是Rake::TaskArguments的一个实例。
t是Rake::Task的一个实例。
继续这个老话题;这是我认为当前Rakefile(很久以前)应该做的事情。这是当前获奖答案(hgimenez)的升级和错误修复版本:
desc "Testing environment and variables"
task :hello, [:message] => :environment do |t, args|
args.with_defaults(:message => "Thanks for logging on")
puts "Hello #{User.first.name}. #{args.message}" # Q&A above had a typo here : #{:message}
end
这就是调用它的方式(http://guides.rubyonrails.org/v4.2/command_line.html#rake):
rake "hello[World]"
对于多个参数,只需将它们的关键字添加到任务声明的数组中(task:hello, [:a,:b,:c]…),并将它们以逗号分隔:
rake "hello[Earth,Mars,Sun,Pluto]"
注意:参数的数量没有被检查,所以奇数行星被忽略了:)
另一种方法是:使用OS环境变量。这种方法的好处:
所有依赖的rake任务都可以获得选项。
语法要简单得多,不依赖于rake DSL,后者很难弄清楚,而且会随着时间变化。
我有一个rake任务,需要三个命令行选项。下面是我如何调用它:
$ rake eaternet:import country=us region=or agency=multco
这是非常干净、简单的bash语法,我喜欢这一点。这是我的rake任务。也非常干净,没有魔法:
task import: [:environment] do
agency = agency_to_import
puts "Importing data for #{agency}..."
agency.import_businesses
end
def agency_to_import
country_code = ENV['country'] or raise "No country specified"
region_slug = ENV['region'] or raise "No region specified"
agency_slug = ENV['agency'] or raise "No agency specified"
Agency.from_slugs(country_code, region_slug, agency_slug)
end
这个特殊的例子没有显示依赖关系的使用。但是如果:import任务确实依赖于其他任务,它们也可以访问这些选项。但是使用正常的耙选项方法,它们不会。
虽然这些解决方案有效,但在我看来,这太复杂了。
同样,如果在zsh中这样做,如果数组中的括号没有使用'\'转义,就会得到错误。
我建议使用ARGV数组,它工作得很好,简单得多,而且不容易出错。例句:
namespace :my_example do
desc "Something"
task :my_task => :environment do
puts ARGV.inspect
end
end
then
rake my_example:my_task 1 2 3
#=> ["my_example:my_task", "1", "2", "3"]
你唯一需要记住的是ARGV[0]是进程名,所以只使用ARGV[1..-1]。
我意识到,严格地说,这并没有回答问题,因为它没有利用:环境作为解决方案的一部分。但OP并没有说明为什么他会包含这个规定,所以它可能仍然适用于他的用例。