Wil*_*ill 210 ruby rake ruby-on-rails
我能够传递如下参数:
desc "Testing args"
task: :hello, :user, :message do |t, args|
args.with_defaults(:message => "Thanks for logging on")
puts "Hello #{args[:user]}. #{:message}"
end
Run Code Online (Sandbox Code Playgroud)
我还能够为Rails应用程序加载当前环境
desc "Testing environment"
task: :hello => :environment do
puts "Hello #{User.first.name}."
end
Run Code Online (Sandbox Code Playgroud)
我想做的是能够拥有变量和环境
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
Run Code Online (Sandbox Code Playgroud)
但这不是一个有效的任务调用.有谁知道我怎么能做到这一点?
ing*_*ger 370
只是为了跟进这个老话题; 这就是我认为当前的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
Run Code Online (Sandbox Code Playgroud)
这就是你调用它的方式(http://guides.rubyonrails.org/v4.2/command_line.html#rake):
rake "hello[World]"
Run Code Online (Sandbox Code Playgroud)
对于多个参数,只需在任务声明(task :hello, [:a,:b,:c]...
)的数组中添加它们的关键字,并以逗号分隔:
rake "hello[Earth,Mars,Sun,Pluto]"
Run Code Online (Sandbox Code Playgroud)
注意:未检查参数的数量,因此遗漏了奇数行星:)
hgm*_*mnz 114
task :t, [args] => [deps]
Run Code Online (Sandbox Code Playgroud)
将参数传递给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
Run Code Online (Sandbox Code Playgroud)
根据@ Peiniau的评论更新如下
至于Rails> 3.1
task :t, arg, :needs => [deps] # deprecated
Run Code Online (Sandbox Code Playgroud)
请用
task :t, [args] => [deps]
Run Code Online (Sandbox Code Playgroud)
mik*_*ter 59
为了完整起见,这里是上面提到的文档中的示例:
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
Run Code Online (Sandbox Code Playgroud)
笔记:
#with_defaults
显然,你可以省略这个电话.Array
作为你的论据,即使只有一个.Array
.args
是一个实例Rake::TaskArguments
.t
是一个实例Rake::Task
.Dog*_*her 20
另一种方法:使用OS环境变量.这种方法的好处:
我有一个rake任务,需要三个命令行选项.这是我如何调用它:
$ rake eaternet:import country=us region=or agency=multco
Run Code Online (Sandbox Code Playgroud)
这是非常干净,简单,只是bash语法,我喜欢.这是我的佣金任务.也非常干净,没有魔力:
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
Run Code Online (Sandbox Code Playgroud)
此特定示例未显示依赖项的使用.但如果:import
任务确实依赖于其他人,他们也可以访问这些选项.但是使用普通的rake选项方法,他们不会.
Lon*_*hus 11
虽然这些解决方案有效,但在我看来这太复杂了.
另外,如果你在zsh中这样做,如果你的数组中的括号没有用'\'转义,你就会出错.
我建议使用ARGV数组,它工作正常,更简单,并且不容易出错.例如:
namespace :my_example do
desc "Something"
task :my_task => :environment do
puts ARGV.inspect
end
end
Run Code Online (Sandbox Code Playgroud)
然后
rake my_example:my_task 1 2 3
#=> ["my_example:my_task", "1", "2", "3"]
Run Code Online (Sandbox Code Playgroud)
您唯一需要记住的是ARGV [0]是进程名称,因此只使用ARGV [1 ..- 1].
我意识到严格来说这并没有回答这个问题,因为它没有利用:环境作为解决方案的一部分.但是OP没有说明为什么他包含这个规定所以它可能仍然适用于他的用例.