[英]environment change in rake task
我正在使用MySQL數據庫和mysql2
gem開發Rails 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.首先,在“ 開發 ”環境下運行my_helper
的方法
2.然后,切換到“ 自定義 ”環境並運行db:create
和db:migrate
到現在為止,一切都很好,環境確實變成了“ 習俗 ”
3.然后,再次變回“ 開發 ”環境
4.在“ 開發 ”環境下再次運行輔助方法
但是,雖然我已經在第3步中將環境改回“ 開發 ”,但最后一種方法仍然在“ 自定義 ”環境中運行,為什么? 以及如何擺脫它?
--- PS ---
我還在這里檢查了與環境變化相關的帖子,並嘗試在那里使用解決方案(在步驟2中):
#2. change to 'custom' database
ActiveRecord::Base.establish_connection('custom')
Rake::Task['db:create']
Rake::Task['db:migrate']
更改數據庫連接而不是更改環境,但db:create
和db:migrate
仍將在“ 開發 ”數據庫下運行,盡管鏈接的帖子說它應該運行“ 自定義 ”數據庫...怪異
---------------重要更新---------------------
我只是意識到第2步中的代碼:
#2. change to 'custom' environment
RAILS_ENV='custom'
Rake::Task['db:create']
Rake::Task['db:migrate']
只有當 Rake::Task['db:create']
被調用時, 才會將環境更改為“ custom ”,如果我注釋掉Rake::Task['db:create']
行,代碼仍會在' development '下運行:
#2. change to 'custom' environment
RAILS_ENV='custom'
#Rake::Task['db:create']
#CODE WILL RUN STILL UNDER 'development' environment.
為什么Rake::Task['db:create']
在我的情況下會影響環境變化......?
我意識到這個問題是從一個多月前開始的,但他們到底是什么 - 這是聖誕節
看起來在自己的流程中運行每個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
只需在rake任務后輸入RAILS_ENV ='production'
在你的情況下
rake db:do_something RAILS_ENV ='custom'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.