Rails 3.1和Asset Pipeline:使用Capistrano进行部署时出现问题

我刚刚从Ruby on Rails 3.0.10切换到3.1.0,我想通过使用Capistrano gem来部署我的资产文件(我的本地机器是运行Snow Leopard的MacO,我的远程机器运行的是Ubuntu 10.04 Lucid)。 因此,正如官方指南中所写,我在我的Capfile取消注释load 'deploy/assets' ,如下所示:

 # Uncomment if you are using Rails' asset pipeline load 'deploy/assets' 

现在,当我运行cap deploy命令时,我收到以下错误(错误在底部解释):

 ... * executing "cd //releases/20110925223032 && rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile" servers: [""] [] executing command ** [out :: ] (in //releases/20110925223032) *** [err :: ] rake aborted! *** [err :: ] uninitialized constant Rake::DSL *** [err :: ] /usr/local/lib/ruby/1.9.1/rake.rb:2482:in `const_missing' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/tasklib.rb:8:in `' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/tasklib.rb:6:in `' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/tasklib.rb:3:in `' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/testtask.rb:4:in `require' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/testtask.rb:4:in `' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/test_unit/testing.rake:2:in `require' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/test_unit/testing.rake:2:in `' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/test_unit/railtie.rb:12:in `load' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/test_unit/railtie.rb:12:in `block in ' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/railtie.rb:183:in `call' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/railtie.rb:183:in `block in load_tasks' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/railtie.rb:183:in `each' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/railtie.rb:183:in `load_tasks' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/engine.rb:395:in `block in load_tasks' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/application/railties.rb:8:in `each' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/application/railties.rb:8:in `all' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/engine.rb:395:in `load_tasks' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/application.rb:99:in `load_tasks' *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/railtie/configurable.rb:30:in `method_missing' *** [err :: ] //releases/20110925223032/Rakefile:7:in `' *** [err :: ] /usr/local/lib/ruby/1.9.1/rake.rb:2373:in `load' *** [err :: ] /usr/local/lib/ruby/1.9.1/rake.rb:2373:in `raw_load_rakefile' *** [err :: ] /usr/local/lib/ruby/1.9.1/rake.rb:2007:in `block in load_rakefile' *** [err :: ] /usr/local/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling' *** [err :: ] /usr/local/lib/ruby/1.9.1/rake.rb:2006:in `load_rakefile' *** [err :: ] /usr/local/lib/ruby/1.9.1/rake.rb:1991:in `run' *** [err :: ] /usr/local/bin/rake:31:in `' command finished in 4301ms *** [deploy:update_code] rolling back * executing "rm -rf //releases/20110925223032; true" servers: [""] [] executing command command finished in 377ms failed: "sh -c 'cd //releases/20110925223032 && rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile'" on  

所以,我试着在回答这个问题之后解决问题 :

 # Rakefile require 'rake/dsl_definition' require File.expand_path('../config/application', __FILE__) ::Application.load_tasks 

在我再次运行cap deploy命令后,我收到以下错误:

 ... * executing "cd //releases/20110925160036 && rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile" servers: [""] [] executing command *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils.rb:10: warning: already initialized constant RUBY *** [err :: ] /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils.rb:84: warning: already initialized constant LN_SUPPORTED ** [out :: ] (in //releases/20110925160036) *** [err :: ] WARNING: Global access to Rake DSL methods is deprecated. Please include *** [err :: ] ... Rake::DSL into classes and modules which use the Rake DSL methods. *** [err :: ] WARNING: DSL method Object#mkdir_p called at /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils_ext.rb:36:in `mkdir_p' *** [err :: ] WARNING: Global access to Rake DSL methods is deprecated. Please include *** [err :: ] ... Rake::DSL into classes and modules which use the Rake DSL methods. *** [err :: ] WARNING: DSL method Object#mkdir_p called at /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils_ext.rb:36:in `mkdir_p' *** [err :: ] WARNING: DSL method Object#mkdir_p called at /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils_ext.rb:36:in `mkdir_p' *** [err :: ] WARNING: DSL method Object#mkdir_p called at /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils_ext.rb:36:in `mkdir_p' ... *** [err :: ] WARNING: DSL method Object#mkdir_p called at /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils_ext.rb:36:in `mkdir_p' ... *** [err :: ] WARNING: DSL method Object#mkdir_p called at /usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils_ext.rb:36:in `mkdir_p' ... *** [err :: ] rake aborted! *** [err :: ] stack level too deep *** [err :: ] /usr/local/lib/ruby/1.9.1/ostruct.rb:92 command finished in 48421ms 

与Capistrano相关的代码是错误的? 如何正确使用load 'deploy/assets'语句以使部署过程正常工作?

您是否尝试过定义自己的任务? 这就是我遇到这个问题时所做的事情:

 task :precompile, :role => :app do run "cd #{release_path}/ && rake assets:precompile" end after "deploy:finalize_update", "deploy:precompile" 

如果使用RVM,则需要对此进行RVM初始化