2016-04-05 12 views
9

Byłem zaskoczony, aby dowiedzieć się, że gdy rake db:drop (i przypuszczalnie Szyny inne wbudowane w raketasks) nie powiedzie się, kod stanu bash jest 0.Dlaczego "rake db: drop` ma status wyjścia 0 i nie wywołuje błędu, gdy się nie powiedzie?

$ 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 

Być może bardziej zaskakujące, że nawet nie podnieść błąd gdy zadanie jest wywoływane z poziomu 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 

Czy jest to zamierzone? Kopiowanie do source, wydaje się, że po prostu zadzwoń execute "DROP DATABASE IF EXISTS #{quote_table_name(name)}". To powinno być raise an error po awarii. czego mi brakuje?

+1

Nie chcesz '$?' '$ i nie!'? – Shelvacu

+0

Dobry połów, zredagowałem błąd, dzięki. –

+0

To, czego brakuje, to żądanie ściągnięcia i referencje do deweloperów Ruby, jak radzić sobie z błędami w systemach typu Unix, jak i jak ustawić wartość wyjściową aplikacji CLI jak rake :) – Istvan

Odpowiedz

1

Jest to problem rozwiązany w Rails 5: PR #19924 Explicitly exit with status "1" for create and drop failures

Najlepszym rozwiązaniem byłoby wykorzystanie Rails 5. :) W przeciwnym razie utkniesz z jednym:

  • Sprawdź, czy był db spadł w inny sposób (mógł ominąć inne błędy). wyjście stderr
  • Przechwytywanie i skontrolować
  • Monkeypatch ActiveRecord :: Zadania :: DatabaseTasks :: upuść
Powiązane problemy