복붙노트

[RUBY-ON-RAILS] 어떻게 레일에 환경과 레이크 작업에 인수를 전달하는 방법? [복제]

RUBY-ON-RAILS

어떻게 레일에 환경과 레이크 작업에 인수를 전달하는 방법? [복제]

나는 다음과 같이 인수에 통과 할 수 있어요 :

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

그러나 그것은 유효한 작업을 호출하지 않습니다. 누구 알고 나는 이것을 달성 할 수 있는가하는 방법?

해결법

  1. ==============================

    1.

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

    당신이 레이크 작업에 인수를 전달하는 경우, 당신은을 사용하여 환경을 필요로 할 수 있습니다 옵션이 필요합니다. 예를 들면 :

    
    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] 
    
  2. ==============================

    2.그냥이 오래된 주제에 대한 후속 조치; 여기에 내가 (오래 전부터) 현재 Rakefile 생각이해야 할 일입니다. 그것은 현재의 경력 답 (hgimenez)의 업그레이드 및 버그가 잡힌 버전입니다 :

    그냥이 오래된 주제에 대한 후속 조치; 여기에 내가 (오래 전부터) 현재 Rakefile 생각이해야 할 일입니다. 그것은 현재의 경력 답 (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]" 
    

    (... [C : B :을, 안녕 작업), 그 쉼표로 구분 통과 다중 인수 단지 태스크 선언의 배열에 그 키워드를 추가

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

    참고 : 이상한 행성이 탈락되도록 인수의 수는 확인하지 않습니다 :)

  3. ==============================

    3.그냥 완성도, 여기에 문서의 예는 위에서 언급 한 :

    그냥 완성도, 여기에 문서의 예는 위에서 언급 한 :

       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
    

    노트:

  4. ==============================

    4.또 다른 방법은 이것에 대해 이동 : 사용 OS 환경 변수를. 이 방법의 장점 :

    또 다른 방법은 이것에 대해 이동 : 사용 OS 환경 변수를. 이 방법의 장점 :

    나는 세 가지 명령 줄 옵션을 필요로하는 레이크 작업을해야합니다. 여기에 내가 그것을 호출하는 방법은 다음과 같습니다

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

    즉 내가 좋아하는 매우 깨끗하고, 간단한, 그냥 bash는 구문입니다. 여기 내 레이크 작업입니다. 또한 매우 깨끗하고 마법 :

    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
    

    이 특별한 예는 종속의 사용을 표시하지 않습니다. 하지만 : 가져 오기 작업이 다른 사람에 의존 않았다, 그들은 또한이 옵션에 액세스 할 수있는 것입니다. 일반 레이크 옵션 방법을 사용하여, 그들은하지 않을 것입니다.

  5. ==============================

    5.이 솔루션은 작업하는 동안, 내 의견이 지나치게 복잡하다.

    이 솔루션은 작업하는 동안, 내 의견이 지나치게 복잡하다.

    당신이 zsh을에서 이런 식으로 할 경우 배열의 브라켓과 함께 탈출하지 않는 경우 또한, 당신은 오류를 얻을 것이다 '\'.

    나는 잘 작동 훨씬 간단하고, 오류가 적은 경향이있는 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 [1 ..- 1]를 사용, ARGV [0] 프로세스 이름이라는 것이다.

    솔루션의 일환으로 환경 : 나는 그것을 사용하지 않는 엄격하게이 말하는 것은, 질문에 대답하지 않는 것을 알고 있습니다. 그러나 영업 이익은 여전히 ​​자신의 사용 사례에 적용 할 수 있도록 그가 그 규정을 포함하는 이유 상태하지 않았다.

  6. from https://stackoverflow.com/questions/1357639/how-to-pass-arguments-into-a-rake-task-with-environment-in-rails by cc-by-sa and MIT license