2010-01-10 4 views
4

Чтобы избежать случайного «рейка db: reset» в нашей производственной среде, я думал об отключении «rake db: reset» и связанных с ним задач, которые удаляют базу данных в рабочей среде. Есть ли простой способ сделать это, или мне нужно переопределить задачу рейка?Отключение задания Rails: сброс

Есть ли лучшая альтернатива?

ответ

7

В файле Рейк вы можете добавить

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

и команда не доступна больше. Если вы хотите отключить несколько команд, поместите их в метод remove_task для удобства чтения.

Но лучше альтернативы, похоже, просто не введите команду rake db:reset, которая не является чем-то, что вы случайно набрали.

Имея хорошую резервную копию вашей (производственной) базы данных, также является лучшим решением, я полагаю.

+2

Rake :: Task ['db: reset']. Clear_actions кажется проще в использовании. – Veger

+0

Во-вторых, резервные копии, не говоря уже о блокировке рабочей среды, доступ к которой возможен только у пары людей. –

+0

Veger: «Но лучше альтернативы, похоже, просто не набирать rake db: reset command» ... в идеале, да, но граблиные задачи могут вызывать друг друга, поэтому иногда быть осторожным является оправданным. –

0

Вы всегда можете перезаписать дб: сбросить задачу с чем-то, как это в Lib/db.rake:

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 
+0

Я не думаю, что это сработает. «По умолчанию Rake Tasks добавляет поведение каждый раз, когда они определены» в соответствии с http://blog.jayfields.com/2008/02/rake-task-overwriting.html. Таким образом, ваша попытка «перезаписать» сброс не удастся. Сброс все равно произойдет. Правильно? –

0

Для записи, у нас есть приложение, связывая в наши живые производственных базы данных, мы используем тест логин детали, а оттуда - тестовая БД.

Последнее, что мы хотели, было для рельсов уничтожить или схему базы данных при запуске rspec/unit tests.

использование информации этот вопрос и здесь: 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 позволило нам удалить все дб : грабли задачи, как можно увидеть здесь:

[[email protected] app1{master}]$ rake -T db 
[[email protected] app1{master}]$ 

с небольшой настройки это может быть сделано, чтобы отключить на окружающую среду на основе

Update:

Слово предупреждения делает это для БД имен сломал testunit и требовалось добавить Аддисон:

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

Append это на 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

2

поместить это в Lib/задач/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.

0

Вы также можете использовать rails_db_protect gem.

Вы просто добавить драгоценный камень, и он автоматически предотвращает запуск следующих опасные задач в производстве:

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

Если у вас есть производственная среда, как перевалочная среда, где вы хотите, чтобы иметь возможность запускать эти задачи, вы можете настроить среду, чтобы его:

ENV['ALLOW_DANGEROUS_TASKS'] = 'true' 

Существует также драгоценный камень rails-safe-tasks, который позволяет использовать более сложную конфигурацию, но не содержит каких-либо тестов, поддерживающих его.

Смежные вопросы