2010-08-27 9 views

Répondre

9

Vous pouvez essayer quelque chose comme ça:

rake test_rake_task SOME_PARAM=value1,value2,value3 

Et dans la tâche de coupe:

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

ne peut pas passer i paramètre de cette façon ?? ratisser test_rake_task [par1, par2, par3] et y accéder? –

+0

J'ai décrit la seule façon que je connaisse pour passer des paramètres à la tâche de ratissage. Il semble impossible d'exécuter la tâche de rake avec quelque chose comme 'rake test_rake_task [par1, par2, par3]'. – lest

+0

Il n'est pas impossible d'exécuter la tâche de rake en tant que telle, la réponse de Henry ci-dessous fonctionne pour faire exactement cela. –

53

Rake prend en charge le passage de paramètres directement à une tâche à l'aide d'un tableau, sans en utilisant le hack ENV.

Définir votre tâche comme ceci:

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

et l'appeler comme ceci:

rake my_task[Hello, World] 
=> Hello 
    World 

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

+12

Cela n'a pas répondu à la question. Le PO dit qu'il ne connaît pas le nombre d'arguments qui sont passés. –

+1

@Henry Pouvez-vous décrire la signification/utilisation de ': needs' ou fournir de la documentation sur ce symbole? – JJD

+1

@JJD Si vous utilisez la dernière version de Ruby, je pense que: needs est déprécié. : besoins indiqués dépendances.Essayez quelque chose comme 'tâche: test, [: arg1,: arg2] =>: environnement do | t, args | #Code end' – TradeRaider

8

Utilisez args.values.

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

Nécessaire pour utiliser * args.to_hash.values ​​*, et générant un millier d'arguments à 4 caractères foiré * rake -T *, donc j'ai utilisé * (? A ..? E) .to_a * à la place. – michelpm

7

à cet exemple sur ce blog post et la syntaxe semble un peu plus propre.

Par exemple, si vous aviez une tâche say_hello, vous pouvez l'appeler avec un certain nombre d'arguments, comme ceci:

$ rake say_hello Earth Mars Venus 

Voilà comment cela fonctionne:

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

effet secondaire: vous ne serez pas en mesure d'utiliser d'autres tâches avec celui-ci en une seule commande – Sergey

43

Vous pouvez utiliser pour parcourir tous les arguments sans indiquer explicitement combien de paramètres vous avez.

Exemple:

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

Pour exécuter:

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

Sortie:

6 
The 
World 
Is 
Just 
Awesome 
Boomdeyada 
+1

De loin le meilleur moyen de passer des paramètres sans nom à une tâche rake sans piratage de l'environnement. – Epigene

+1

Notez que ceci est vrai pour plus (ou moins) de versions récentes de rake. –

+2

Cela devrait certainement être la réponse. – Siraris

Questions connexes