Jak przekazać argumenty do zadania Rake ze środowiskiem w Rails? [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak przekazać argumenty wiersza poleceń do zadania rake (19 odpowiedzi) Zamknięty 3 lata temu .

Jestem w stanie przekazać argumenty w następujący sposób:

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

Jestem również w stanie załadować aktualne środowisko dla aplikacji Rails

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

Chciałbym mieć zmienne i środowisko

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

Ale to nie jest prawidłowe wywołanie zadania. Czy ktoś wie, jak Mogę to osiągnąć?

Author: Flip, 2009-08-31

5 answers

TLDR;

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

Oryginalna Odpowiedź

Kiedy przekazujesz argumenty do zadań rake, możesz wymagać środowiska używając opcji: needs. Na przykład:


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

Zaktualizowano komentarz @Peiniau poniżej

Jak dla Rails > 3.1

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

Proszę użyć

task :t, [args] => [deps] 
 119
Author: hgmnz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-05 19:41:52

Aby kontynuować ten stary temat; oto, co myślę, że obecny Rakefile (od dawna) powinien tam zrobić. Jest to ulepszona i poprawiona wersja aktualnej ZWYCIĘSKIEJ odpowiedzi (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

Tak się to wywołuje ( http://guides.rubyonrails.org/v4.2/command_line.html#rake):

  rake "hello[World]" 

Dla wielu argumentów wystarczy dodać ich słowa kluczowe w tablicy deklaracji zadania (task :hello, [:a,:b,:c]...) i przekazać je rozdzielone przecinkami:

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

Uwaga: liczba argumenty nie są sprawdzane, więc nieparzyste planety są pomijane:)

 386
Author: inger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-07 12:37:40

Tylko dla kompletności, tutaj przykład z docs wspomniano powyżej:

   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

Uwagi:

    Oczywiście możesz pominąć rozmowę.
  • musisz użyć Array do swoich argumentów, nawet jeśli jest tylko jeden.
  • warunki wstępne nie muszą być Array.
  • args jest instancją Rake::TaskArguments.
  • t jest instancją Rake::Task.
 59
Author: mikezter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-26 10:46:12

Alternatywny sposób: użyj zmiennych środowiskowych Systemu Operacyjnego. Korzyści z tego podejścia:

  • wszystkie zależne zadania rake dostają opcje.
  • składnia jest o wiele prostsza, nie zależy od rake DSL, który jest trudny do zrozumienia i zmienia się w czasie.

Mam zadanie rake, które wymaga trzech opcji wiersza poleceń. Oto jak to wywołuję:

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

To bardzo czysta, prosta i po prostu składnia Basha, którą lubię. Oto moje zadanie. Również bardzo czyste i żadnej magii:

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

Ten konkretny przykład nie pokazuje użycia zależności. Ale jeśli zadanie :import zależałoby od innych, oni również mieliby dostęp do tych opcji. Ale używając zwykłej metody rake options, nie zrobiliby tego.

 21
Author: Dogweather,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-05 21:42:21

Chociaż te rozwiązania działają, moim zdaniem jest to zbyt skomplikowane.

Ponadto, jeśli zrobisz to w ten sposób w zsh, pojawią się błędy, jeśli nawiasy w tablicy nie są zabezpieczone znakiem'\'.

Zalecam używanie tablicy ARGV, która działa dobrze, jest znacznie prostsza i mniej podatna na błędy. Np.:

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

Then

rake my_example:my_task 1 2 3

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

Jedyną rzeczą, o której musisz pamiętać, jest to, że ARGV[0] jest nazwą procesu, więc używaj tylko ARGV [1..-1].

Zdaję sobie sprawę, że ściśle mówiąc to nie odpowiada na pytanie, ponieważ nie wykorzystuje :środowiska jako części rozwiązania. Ale OP nie podał, dlaczego uwzględnił to zastrzeżenie, więc może nadal mieć zastosowanie do jego przypadku użycia.

 12
Author: Lonny Eachus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-19 19:45:46