【问题标题】:Why does `rake db:drop` have a 0 exit status, and raise no error, when it fails?为什么 rake db:drop 失败时退出状态为 0,并且没有引发错误?
【发布时间】:2016-04-05 23:54:11
【问题描述】:

我惊讶地发现,当rake db:drop(假设是 Rails 的其他内置 raketasks)失败时,bash 状态码为 0。

$ 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

也许更令人惊讶的是,当从 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

这是故意的吗?深入研究source,这似乎只是调用execute "DROP DATABASE IF EXISTS #{quote_table_name(name)}"。这应该raise an error 失败。我错过了什么?

【问题讨论】:

  • 你不想要$? 而不是$!
  • 很好,把错误编辑掉了,谢谢。
  • 您缺少的是拉取请求和对 Ruby 开发人员如何处理 Unix(如操作系统)中的错误以及如何设置 CLI 应用程序(如 rake)的退出值的参考 :)
  • 我认为这是 Rails 级别的问题,而不是 Ruby 级别的问题:当通用 raketask 失败时,它会给出非零退出代码。
  • @Istvan:也许我错过了你的观点。您的意思是暗示这是一个真正的错误,我应该向 Rails 提交修复吗?我认为这是有充分理由的,我忽略了!

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 activerecord


【解决方案1】:

这是在 Rails 5 中修复的问题:PR #19924 Explicitly exit with status "1" for create and drop failures

最好的解决方案是使用 Rails 5。:) 否则,您会遇到以下问题之一:

  • 检查数据库是否以其他方式删除(可能会遗漏其他错误)。
  • 捕获标准错误输出并检查
  • Monkeypatch ActiveRecord::Tasks::DatabaseTasks::drop

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2018-01-31
    • 1970-01-01
    • 2016-09-16
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多