Comment passer des arguments dans une tâche Rake avec environnement dans Rails?

Je suis capable de transmettre des arguments comme suit:

desc "Testing args" task: :hello, :user, :message do |t, args| args.with_defaults(:message => "Thanks for logging on") puts "Hello #{args[:user]}. #{:message}" end 

Je suis également capable de charger l’environnement actuel pour une application Rails

 desc "Testing environment" task: :hello => :environment do puts "Hello #{User.first.name}." end 

Ce que je voudrais faire, c’est pouvoir avoir des variables et un environnement

 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 

Mais ce n’est pas un appel de tâche valide. Est-ce que quelqu’un sait comment je peux y arriver?

TLDR;

 task :t, [args] => [deps] 

Réponse originale

Lorsque vous transmettez des arguments à des tâches de rake, vous pouvez demander à l’environnement d’utiliser l’option: needs. Par exemple:

 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 

Mis à jour pour le commentaire de @ Peiniau ci-dessous

Quant aux rails> 3.1

 task :t, arg, :needs => [deps] # deprecated 

Veuillez utiliser

 task :t, [args] => [deps] 

Juste pour faire suite à ce vieux sujet; Voici ce que je pense qu’un fichier Rakefile actuel (depuis longtemps) devrait faire là-bas. C’est une version améliorée et corrigée de la réponse gagnante actuelle (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 

Voici comment vous l’invoquez ( http://guides.rubyonrails.org/v4.2/command_line.html#rake ):

  rake "hello[World]" 

Pour les arguments multiples, ajoutez simplement leurs mots-clés dans le tableau de la déclaration de tâche ( task :hello, [:a,:b,:c]... ) et transmettez-les en séparant les virgules:

  rake "hello[Earth,Mars,Sun,Pluto]" 

Note: le nombre d’arguments n’est pas vérifié, donc la planète impaire est omise 🙂

Juste pour être complet, voici l’exemple des documents mentionnés ci-dessus:

  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 

Remarques:

  • Vous pouvez omettre l’appel #with_defaults , évidemment.
  • Vous devez utiliser un Array pour vos arguments, même s’il n’y en a qu’un.
  • Les prérequirejs n’ont pas besoin d’être un Array .
  • args est une instance de Rake::TaskArguments .
  • t est une instance de Rake::Task .

Une autre façon de procéder est d’utiliser les variables d’environnement du système d’exploitation. Avantages de cette approche:

  • Toutes les tâches de rake dépendantes obtiennent les options.
  • La syntaxe est beaucoup plus simple, et ne dépend pas du DSL rake qui est difficile à comprendre et à modifier avec le temps.

J’ai une tâche qui nécessite trois options de ligne de commande. Voici comment je l’invoque:

 $ rake eaternet:import country=us region=or agency=multco 

C’est une syntaxe très propre, simple et juste bash, que j’aime bien. Voici ma tâche. Aussi très propre et sans magie:

 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 

Cet exemple particulier ne montre pas l’utilisation de dépendances. Mais si la tâche :import dépendait d’autres utilisateurs, ils auraient également access à ces options. Mais en utilisant la méthode des options de rake normales, ils ne le feraient pas.

Bien que ces solutions fonctionnent, à mon avis, cela est trop compliqué.

De plus, si vous le faites de cette façon dans zsh, vous obtiendrez des erreurs si les crochets de votre tableau ne sont pas échappés avec ‘\’.

Je recommande d’utiliser le tableau ARGV, qui fonctionne bien, est beaucoup plus simple et moins sujet aux erreurs. Par exemple:

 namespace :my_example do desc "Something" task :my_task => :environment do puts ARGV.inspect end end 

puis

 rake my_example:my_task 1 2 3 #=> ["my_example:my_task", "1", "2", "3"] 

La seule chose que vous devez garder à l’esprit est que ARGV [0] est le nom du processus, utilisez donc uniquement ARGV [1 ..- 1].

Je me rends compte que cela ne répond pas à la question à proprement parler, car elle ne fait pas appel à: environnement en tant que partie de la solution. Mais OP n’a pas précisé pourquoi il avait inclus cette stipulation, de sorte qu’il pourrait toujours s’appliquer à son cas d’utilisation.