2013-02-15 65 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

相关问题