2016-04-05 32 views
9

Sono stato sorpreso di scoprire che, quando rake db:drop (e assumedly Rails altri built-in raketasks) fallisce, il codice di stato bash è 0.Perché `rake db: drop` ha uno stato di uscita 0 e non genera alcun errore, quando fallisce?

$ rake db:drop 
could not connect to server: Connection refused 
Is the server running on host "localhost" (::1) and accepting 
TCP/IP connections on port 5432? 
... 
$ echo $? 
0 

forse più sorprendente, che non ha nemmeno sollevare un errore quando l'attività è invocata dall'interno di Rails.

2.3.0 :001 > begin 
2.3.0 :002 > Rake::Task["db:drop"].invoke 
2.3.0 :003 > puts "After raketask invoked" 
2.3.0 :004 > end 
could not connect to server: Connection refused 
Is the server running on host "localhost" (::1) and accepting 
TCP/IP connections on port 5432? 
... 
After raketask invoked 

È intenzionale? Scavando nel source, questo sembra semplicemente chiamare execute "DROP DATABASE IF EXISTS #{quote_table_name(name)}". Questo dovrebbe raise an error in caso di fallimento. Cosa mi manca?

+1

Non vuoi '$?' E non '$!'? – Shelvacu

+0

Buona cattura, ha modificato l'errore, grazie. –

+0

Quello che ti manca è una richiesta pull e un riferimento agli sviluppatori di Ruby come gestire gli errori in Unix come i sistemi operativi e come impostare il valore di uscita di un'applicazione CLI come rake :) – Istvan

risposta

1

questo è un problema risolto in Rails 5: PR #19924 Explicitly exit with status "1" for create and drop failures

soluzione migliore sarebbe quella di utilizzare Rails 5. :) In caso contrario, sei bloccato con uno di:

  • Controllare che il db era lasciato cadere in un altro modo (potrebbe perdere altri errori).
  • Capture uscita stderr e ispezionare
  • Monkeypatch ActiveRecord :: Compiti :: :: DatabaseTasks goccia