갈퀴 작업에서 일찍 돌아가려면 어떻게해야합니까?


226

처음에 검사를하는 레이크 작업이 있습니다. 검사 중 하나가 실패하면 레이크 작업에서 일찍 반환하고 싶습니다. 남은 코드를 실행하고 싶지 않습니다.

해결책은 코드에서 반환하고 싶었던 곳에 반환하는 것이지만 다음과 같은 오류가 발생한다고 생각했습니다.

unexpected return

답변:


285

레이크 작업은 기본적으로 블록입니다. 람다를 제외한 블록은 리턴을 지원하지 않지만 next레이크 작업에서 메소드에서 리턴을 사용하는 것과 동일한 효과를 사용 하는 다음 명령문으로 건너 뛸 수 있습니다 .

task :foo do
  puts "printed"
  next
  puts "never printed"
end

또는 메소드에서 코드를 이동하고 메소드에서 return을 사용할 수 있습니다.

task :foo do
  do_something
end

def do_something
  puts "startd"
  return
  puts "end"
end

나는 두 번째 선택을 선호합니다.


18
나는 두 번째도 최고를 좋아합니다. 갈퀴를 많이 사용할수록 사소한 코드를 작업 정의 외부에 유지하는 것이 좋습니다. 100 % 확고한 규칙은 아니지만 작업하기에 좋은 지침 인 것 같습니다.
Mike Woodhouse

6
나는 노력했지만 break이 오류가 발생했습니다 : 갈퀴가 중단되었습니다! proc-closure에서 벗어나기 (--trace로 작업을 실행하여 전체 추적 참조)
pupeno

4
나는 다음을 사용하는 것을 선호합니다. 왜 조기 반품을 지원하기 위해 새로운 방법을 선언해야합니까?
Derek Greer

5
여러 블록 안에 깊이 중첩되어 있다면 어떻게해야합니까? ( next탈출 할 블록의 "레벨"에있는 경우에만 작동합니다.
mjs

3
경고 : Rake 작업에서 메서드를 선언하는 것은 네임 스페이스와 무관하게로드 된 모든 Rake 작업에 대해 전역이기 때문에 나쁜 생각입니다. 블록의 코드는 블록을 실행하는 모든 대상에 의해 여러 번 호출 될 수 있기 때문에 break 대신 다음이 사용됩니다 (.each 메소드 생각).
Leslie Viljoen

181

abort(message)작업 내부에서 메시지를 사용 하여 해당 작업을 중단 할 수 있습니다 .


5
@TylerRick 아니요, Kernel # abort 입니다.
Jo Liss

10
이 방법은 자동으로 종료 상태를 설정하므로 성공하지 못한 상황에서 종료하는 데 탁월합니다.
samuil

이것은 승자입니다. 또한 인수 오류에 대한 사용 피드백을 제공하는 쉬운 방법입니다.
David Hempy

인라인과보다 더 설명이 필요 next합니다. 그것을 사랑하십시오.
SomeSchmo

22

나는 abort그러한 상황에서 더 나은 대안 을 사용 하는 경향이 있습니다 .

task :foo do
  something = false
  abort 'Failed to proceed' unless something
end

1
그러나 종료 코드 abort1종료 하지 않고 어떻게합니까 ? 레이크 작업은 종종 명령 줄에서 성공 또는 실패를 결정하는 데 사용됩니다. "성공"이 abort있습니까?
Joshua Pinter

2
내 자신의 질문에 대답 : exit성공적으로 종료하는 좋은 방법 처럼 보입니다 .
Joshua Pinter

19

오류로 반환 ❌

오류 (예 : 종료 코드 ) 와 함께 반환 하는 경우을 1사용하려고합니다 abort.이 옵션은 종료시 출력되는 선택적 문자열 매개 변수를 사용합니다.

task :check do

  # If any of your checks fail, you can exit early like this.
  abort( "One of the checks has failed!" ) if check_failed?

end

명령 행에서 :

$ rake check && echo "All good"
#=> One of the checks has failed!

성공으로 돌아 가기 ✅

당신이 반환하는 경우 없이 (즉, 종료 코드 오류 0)를 사용하는 것이 좋습니다 exit, 이는 하지 않는 문자열 PARAM을.

task :check do

  # If any of your checks fail, you can exit early like this.
  exit if check_failed?

end

명령 행에서 :

$ rake check && echo "All good"
#=> All good

cron 작업에서이 작업을 사용하는 경우 또는 레이크 작업의 성공 여부에 따라 나중에 무언가를 수행해야하는 경우에 중요합니다.



8

"갈퀴가 중단되었습니다!"를 발생시키지 않고 갈퀴 작업을 종료하려는 경우 메시지가 인쇄되면 "중단"또는 "종료"를 사용할 수 있습니다. 그러나 복구 블록에서 사용될 때 "중단"은 작업을 종료하고 전체 오류를 인쇄합니다 (--trace를 사용하지 않더라도). 그래서 "종료"는 내가 사용하는 것입니다.


3
일반적으로 return / break 대신 "exit"를 사용하는 것은 현재 proc / method / etc 에서 벗어나지 않기 때문에 나쁜 생각이라고 생각합니다 . -전체 프로세스를 종료하고 호출자 메서드가 나중에 실행되도록 의도 한 코드 (일부 정리 포함)를 건너 뜁니다. 그러나 레이크 작업의 경우 아마도 문제가되지 않을 것 같습니다 ...
Tyler Rick

0

나는 nextSimone Carletti가 제안한 접근 방식을 사용 했다. 왜냐하면 갈퀴 작업을 테스트 할 때 abort실제로 래퍼 일뿐 아니라 exit원하는 동작이 아니기 때문이다.

예:

task auto_invoice: :environment do
  if Application.feature_disabled?(:auto_invoice)
    $stderr.puts 'Feature is disabled, aborting.'
  next
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.