изменение среды в граблях - PullRequest
1 голос
/ 28 ноября 2011

Я разрабатываю Rails v2.3 приложение с MySQL базой данных и mysql2 gem . Я столкнулся со странной ситуацией, которая заключается в изменении среды в rake task.

(все мои настройки и конфигурации для среды и базы данных верны, для этого нет проблем.)

Вот моя простая история:

У меня есть грабли, например:

namespace :db do
   task :do_something => :environment do
       #1. run under 'development' environment
       my_helper.run_under_development_env

       #2. change to 'custom' environment 
       RAILS_ENV='custom'

       Rake::Task['db:create']
       Rake::Task['db:migrate']

       #3. change back to 'development' environment
       RAILS_ENV='development'

       #4. But it still run in 'customer' environment, why?
       my_helper.run_under_development_env 
   end

end

Задача rake довольно проста:

1. Сначала запустите метод из my_helper в среде " development "

2. Затем перейдите в среду " custom " и запустите db:create и db:migrate

до сих пор все нормально, среда изменилась на " custom "

3. Затем верните его обратно в среду " development "

4. снова запустить вспомогательный метод в среде " development "

Но, хотя на шаге 3 я снова изменил среду на " development ", последний метод все еще выполняется в среде " custom ", почему? и как от этого избавиться?

--- P.S. ---

Я также проверил сообщение , связанное с изменением среды, здесь и попытался использовать там решение (на шаге 2):

#2. change to 'custom' database
ActiveRecord::Base.establish_connection('custom')
Rake::Task['db:create']
Rake::Task['db:migrate']

для изменения соединения с базой данных вместо изменения среды, но db:create и db:migrate будут по-прежнему работать в базе данных " development ", хотя в сообщении, в котором говорится, что оно должно работать для " custom"база данных ... странно

--------------- важное обновление ---------------------

Я просто понимаю, что код в шаге 2:

#2. change to 'custom' environment 
RAILS_ENV='custom'

Rake::Task['db:create']
Rake::Task['db:migrate']

меняет среду на " custom " , только если вызывается Rake::Task['db:create'], если я закомментирую строку Rake::Task['db:create'], код все равно будет запущен при разработке

#2. change to 'custom' environment 
RAILS_ENV='custom'

#Rake::Task['db:create']
#CODE WILL RUN STILL UNDER 'development' environment.

Почему Rake::Task['db:create'] влияет на изменение среды в моем случае ...?

Ответы [ 2 ]

3 голосов
/ 25 декабря 2011

Я понимаю, что этот вопрос более месяца назад, но что они, чёрт возьми, - это Рождество

похоже, что выполнение каждой задачи rake в своем собственном процессе упростит задачу при переключении сред?

namespace :db do
    task :do_something => :environment do
        unless Rails.env.development? then
           raise "Can only run under development environment, but specified env was #{Rails.env}"
        end 

        #1. run under 'development' environment
        my_helper.run_under_development_env

        #2. do the giggity with custom environment
        command = "bundle exec rake db:create RAILS_ENV=custom"    
        result = %x[#{command}]
        raise "rake task failed..........\n#{result}" if result.include?('rake aborted!')

        command = "bundle exec rake db:migrate RAILS_ENV=custom"    
        result = %x[#{command}]
        raise "rake task failed..........\n#{result}" if result.include?('rake aborted!')


        #3. back to development
        my_helper.run_under_development_env 
    end
end
1 голос
/ 21 августа 2018

просто введите после грабли RAILS_ENV = 'production'

в вашем случае

rake db: do_something RAILS_ENV = 'custom'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...