【问题标题】:environment change in rake taskrake 任务中的环境变化
【发布时间】:2011-11-28 09:41:27
【问题描述】:

我正在开发带有 MySQL 数据库和 mysql2 gemRails v2.3 应用程序。我遇到了一个奇怪的情况,即在 rake 任务中改变环境

(我对环境和数据库的所有设置和配置都是正确的,没问题。)

这是我的简单故事:

我有一个像下面这样的 rake 任务:

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.首先,在“development”环境下从my_helper运行一个方法

2.然后,切换到“custom”环境并运行db:createdb:migrate

到现在为止,一切都很好,环境确实变成了“custom

3.然后,再次将其改回“开发”环境

4.在“development”环境下再次运行辅助方法

但是,虽然我在步骤 3 中将环境改回了“development”,但最后一个方法仍然在“custom”环境中运行,为什么?以及如何摆脱它?

--- ---

我还查看了related with environment change here 的帖子,并尝试使用那里的解决方案(在第 2 步中):

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

要更改数据库连接而不是更改环境,但是db:createdb:migrate 仍将在“development”数据库下运行,尽管链接的帖子说它应该运行在“自定义”数据库......奇怪

---------------重要更新---------

我才意识到步骤 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'] 在我的情况下会影响环境变化...?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1


    【解决方案1】:

    我知道这个问题是在一个多月前提出的,但他们到底是什么——今天是圣诞节

    似乎在自己的进程中运行每个 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
    

    【讨论】:

    • 为圣诞节那天的实际回答点赞。要么你家里的事情很慢,要么你从圣诞老人那里得到了一台新电脑。 :)
    【解决方案2】:

    只需在 rake 任务后键入 RAILS_ENV='production'

    你的情况

    rake db:do_something RAILS_ENV='custom'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 2011-10-26
      • 2014-02-27
      • 2015-03-22
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多