Jak przekazać argumenty do zadania Rake ze środowiskiem w Rails? [duplikat]
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ąć?
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]
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:)
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
.
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.
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.
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