使用Bundler和Capistrano部署Rails 3应用程序

4
在部署 Rails3 应用程序的 Capistrano 过程中,我希望我的服务器能够使用 Gemfile.lock 安装所有 gem,而且由于我的服务器没有安装 rvm 等工具,所有 gem 都应该作为系统 gem 安装。
要安装系统 gem,我们需要在 capistrano 部署结构的 current 目录下执行 sudo gem install anygem 命令,或者对于 bundler,我们需要执行 sudo bundle install 命令。
每次部署时,我的部署过程都会在安装 gem 的过程中中断。我需要运行 sudo bundle install 命令。因此,我需要一个 Capistrano 部署钩子。Bundler gem 自带的预构建钩子对我不起作用。我的困惑归结为以下三个问题:
  1. 在部署过程中,在哪个 Capistrano 任务之后应该调用 sudo bundle install 命令?
  2. 使用 Capistrano 运行 sudo 命令时,我应该在我的 Cap 文件中指定哪些声明?注意:我已经将我的公钥推送到了服务器的授权密钥中。
  3. 如何在 cap 文件中编写 bundle install 钩子?
请帮忙解决。

强烈建议你在生产环境中使用rvm,它可以消除所有sudo混乱。 - Sam Saffron
1
@SamSaffron,使用宝石库是可以的。但如果你使用god,你又回到了sudo混乱的境地。 :-) - Sergio Tulentsev
3个回答

5
require "bundler/capistrano"添加到您的deploy.rb中,这应该可以正常工作。它应该声明一个文件夹来安装gem,不需要sudo访问权限,无论rvm如何。
对于您仍然失败的情况,您需要检查是否已正确安装Bundler和Capistrano,并且确保您的Gemfile和Gemfile.lock文件都已经提交到版本控制系统中。

2
如果您运行bundle install --deployment,则不需要sudo访问权限,因为gem应该安装在应用程序的vendor/bundle中,而不是系统本身。

0

我在我的 deploy.rb 文件中使用了这个:

require "bundler/capistrano"
... deploy recipe

namespace :bundle do
  desc "Install bundles into application"
  task :install, :roles => [:app] do
    run "cd #{current_path} && LC_ALL='en_US.UTF-8' bundle install --deployment --without test"
  end
end

然后在正常部署之后,我运行“cap bundle:install”

注意:使用UTF-8以防止ruby1.9 ASCII字符问题。


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