2012-06-28 28 views
1

我想部署,我不想在版本控制Gemfile.lock。但是当它被删除时,我得到以下错误。Gemfile.lock,Bundler和部署与Capistrano

* executing "cd /var/www/vhosts/my-site/releases/20120628162217 && bundle install --  gemfile /var/www/vhosts/mysite/releases/20120628162217/Gemfile --path /var/www/vhosts/my-site/shared/bundle --deployment --quiet --without development test cucumber analytics" 
    servers: ["staging-beta.my-site.com"] 
[staging-beta.my-sitehealth.com] executing command 
** [out :: staging-beta.my-site.com] The --deployment flag requires a Gemfile.lock.  Please make sure you have checked your Gemfile.lock into version control before deploying. 
    command finished in 332ms 

这里是我的deploy.rb文件:

require 'thinking_sphinx/deploy/capistrano' 

set :rvm_ruby_string, '1.9.3' 

# Ignore the .git directory when creating a release 
set :copy_exclude, ".git*" 

set :stages, %w(production staging rails_ec2_west_staging vagrant analytics highgroove ec2_highgroove stage_analytics ec2_staging highgroove_staging ec2_chef ec2_sphinx_chef solr_staging ec2_sphinx_prod_chef) 
set :default_stage, "staging" 

set :bundle_without, [:development, :test, :cucumber, :analytics] 
require 'bundler/capistrano' 
set :custom_symlinks, {} 

require 'capistrano/ext/multistage' 

if ARGV.first == 'ec2_staging' 
    require 'rvm/capistrano' 
    # for dual deploys on ec2 staging 
    set :application, "my-site3" 
else 
    set :application, "my-site" 
end 

set :use_sudo, false 
set :user, "www-data" 
set :group, "www-data" 

ssh_options[:forward_agent] = true 

set :branch, $1 if `git branch` =~ /\* (\S+)\s/m 

set :scm, :git 
set :repository, "[email protected]:my-company/my-site3.git" 
set :deploy_to, "/var/www/vhosts/#{application}" 
set :deploy_via, :remote_cache 
set :deploy_env, 'production' 

# If you are using Passenger mod_rails uncomment this: 
# if you're still using the script/reapear helper you will need 
# these http://github.com/rails/irs_process_scripts 

namespace :deploy do 
    task :start do ; end 
    task :stop do ; end 
    task :restart, :roles => :app, :except => { :no_release => true } do 
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}" 
    end 

    task :seed, :roles => :db do 
    rake = fetch(:rake, "rake") 
    rails_env = fetch(:rails_env, "production") 

    run "cd #{current_path} && #{rake} RAILS_ENV=#{rails_env} db:seed" 
    end 

end 

namespace :assets do 
    task :precompile do 
    run "cd #{current_path} && #{rake} RAILS_ENV=#{rails_env} my-site-web:assets:precompile" 
    end 
end 

task :uname do 
    run "uname -a" 
end 

after "deploy:update", "deploy:cleanup" 
after "deploy:update", "assets:precompile" 

require './config/boot' 
#require 'airbrake/capistrano' 
+0

有一个必要的原因:你不能指望部署任意版本的宝石。 – tadman

回答

5

这为包括Gemfile.lock的最佳实践。从捆扎机理性页:http://gembundler.com/rationale.html

这一点很重要:在Gemfile.lock的让你的应用程序自己的代码,它跑了,你肯定知道一切工作的最后一次第三方代码都在单个封装。指定您在Gemfile中依赖的第三方代码的确切版本不能提供相同的保证,因为gems通常会为其依赖项声明一系列版本。