Capistrano::Configuration类没有定义instance方法。

13

我正在尝试在Rails应用程序中首次启动Capistrano。我有一个运行Ubuntu 12.04、nginx、unicorn和rails的Linux服务器,但是似乎遇到了一些问题。我也使用Capistrano 3.0.0、rails 3.2.14、bundler 1.4.0和ruby 1.9.3p448使用RVM。

目前我只设置了生产阶段,并且我只关心Capistrano与我的服务器通信并从github推送我的代码(暂时不涉及迁移和绑定等操作)。

当我尝试使用以下设置执行cap production deploy:checkcap production deploy:setup命令时(貌似已过期?),会收到以下错误消息:

我不确定如何解决这个错误,并且Google没有给出太多建议。我尝试添加了rvm-capistrano宝石,但无济于事。应该如何修改代码以解决此错误?

    cap aborted!
undefined method `instance' for Capistrano::Configuration:Class
/Users/andrew/.rvm/gems/ruby-1.9.3-p448/gems/bundler-1.4.0.rc.1/lib/bundler/capistrano.rb:11:in `<top (required)>'
config/deploy.rb:1:in `<top (required)>'
/Users/andrew/.rvm/gems/ruby-1.9.3-p448/gems/capistrano-3.0.0/lib/capistrano/setup.rb:12:in `load'
/Users/andrew/.rvm/gems/ruby-1.9.3-p448/gems/capistrano-3.0.0/lib/capistrano/setup.rb:12:in `block (2 levels) in <top (required)>'
/Users/andrew/.rvm/gems/ruby-1.9.3-p448/gems/capistrano-3.0.0/lib/capistrano/application.rb:12:in `run'
/Users/andrew/.rvm/gems/ruby-1.9.3-p448/gems/capistrano-3.0.0/bin/cap:3:in `<top (required)>'
/Users/andrew/.rvm/gems/ruby-1.9.3-p448/bin/cap:23:in `load'
/Users/andrew/.rvm/gems/ruby-1.9.3-p448/bin/cap:23:in `<main>'
Tasks: TOP => production
(See full trace by running task with --trace)

deploy.rb

require "bundler/capistrano"

set :stages, %w(staging production)
set :default_stage, "production"

set :application, "my_app"
set :user, "andrew"
set :scm, "git"
set :repository, "https://github.com/my_repo/#{application}"
set :branch, "master"

set :deploy_to, "/home/rails/#{application}"
set :deploy_via, :remote_cache
set :use_sudo, false

default_run_options[:pty] = true
ssh_options[:forward_agent] = true

after "deploy", "deploy:cleanup" # keep only the last 5 releases

namespace :deploy do
  task :restart, roles: :app do
      run "touch #{current_path}tmp/restart.txt"
    end
  end
  after :finishing, 'deploy:cleanup'

deploy/production.rb

#Real IP ommitted 
server "10.2.32.68", :web, :app, :db, primary: true

Capfile

# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'

# require 'capistrano/rvm'
# require 'capistrano/rbenv'
# require 'capistrano/chruby'
# require 'capistrano/bundler'
# require 'capistrano/rails/assets'
# require 'capistrano/rails/migrations'

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

编辑:查看在bundler中capistrano.rb的有争议的那一行后,它提到要在deploy.rb中添加require 'bundler/deployment',这似乎已经解决了capistrano实例错误问题。

注意:降级到capistrano 2.15.5,这消除了错误。

3个回答

21

首先,Capistrano 3 进行了一些更改。请参阅发行说明:http://www.capistranorb.com/2013/06/01/release-announcement.html

同时,请仔细阅读自述文件:https://github.com/capistrano/capistrano/blob/master/README.md

Capistrano 3 已将bundler集成移入一个gem中。要解决您的问题:

 1. Uncomment require 'capistrano/bundler' from capify. 
 2. add gem 'capistrano-bundler' to your gemfile.
 3. Go through the comments in capify file and uncomment whichever module you require.

如果您还不想使用bundler,请删除第一行:require "bundler/capistrano"。就这么简单。

与以前的方式不同,现在不能直接使用变量。请使用fetch(:application)来读取变量。

您可以轻松地切换回capistrano v2。


我真的不认为回到v2更容易。首先,值得尝试使用cap install重新开始(但首先备份您的deploy.rb、production.rb和capifile文件!),然后逐步添加组件,直到它正常工作。此外,我通过使用capistrano 3.1解决了这个问题。我在capistrano 3.3.5上遇到了这个问题。 - yekta
@yekta 这个问题是在2013年提出的,就在Cap 3推出的时候。那时候他回到v2会更容易一些,因为没有太多的帮助可用。 - Anidhya Ahuja

3

我怀疑这个问题是因为Bundler 1.3.5与最新版本的Capistrano不兼容。尝试升级到Bundler预发布版:gem install bundler --pre


我还注意到你正在使用一个非常旧的Rails 3.2版本,可能存在一些安全漏洞。我强烈建议将该版本的Rails升级到更近期的版本,如Rails 3.2.14。


我认为你是正确的,这也凸显了我的项目中一些问题。按照建议升级到3.2.14版本,将在完全更新后尝试重新进行资本化,并回到这个问题。 - dodgerogers747
1
就我而言,升级并没有解决这个问题。 - Nippysaurus

3

对于 Capistrano 3,他们建议使用 http://github.com/capistrano/bundler

在这里提到了 https://github.com/bundler/bundler/blob/master/lib/bundler/capistrano.rb


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接