IT story

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

hot-time 2020. 4. 29. 08:12
반응형

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


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

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

unexpected return

레이크 작업은 기본적으로 블록입니다. 람다를 제외한 블록은 리턴을 지원하지 않지만 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

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


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


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

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

여러 블록 수준에서 벗어나 려면 fail 을 사용할 있습니다.

예를 들어

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

https://stackoverflow.com/a/3753955/11543을 참조 하십시오 .


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


오류로 반환 ❌

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

task :check do
  errors = get_errors

  abort( "There are #{errors.count} errors!" ) if errors.any?

  # Do remaining checks...
end

명령 행에서 :

$ rake check && echo "All good"
#=> There are 2 errors!

성공으로 돌아 가기 ✅

If you're returning without an error (i.e. an exit code of 0) you'll want to use exit, which does not take a string param.

task :check do
  errors = get_errors

  exit if errors.empty?

  # Process errors...
end

On the command line:

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

This is important if you're using this in a cron job or something that needs to do something afterwards based on whether the rake task was successful or not.


I used next approach suggested by Simone Carletti, since when testing rake task, abort, which in fact is just a wrapper for exit, is not the desired behavior.

Example:

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

반응형