2013-02-15 94 views
1

部署(既分期&生產,在同一臺服務器上)出現了錯誤有:爲什麼deploy:assets:預編譯失敗,錯誤爲未初始化的常量RAILS_ENV?

triggering after callbacks for `deploy:update_code' 
    * executing `deploy:assets:precompile' 
    * executing "cd /var/www/staging/releases/20130215205558 && bundle exec rake RAILS_ENV=staging RAILS_GROUPS=assets assets:precompile" 
    servers: ["domain.com"] 
    [domain.com] executing command 
    [domain.com] cd /var/www/staging/releases/20130215205558 && bundle exec rake RAILS_ENV=staging RAILS_GROUPS=assets assets:precompile 
** [out :: domain.com] rake aborted! 
** [out :: domain.com] uninitialized constant RAILS_ENV 
** [out :: domain.com] 
** [out :: domain.com] Tasks: TOP => environment 
** [out :: domain.com] (See full trace by running task with --trace) 
    command finished in 22567ms 
*** [deploy:update_code] rolling back 

該應用程序正在運行:

  • 的Rails 3.1.4
  • 紅寶石1.9.2- P290

的deploy.rb文件包含:

set :stages, %w(staging production) 
require 'capistrano/ext/multistage' 
require "bundler/capistrano" 
set :application, "appname" 
role :app, "domain.com" 
role :web, "domain.com" 
role :db, "domain.com", :primary => true 
set :scm, :git 
set :repository, "[email protected]:username/appname.git" 
set :deploy_via, :remote_cache 
set :user, "username" 
set :runner, "username" 
set :use_sudo, false 
set :shared_children, %w(system log pids spree) 
default_run_options[:pty] = true 
default_run_options[:shell] = false 
require './config/boot' 
require 'airbrake/capistrano' 
load 'deploy/assets' 
namespace :deploy do 
    task :restart, :roles => :app do 
    run "touch #{current_path}/tmp/restart.txt" 
    end 
    task :default do 
    update 
    restart 
    cleanup 
    end 
    task :finalize_update, :except => { :no_release => true } do 
    run "chmod -R g+w #{latest_release}" if fetch(:group_writable, true) 
    run <<-CMD 
     rm -rf #{latest_release}/log #{latest_release}/public/system #{latest_release}/tmp/pids && 
     mkdir -p #{latest_release}/public && 
     mkdir -p #{latest_release}/tmp && 
     ln -s #{shared_path}/log #{latest_release}/log && 
     ln -s #{shared_path}/system #{latest_release}/public/system && 
     ln -s #{shared_path}/spree #{latest_release}/public/spree && 
     ln -s #{shared_path}/pids #{latest_release}/tmp/pids 
    CMD 
    if fetch(:normalize_asset_timestamps, true) 
     stamp = Time.now.utc.strftime("%Y%m%d%H%M.%S") 
     asset_paths = fetch(:public_children, %w(images stylesheets javascripts)).map { |p| "#{latest_release}/public/#{p}" }.join(" ") 
     run "find #{asset_paths} -exec touch -t #{stamp} {} ';'; true", :env => { "TZ" => "UTC" } 
    end 
    end 
    end 
end 

的Gemfile中包含:

source 'http://rubygems.org' 
gem 'rails', '~> 3.1' 
gem 'spree', '~> 0.70.3' 
gem 'tinymce-rails', '3.4.4' 
gem 'honeypot-captcha' 
gem 'spree_static_content', :git => 'https://github.com/spree/spree_static_content.git', :branch => '0-70-stable' 
gem 'spree_editor', :git => 'https://github.com/commonmedia/spree_editor.git', :branch => 'master' 
gem 'spree_contact_form', :git => 'git://github.com/commonmedia/spree-contact-form.git', :branch => 'master' 
gem 'mysql2' 
gem 'airbrake' 
gem 'newrelic_rpm' 
gem 'jquery-rails' 
gem 'capistrano' 
gem 'capistrano-ext' 
group :assets do 
    gem 'sass-rails', '~> 3.1.5' 
    gem 'coffee-rails', '~> 3.1.1' 
    gem 'uglifier', '>= 1.0.3' 
end 
group :development do 
    gem 'highline' 
end 
group :test do 
    gem 'turn', '0.8.2', :require => false 
end 
group :development, :test do 
    gem 'itslog' 
end 
group :staging, :production do 
    gem 'therubyracer' 
end 
+1

不知道發生了什麼事,但令我奇怪的第一件事情是,它是一個未定義的常量,而不是(說)違約'發展'。請記住,Ruby常量'RAILS_ENV'與環境變量'RAILS_ENV'(或者在Ruby中,'ENV ['RAILS_ENV']'不一樣。前者被設置爲後者的值,默認爲''開發「'。如果常量是* undefined *,則意味着該分配被跳過或者由於某種原因從未到達過,希望這會有幫助...... – Peeja 2013-02-15 21:53:44

回答

0

這樣做的原因錯誤是,我複製一個Errbit初始化一些代碼在從一個Rails 2個應用程序。該初始化程序中的代碼使用了RAILS_ENV,這實際上導致了各種問題。我沒有意識到該應用程序甚至沒有啓動,因爲我直接添加了Errbit初始化程序以嘗試部署它。

因此,除一些經驗教訓,用Rails.env代替RAILS_ENV對Rails 3

1

你的命令,是不正確的。你應該改變:

bundle exec rake RAILS_ENV=staging RAILS_GROUPS=assets assets:precompile 

...到:

RAILS_ENV=staging RAILS_GROUPS=assets bundle exec rake assets:precompile 
+0

有趣的是,正在運行的命令是capistrano爲我執行的任何默認命令。你知道我是如何改變你的建議的嗎?也許對'deploy.rb'文件進行一些編輯? – 2013-02-15 21:25:59

+1

@d_ethier:這是不正確的。原始命令是正確的。下面是一個Gist演示:https://gist.github .com/Peeja/4963777 – Peeja 2013-02-15 21:46:07

+2

當環境變量繼續'rake'時,shell將它們導出,當它們到達'rake'後,它們被作爲參數賦予'rake'過程,然而'rake'然後解釋它們作爲環境變量,爲什麼它不這樣做當然。 – Peeja 2013-02-15 21:47:36

相關問題