为了避免在我们的生产环境中意外“rake db:reset”,我考虑禁用“rake db:reset”以及在生产环境中删除数据库的相关任务。有没有一种简单的方法可以做到这一点,还是我必须重新定义rake任务?
有更好的选择吗?
答案 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:reset
和rake 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允许更多配置,但似乎没有任何支持它的测试。