2013-09-06 43 views
5

Tôi đang cố gắng để tạo ra một nhiệm vụ cào mà phải mất một đối số đầu tiên yêu cầu, và sau đó bất kỳ số lượng đối số bổ sung mà tôi muốn gộp lại với nhau thành một mảng:Rake nhiệm vụ w/lập luận splat

rake course["COURSE NAME", 123, 456, 789] 

tôi đã thử những điều sau đây nhưng args[:numbers] chỉ đơn giản là một chuỗi w/123 thay vì tất cả các số.

task :course, [:name, *:numbers] => :environment do |t, args| 
    puts args # {:name=>"COURSE NAME", :numbers=>"123"} 
end 
+2

Làm thế nào về khóa học 'rake [" TÊN ", [123, 456, 789]]'? – screenmutt

+0

Điều đó mang lại cho tôi '{: name =>" COURSE NAME ",: number =>" [123 "}' thực sự kỳ quái. –

+0

Không có khoảng trắng nào được phép giữa các đối số cho các nhiệm vụ, hãy thử điều này: 'khóa học rake [" TÊN TÊN "123,456,789]' – MrYoshiji

Trả lời

12

Bắt đầu với cào 10.1.0, bạn có thể sử dụng Rake::TaskArguments#extras:

task :environment 

task :course, [:name] => :environment do |t, args| 
    name = args[:name] 
    numbers = args.extras 
    puts "name = #{name}" 
    puts "numbers = #{numbers.join ','}" 
end 

Output:

$ rake "course[COURSE NAME, 123, 456, 789]" 
name = COURSE NAME 
numbers = 123,456,789 

Đối cào < 10.1.0 bạn có thể tạo một danh sách đối số lớn sufficienty. Bản hack này sẽ hoạt động với tối đa 26 số:

task :course, [:name, *:a..:z] => :environment do |t, args| 
    name = args[:name] 
    numbers = args.values_at(*:a..:z).compact 
    puts "name = #{name}" 
    puts "numbers = #{numbers.join ','}" 
end 
+0

Điều này không có tác dụng. Tôi đã thử 'rake khóa học [" TÊN HỌC ", 123,456,789]' cũng như 'khóa học rake [" TÊN TÊN ", [123,456,789]]' và trong cả hai trường hợp 'args.extras' là' nil' –

+0

Tôi làm việc cho tôi, Rails 3.2.13 & Ruby 1.9.3 – MrYoshiji

+1

Có vẻ như [tính năng này] (https://github.com/jimweirich/rake/pull/150) đã được giới thiệu trong rake 10.1.0, có thể bạn phải cập nhật – Stefan