programing

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

bestprogram 2023. 6. 11. 11:05

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

처음에 몇 가지 검사를 하는 레이크 작업이 있는데, 검사 중 하나가 실패하면 레이크 작업에서 조기에 돌아와 나머지 코드를 실행하고 싶지 않습니다.

코드에서 반환하고 싶은 곳에 반환을 하는 것이 해결책일 것이라고 생각했는데 다음 오류가 발생합니다.

unexpected return

레이크 작업은 기본적으로 블록입니다.람다를 제외한 블록은 반환을 지원하지 않지만 다음 문장으로 건너뛸 수 있습니다.next갈퀴 작업에서 방법에 리턴을 사용하는 것과 동일한 효과를 갖는 것.

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

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

task :foo do
  do_something
end

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

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

사용할 수 있습니다.abort(message)작업 내부에서 메시지와 함께 해당 작업을 중단합니다.

오류 ❌와 함께 반환

오류(예: 종료 코드)를 반환하는 경우1를 사용할 수 있으며, 종료 시 출력되는 선택적 문자열 매개변수도 사용할 수 있습니다.

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문자열 매개 변수를 사용하지 않는 를 사용할 수 있습니다.

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

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


보너스: 오류와 함께 반환rescue스택 추적이 없는 블록.

기본적으로 사용할 경우abort의 내부에rescue블록, 당신이 단지 사용하더라도, 그것은 전체 스택 추적을 출력할 것입니다.abort오류를 다시 제기하지 않고.

이 문제를 해결하려면 0이 아닌 종료 코드를 다음에 제공할 수 있습니다.exit명령, 예:


task :check do

  begin
    do_the_thing_that_raises_an_exception
  rescue => error
    puts error.message
 
    exit( 1 )
  end

end

사용하는 편입니다.abort이러한 상황에서 더 나은 대안은 다음과 같습니다.

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

여러 블럭 수준을 분리해야 하는 경우 실패를 사용할 수 있습니다.

예를들면

task :something do
  [1,2,3].each do |i|
    ...
    fail "some error" if ...
  end
end

(https://stackoverflow.com/a/3753955/11543.) 참조)

"rake aborted!" 메시지를 인쇄하지 않고 레이크 작업을 종료하는 것을 의미하는 경우 "abort" 또는 "exit"를 사용할 수 있습니다.그러나 "abort"는 복구 블록에 사용될 때 작업을 종료하고 전체 오류를 인쇄합니다(--trace를 사용하지 않더라도).그래서 "출구"가 제가 사용하는 것입니다.

사용한next레이크 과제를 테스트할 때부터 Simone Carletti가 제안한 접근법.abort사실 그것은 단지 포장지일 뿐입니다.exit원하는 동작이 아닙니다.

예:

task auto_invoice: :environment do
  if Application.feature_disabled?(:auto_invoice)
    $stderr.puts 'Feature is disabled, aborting.'
  next
end

언급URL : https://stackoverflow.com/questions/2316475/how-do-i-return-early-from-a-rake-task