196

이 질문에는 이미 답변이 있습니다.

저는 다음과 같이 논증을 전달할 수 있습니다 :

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

Rails 애플리케이션의 현재 환경을로드 할 수도있다.

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

그러나 이것은 유효한 작업 호출이 아닙니다. 아무도 내가 이것을 어떻게 달성 할 수 있는지 안다?


  • 당신은 inger의 새로운 대답을 받아들이 기 위해 업데이트 할 수 있습니까? - mahemoff

5 답변


106

TLDR;

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

원문 답변

rake 작업에 인수를 전달할 때 : 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 님의 댓글 당 업데이트 됨

Rails> 3.1에 관해서

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

사용 해주세요

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


  • 가장 최신 문서는:needs이 방식은 : "해당 형식은 여전히 호환성을 위해 지원되지만 사용하는 것은 바람직하지 않습니다." (나는 미래의 브라우저들에 대해서만 언급한다.:needs더 이상 지원되지 않습니다. 이 섹션은 & quot; 사용되지 않는 작업 매개 변수 형식 & quot;이라고합니다 ...) - Telemachus
  • 이 코드의 버그 : & quot; Hello # {User.first.name}. # {: message} & quot; ...이 메시지는 & quot; 메시지 & quot;라는 '로그인 해 주셔서 감사합니다'라는 메시지를 인쇄하지 않습니다. 수정 : # {args.message} 마지막 substition에 대해. - inger
  • Rails 3.1 & # 39; task : t, arg, : needs = & gt; [deps] & # 39; 사용되지 않습니다. & tt; task : t, [args] = & gt;를 사용하십시오. [deps] & # 39; 대신. - Peiniau
  • 예를 들어 이전 주석을 명확히하기 위해, 나는 이것이 잘 될 것이라고 믿는다.task :hello, [:message] => [:environment] do |t, args|. - Jason Swett
  • 추가 설명 : 여러 인수를 전달하려면,task :hello, [:message1, :message2] => [:environment] do |t, args|작품을 사용하고rake hello['message #1','message #2']. 경고 : 인수 목록에 일반 텍스트가 포함 된 경우 레이크가 실패하는 것으로 나타났습니다 (예 :rake hello['message #1', 'message #2'](쉼표 뒤에 공백을 적어 두십시오). - Steve Wilhelm

354

이 오래된 주제에 대해 후속 조치를 취하십시오. 여기 내가 현재의 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]" 

인수가 여러 개인 경우 키워드를 작업 선언 배열에 추가하면됩니다 (task :hello, [:a,:b,:c]...), 쉼표로 구분하여 전달합니다.

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

참고 : 인수의 수는 확인되지 않으므로 이상한 행성은 빠져 있습니다. :)


  • 이 대답은 받아 들여지는 대답이어야합니다. - samvermette
  • 남자 ... 레이크는 항상 내게 너무 루비 같은 느낌. 루비의 첫 번째 추측은 실제로 어떻게 작동하는지입니다. 이 구문은 기괴합니다. & lt; / rant & gt; - Brian Armstrong
  • 2 개의 인수를 보내려면 작업 : hello, [: arg1, : arg2] = & gt; : 환경 do | t, args | - konyak
  • [: arg1, : arg2] 사이에 공백없이 2 개의 인수를 전송하려면, - hbin
  • @hbin Ah 그래서 이것은 Rakefile (ChaseT의 주석이 언급 한) 내에서 Rakefile이 아닌 Rake를 호출했을 때 일어났습니다. 그래, 그 경우에는 쉘 규칙에 따라 하나의 쉘 단어 (공백 없음) 또는 공백을 인용하거나, 모든 것을 둘러싼 따옴표를 사용하십시오rake 'webp:convert["hello", "world"]'경고 : 나는 지금 이것을 시도하지 않았지만 효과가있다. - inger

57

완전성을 위해 여기에서워드 프로세서위에 언급했듯이:

   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.


  • 이것은 왜args.empty?저에게 이상한 결과를주었습니다.args해시처럼 보이지만Rake::TaskArguments. 따라서 args가 전달되지 않을 때 특별한 동작을 원하면 call#to_hash또는#to_s다음을 확인하기 전에args비었다. - Dennis

18

이것에 대한 다른 방법 : OS 환경 변수를 사용하십시오. 이 접근법의 이점 :

  • 모든 종속 레이크 작업에 옵션이 제공됩니다.
  • 문법은 레이크 DSL에 의존하지 않고 훨씬 더 간단합니다. 시간이 지남에 따라 달라지기 쉽습니다.

세 가지 명령 줄 옵션이 필요한 레이크 작업이 있습니다. 다음은 내가 호출하는 방법입니다.

$ 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

이 특정 예제는 종속성 사용을 표시하지 않습니다. 그러나:import작업이 다른 작업에 의존했기 때문에 이러한 옵션에 액세스 할 수도있었습니다. 그러나 일반적인 레이크 옵션 방법을 사용하면 그렇지 않을 것입니다.


  • 이것은 확실히 환경 변수가 아닙니다! 그것~이다.갈퀴인수들레이크 (rake)가 그것을 환경 변수로 나타내지 만. 거대한 개념 (그리고 실용적인) 차이점이 있습니다! 유의 사항country=us ruby -e "puts ENV['country']"같지 않다.ruby -e "puts ENV['country']" country=us(첫 번째 환경 변수와 두 번째 환경 변수). - Djunzu

6

이러한 솔루션이 작동하는 동안 내 의견으로는 지나치게 복잡합니다.

또한 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 [0]이 프로세스 이름이므로 ARGV [1 .. -1] 만 사용하십시오.

나는 엄밀히 말하면 이것이 솔루션의 일부인 환경을 사용하지 않기 때문에 질문에 답하지 못한다는 것을 알고 있습니다. 그러나 OP는 그가 왜 그 규정을 포함 시켰는지 진술하지 않았으므로 그의 유스 케이스에도 여전히 적용될 수 있습니다.


  • :environmentRails 애플리케이션 코드를로드하는 데 필요합니다. Rails 앱에서이 기능을 사용하면 다음과 같은 결과를 얻을 수 있습니다.["my_example:my_task", "1", "2", "3"] rake aborted! Don't know how to build task '1' (see --tasks) - Djunzu
  • 이게 정확히 내가 찾고 있었던거야. - Paul Brunache

연결된 질문


관련된 질문

최근 질문