2010-08-27 40 views
23

Tôi muốn chuyển nhiều thông số nhưng tôi không biết số. Chẳng hạn như tên mẫu. Làm cách nào để chuyển các tham số đó vào tác vụ rake và làm cách nào để truy cập các tham số đó trong tác vụ rake.cách chuyển nhiều tham số sang tác vụ rake

Giống như, $ rake test_rake_task[par1, par2, par3]

Trả lời

9

Bạn có thể thử một cái gì đó như thế:

rake test_rake_task SOME_PARAM=value1,value2,value3 

Và trong nhiệm vụ rake:

values = ENV['SOME_PARAM'].split(',') 
+0

tôi không thể vượt qua tham số cách này ?? rake test_rake_task [par1, par2, par3] và truy cập nó ?? –

+0

Tôi đã mô tả cách duy nhất tôi biết để chuyển các tham số cho tác vụ rake. Nó đường nối không thể thực hiện nhiệm vụ rake với một cái gì đó như 'rake test_rake_task [par1, par2, par3]'. – lest

+0

Nó không phải là không thể thực hiện nhiệm vụ rake như vậy, câu trả lời của Henry dưới đây hoạt động để làm điều đó. –

53

Rake hỗ trợ thông qua các thông số trực tiếp vào một nhiệm vụ sử dụng một mảng, mà không bằng cách sử dụng ENV hack.

Xác định nhiệm vụ của bạn như thế này:

task :my_task, [:first_param, :second_param] => :environment do |t, args| 
    puts args[:first_param] 
    puts args[:second_param] 
end 

Và gọi nó là như thế này:

rake my_task[Hello, World] 
=> Hello 
    World 

This article by Patrick Reagan on the Viget blog explains it nicely

+12

Điều này không trả lời được câu hỏi. OP nói rằng anh ta không biết số lượng đối số được thông qua. –

+1

@Henry Bạn có thể mô tả ý nghĩa/cách sử dụng ': nhu cầu' hoặc cung cấp tài liệu về biểu tượng này không? – JJD

+1

@JJD Nếu bạn đang sử dụng phiên bản mới nhất của Ruby, tôi nghĩ: nhu cầu không được chấp nhận. : nhu cầu chỉ định phụ thuộc.Hãy thử một cái gì đó như 'tác vụ: kiểm tra, [: arg1,: arg2] =>: môi trường do | t, args | #Code end' – TradeRaider

8

Sử dụng args.values.

task :events, 1000.times.map { |i| "arg#{i}".to_sym } => :environment do |t, args| 
    Foo.use(args.values) 
end 
+0

Cần sử dụng * args.to_hash.values ​​*, và tạo ra một nghìn đối số 4 ký tự sai lệch * rake -T *, vì vậy tôi đã sử dụng * (? A ..? E) .to_a * để thay thế. – michelpm

7

Tìm thấy ví dụ này trên blog post này và cú pháp có vẻ hơi bụi.

Ví dụ, nếu bạn đã có một nhiệm vụ say_hello, bạn có thể gọi nó với bất kỳ số lượng các đối số, như vậy:

$ rake say_hello Earth Mars Venus 

Đây là cách hoạt động:

task :say_hello do 
    # ARGV contains the name of the rake task and all of the arguments. 
    # Remove/shift the first element, i.e. the task name. 
    ARGV.shift 

    # Use the arguments 
    puts 'Hello arguments:', ARGV 

    # By default, rake considers each 'argument' to be the name of an actual task. 
    # It will try to invoke each one as a task. By dynamically defining a dummy 
    # task for every argument, we can prevent an exception from being thrown 
    # when rake inevitably doesn't find a defined task with that name. 
    ARGV.each do |arg| 
    task arg.to_sym do ; end 
    end 

end 
+0

tác dụng phụ: bạn sẽ không thể sử dụng các tác vụ khác với lệnh này trong một lệnh – Sergey

43

Bạn có thể sử dụng args.extras để lặp qua tất cả các đối số mà không nêu rõ số lượng thông số bạn có.

Ví dụ:

desc "Bring it on, parameters!" 
task :infinite_parameters do |task, args| 
    puts args.extras.count 
    args.extras.each do |params| 
     puts params 
    end   
end 

Để chạy:

rake infinite_parameters['The','World','Is','Just','Awesome','Boomdeyada'] 

Output:

6 
The 
World 
Is 
Just 
Awesome 
Boomdeyada 
+1

Cho đến nay, cách tốt nhất để chuyển các tham số chưa đặt tên cho tác vụ rake mà không cần xâm nhập môi trường. – Epigene

+1

Lưu ý rằng điều này đúng với các phiên bản cào (hoặc ít hơn) gần đây. –

+2

Điều này chắc chắn sẽ là câu trả lời. – Siraris

Các vấn đề liên quan