invoke 'bundle:install'
echo "-----> Installing gem dependencies using Bundler"
mkdir -p "/root/server/project/shared/bundle"
mkdir -p "./vendor"
ln -s "/root/server/project/shared/bundle" "./vendor/bundle"
bundle install --without development:test --path "./vendor/bundle" --deployment
echo "-----> Installing gem dependencies using Bundler" &&
bundle install --without development test --path "vendor/bundle" --deployment
可以看出旧版的 bundle 会复用,而新版每次都重装一遍新的
仅仅从 log 判断的么? 有没有登陆到服务器上去查一下每个历史版本中是不是都包含一份 vendor/bundle ? 如果是的话,可以去提交一个 issue 了。
#12 楼 @lithium4010 no,文档有提及。原文:if you do not want for bundle to install gems copy current/vendor/bundle to /shared/vendor/bundle. 链接:https://github.com/mina-deploy/mina/blob/master/docs/migrating.md
#13 楼 @u1450154824 文档没有提供正确的解决方法,我盯着这一句看了好几分钟,没有 get 到这里的 copy 是什么意思。看源码可以发现差异是过去默认会做软链接,新版利用 shared_dir 来实现。我这里的状况是,当使用 mina_multistage 并且手动 set :shared_dirs, ['log', 'tmp']
,新版的默认软链到 vendor/bundle 就失效了。而且从源码看来,作者是希望利用 shared_dir 来实现默认就软链 bundle 而不需要使用者关注的。
提供一个可用的 Mina 1.0 的配置文件:
require 'mina/bundler'
require 'mina/rails'
require 'mina/git'
require 'mina/rvm'
require 'mina/puma'
require 'mina/logs'
set :domain, 'www.haijia.org'
set :user, 'deploy'
set :deploy_to, '/home/deploy/www.haijia.org/haijia'
set :repository, '[email protected]:chinakr/haijia.git' # private repository
set :branch, 'master'
set :shared_dirs, fetch(:shared_dirs, []).push('public/upload', 'tmp/sockets', 'tmp/pids', 'db/production')
set :shared_files, fetch(:shared_files, []).push('config/database.yml', 'config/secrets.yml')
desc 'Set up environment.'
task :environment do
invoke :'rvm:use', 'ruby-2.4.1@rails5'
end
desc 'Prepare for deployment.'
task :setup do
in_path "#{fetch(:shared_path)}" do
['config/database.yml', 'config/secrets.yml'].each do |file|
comment %{Be sure to edit 'shared/#{file}'.}
end
end
end
desc 'Deploy current version to the server.'
task :deploy => :environment do
deploy do
invoke :'git:clone'
invoke :'deploy:link_shared_paths'
invoke :'bundle:install'
invoke :'rails:db_migrate'
invoke :'rails:assets_precompile'
invoke :'deploy:cleanup'
on :launch do
invoke :'puma:start'
invoke :'puma:phased_restart'
end
end
end
需要注意的是 https://github.com/mina-deploy/mina/blob/master/tasks/mina/bundler.rb
中已经包含了 set :bundle_path, 'vendor/bundle'
,所以在设置 shared_dirs
要使用 set :shared_dirs, fetch(:shared_dirs, []).push('tmp/sockets', 'tmp/pids')
而不是 set :shared_dirs, ['vendor/bundle', 'tmp/sockets', 'tmp/pids']
。这样就不会出现 mina deploy
时每次都重新 bundle 的问题了。