Come posso tornare presto da un'attività di rake?


226

Ho un'attività di rake in cui eseguo alcuni controlli all'inizio, se uno di questi fallisce, vorrei tornare presto dall'attività di rake, non voglio eseguire il resto del codice.

Ho pensato che la soluzione sarebbe stata quella di inserire un ritorno dove volevo tornare dal codice ma ho ricevuto il seguente errore

unexpected return

Risposte:


285

Un'attività Rake è fondamentalmente un blocco. Un blocco, ad eccezione di lambdas, non supporta il ritorno ma è possibile saltare all'istruzione successiva usando nextquale in un'attività di rake ha lo stesso effetto dell'uso di ritorno in un metodo.

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

Oppure puoi spostare il codice in un metodo e usare return nel metodo.

task :foo do
  do_something
end

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

Preferisco la seconda scelta.


18
Mi piace anche la seconda. Più utilizzo il rake, più mi piace mantenere il codice non banale al di fuori della definizione dell'attività. Non è una regola ferma al 100%, ma sembra essere una buona linea guida su cui lavorare.
Mike Woodhouse,

6
Ci ho provato breake ho questo errore: rake interrotto! break from proc-closing (Vedi la traccia completa eseguendo task con --trace)
pupeno

4
Preferisco usare il prossimo. Perché dovremmo dichiarare un nuovo metodo solo per supportare i resi anticipati?
Derek Greer,

5
Cosa fai se sei profondamente annidato in più blocchi? ( nextFunziona solo se c'è un "livello" di blocco da cui uscire.
mjs

3
Avvertenza: dichiarare i metodi nelle attività Rake è una cattiva idea perché sono globali per tutte le attività Rake caricate, non pertinenti allo spazio dei nomi. Successivamente si usa invece di break perché il codice nel blocco può essere chiamato più volte da qualunque cosa stia eseguendo il blocco (si pensi al metodo .each).
Leslie Viljoen,

181

È possibile utilizzare abort(message)dall'interno dell'attività per interrompere l'attività con un messaggio.


5
@TylerRick No, è l' interruzione del kernel # .
Jo Liss,

10
In questo modo è superiore per uscire in situazioni di non successo in quanto imposta automaticamente lo stato di uscita.
samuil,

Questo è un vincitore Anche un modo semplice per fornire feedback sull'utilizzo per errori di argomento.
David Hempy,

In linea e molto più esplicativo di next. Lo adoro.
SomeSchmo

22

Tendo a utilizzare abortquale sia un'alternativa migliore in tali situazioni, ad esempio:

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

1
Ma come si fa a abortuscire senza un 1codice di uscita? Le attività di rake vengono spesso utilizzate nella riga di comando per determinare l'esito positivo o negativo. C'è un "successo" abort?
Joshua Pinter

2
Ho risposto alle mie domande: sembra exitun buon modo per uscire con successo.
Joshua Pinter

19

Ritorna con un errore ❌

Se stai tornando con un errore (cioè un codice di uscita di 1), ti consigliamo di utilizzare abort, che accetta anche un parametro stringa opzionale che verrà emesso all'uscita:

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

Sulla riga di comando:

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

Ritorna con successo ✅

Se stai tornando senza errori (ovvero un codice di uscita di 0), ti consigliamo di utilizzare exit, che non accetta un parametro stringa.

task :check do

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

end

Sulla riga di comando:

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

Questo è importante se lo stai usando in un cron job o qualcosa che deve fare qualcosa in seguito, a seconda che l'attività rake abbia avuto successo o meno.



8

Se intendevi uscire da un'attività di rake senza causare il "rake interrotto!" messaggio da stampare, quindi è possibile utilizzare "abort" o "exit". Ma "abort", quando usato in un blocco di salvataggio, termina l'attività e stampa l'intero errore (anche senza usare --trace). Quindi "exit" è quello che uso.


3
In generale, penso che usare "exit" invece di return / break sia una cattiva idea poiché non si limita a saltare dall'attuale proc / method / etc. - esce dall'intero processo e salta qualsiasi codice che il metodo del chiamante potrebbe aver intenzione di essere eseguito in seguito (incluso eventualmente un po 'di pulizia). Ma per un compito rastrellato credo che probabilmente non sia un problema ...
Tyler Rick,

0

Ho usato l' nextapproccio suggerito da Simone Carletti, dato che quando si esegue il test del rake task abort, che in realtà è solo un wrapper exit, non è il comportamento desiderato.

Esempio:

task auto_invoice: :environment do
  if Application.feature_disabled?(:auto_invoice)
    $stderr.puts 'Feature is disabled, aborting.'
  next
end
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.