레일즈의 환경에서 Rake 작업에 인수를 전달하는 방법은 무엇입니까?
다음과 같이 인수를 전달할 수 있습니다.
desc "Testing args"
task: :hello, :user, :message do |t, args|
args.with_defaults(:message => "Thanks for logging on")
puts "Hello #{args[:user]}. #{:message}"
end
또한 레일즈 응용 프로그램의 현재 환경을 로드할 수 있습니다.
desc "Testing environment"
task: :hello => :environment do
puts "Hello #{User.first.name}."
end
제가 하고 싶은 것은 변수와 환경을 가질 수 있는 것입니다.
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
그러나 유효한 작업 호출이 아닙니다.제가 어떻게 이 일을 해낼 수 있는지 아는 사람?
이 오래된 주제에 대한 후속 조치로, 여기 (오래 전부터) 현재 Rake 파일이 그곳에서 해야 한다고 생각합니다.현재 당첨 답변(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
이렇게 호출합니다(http://guides.rubyonrails.org/v4.2/command_line.html#rake) :
rake "hello[World]"
여러 인수의 경우 작업 선언 배열에 키워드를 추가하면 됩니다.task :hello, [:a,:b,:c]...
), 쉼표로 구분하여 전달합니다.
rake "hello[Earth,Mars,Sun,Pluto]"
참고: 인수 개수가 확인되지 않아 홀수 행성은 제외됩니다:)
TLDR;
task :t, [args] => [deps]
원답
인수를 전달하여 작업을 레이크할 때 :needs 옵션을 사용하여 환경을 요구할 수 있습니다.예:
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
아래 @Peiniau의 설명에 따라 업데이트됨
레일 > 3.1의 경우
task :t, arg, :needs => [deps] # deprecated
이용해주세요
task :t, [args] => [deps]
완전성을 위해 위에서 언급한 문서의 예를 다음에 제시합니다.
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
주의:
- 다음을 생략할 수 있습니다.
#with_defaults
분명히, 전화를 걸었습니다. - 다음을 사용해야 합니다.
Array
당신의 주장에 대해, 비록 하나라도. - 필수 구성 요소는 다음과 같을 필요가 없습니다.
Array
. args
의 예입니다.Rake::TaskArguments
.t
의 예입니다.Rake::Task
.
이에 대한 다른 방법은 OS 환경 변수를 사용하는 것입니다.이 접근 방식의 이점:
- 모든 종속 레이크 작업은 옵션을 받습니다.
- 구문은 이해하기 어렵고 시간이 지남에 따라 변하는 레이크 DSL에 의존하지 않고 훨씬 더 간단합니다.
세 가지 명령줄 옵션이 필요한 레이크 작업이 있습니다.호출 방법은 다음과 같습니다.
$ rake eaternet:import country=us region=or agency=multco
그것은 매우 깨끗하고, 단순하며, 제가 좋아하는 바쉬 구문입니다.여기 제 갈퀴 과제가 있습니다.또한 매우 깨끗하고 마법이 없습니다.
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
이 예제에서는 종속성의 사용을 보여주지 않습니다.하지만 만약에:import
작업은 다른 사람들에게 의존했고, 그들은 또한 이러한 옵션에 접근할 수 있습니다.그러나 일반적인 갈퀴 옵션 방법을 사용하면 그렇지 않습니다.
이러한 해결책은 효과가 있지만, 제 생각에는 이것은 지나치게 복잡합니다.
또한 zsh에서 이런 식으로 하면 배열의 대괄호가 '\'로 이스케이프되지 않으면 오류가 발생합니다.
ARGV 어레이를 사용하는 것이 좋습니다. ARGV 어레이는 잘 작동하고 훨씬 간단하며 오류가 발생하기 쉽습니다.예:
namespace :my_example do
desc "Something"
task :my_task => :environment do
puts ARGV.inspect
end
end
그리고나서
rake my_example:my_task 1 2 3
#=> ["my_example:my_task", "1", "2", "3"]
ARGV[0]는 프로세스 이름이므로 ARGV[1...-1]만 사용해야 합니다.
엄밀히 말하면 이것은 해결책의 일부로 환경을 사용하지 않기 때문에 질문에 답하지 않는다는 것을 알고 있습니다.그러나 OP는 그가 그 조항을 포함한 이유를 밝히지 않아 그의 사용 사례에 여전히 적용될 수 있습니다.
언급URL : https://stackoverflow.com/questions/1357639/how-to-pass-arguments-into-a-rake-task-with-environment-in-rails
'bestsource' 카테고리의 다른 글
Wordpress customizer 사용자 지정 제어 전송 postMessage가 작동하지 않음 (0) | 2023.06.18 |
---|---|
CSV를 읽을 때 팬더의 인덱스 열 제거 (0) | 2023.06.18 |
배치 파일에서 절전 중 (0) | 2023.06.18 |
ELF 단면 및 기호의 크기를 분석하는 도구 (0) | 2023.06.18 |
Vuex 계산 속성은 경로가 변경된 후 다시 변경된 경우에만 업데이트됩니다. (0) | 2023.06.18 |