禁用Rails的db:reset任务

时间:2010-01-10 03:13:26

标签: ruby-on-rails

为了避免在我们的生产环境中意外“rake db:reset”,我考虑禁用“rake db:reset”以及在生产环境中删除数据库的相关任务。有没有一种简单的方法可以做到这一点,还是我必须重新定义rake任务?

有更好的选择吗?

6 个答案:

答案 0 :(得分:7)

在您的Rake文件中,您可以添加

Rake.application.instance_variable_get('@tasks').delete('db:reset')

并且该命令不再可用。如果要禁用多个命令,请将其放在remove_task方法中以便于阅读。

但更好的替代方案似乎只是不输入rake db:reset命令,这不是你不小心输入的内容。

我认为拥有一个很好的(生产)数据库备份也是一个更好的解决方案。

答案 1 :(得分:2)

将它放在lib / tasks / db.rake中:

if Rails.env == 'production'
  tasks = Rake.application.instance_variable_get '@tasks'
  tasks.delete 'db:reset'
  tasks.delete 'db:drop'
  namespace :db do
    desc 'db:reset not available in this environment'
    task :reset do
      puts 'db:reset has been disabled'
    end
    desc 'db:drop not available in this environment'
    task :drop do
      puts 'db:drop has been disabled'
    end
  end
end

找到here

答案 2 :(得分:1)

将此附加到您的Rakefile上。

namespace :db do
  task :drop => :abort_on_production
end
task :abort_on_production do
  abort "Don't drop production database. aborted. " if Rails.env.production?
end

它还会阻止rake db:resetrake db:migrate:reset,因为他们会调用db:drop

答案 3 :(得分:0)

你总是可以在lib / db.rake中用这样的东西覆盖db:reset任务:

namespace :db do
  desc 'Resets your database using your migrations for the current environment'
  task :reset do
    if RAILS_ENV == 'production'
      Rake::Task["db:drop"].invoke
      Rake::Task["db:create"].invoke
      Rake::Task["db:migrate"].invoke
    end
  end
end

答案 4 :(得分:0)

为了记录,我们有一个应用程序链接到我们的实时生产数据库,我们使用测试登录详细信息,并从那里shard's到测试数据库。

我们想要的最后一件事是在运行rspec / unit测试时删除rails或数据库架构。

使用信息是这个问题,在这里:Is it possible to get a list of all available rake tasks in a namespace?

我能够提出以下解决方案:

Rake.application.in_namespace(:db){|x|
  x.tasks.map{|t|
    Rake.application.instance_variable_get('@tasks').delete(t.name)
  }
}

这放在我们的Rakefile的末尾,使我们能够删除所有db:rake任务,如下所示:

[davidc@david-macbookp app1{master}]$ rake -T db
[davidc@david-macbookp app1{master}]$

稍微调整一下就可以在每个环境的基础上禁用

<强>更新

为db命名空间执行此操作的警告破坏了testunit并且需要添加addison:

namespace :db do
  task 'test:prepare' do
  end
end

答案 5 :(得分:0)

您也可以使用rails_db_protect gem

您只需添加gem即可自动阻止您在生产中运行以下危险任务:

db:setup db:reset db:drop db:create db:schema:load

如果您有生产环境,例如暂存环境,您希望能够运行这些任务,则可以配置环境以允许它:

ENV['ALLOW_DANGEROUS_TASKS'] = 'true'

还有gem rails-safe-tasks允许更多配置,但似乎没有任何支持它的测试。