bestsource

레일즈의 환경에서 Rake 작업에 인수를 전달하는 방법은 무엇입니까?

bestsource 2023. 6. 18. 16:10
반응형

레일즈의 환경에서 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

반응형