53

我有一个基本的 Rails 3 应用程序在我的开发箱上本地运行,但想尽早测试部署以确保一切正常。我正在使用 Capistrano 进行部署。

当我运行cap deploy(在所有其他必要的设置之后)时,它会在此命令上中断并出现以下错误:

[...]
* executing 'bundle:install'
* executing "bundle install --gemfile /var/www/trex/releases/20100917172521/Gemfile --path /var/www/trex/shared/bundle --deployment --quiet --without development test"

servers: ["www.[my domain].com"]
[www.[my domain].com] executing command
** [out :: www.[my domain].com] sh: bundle: command not found
command finished
[...]

所以看起来它在服务器上找不到bundle命令。

但是,当我登录到服务器时...

$ ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
$ rails -v
Rails 3.0.0
$ bundle -v
Bundler version 1.0.0

...bundle命令工作得很好。

可能出了什么问题?

-

(此外,为了完整性:)

$ which ruby
~/.rvm/rubies/ruby-1.9.2-p0/bin/ruby
$ which rails
~/.rvm/gems/ruby-1.9.2-p0/bin/rails
$ which bundle
~/.rvm/gems/ruby-1.9.2-p0/bin/bundle
4

8 回答 8

89

更新:

对于 RVM >= 1.11.3,您现在应该只使用rvm-capistrano gem。对于较旧的 RVM >= 1.0.1,以下答案仍然适用。


原始答案:

好的,虽然我没有完全cap deploy工作,但我确实解决了这个问题。问题是 Capistrano 试图为 Bundler(和其他 gem)使用与 RVM 路径不同的路径。

cap shell然后通过 , 检查您的 Capistrano 路径echo $PATH。您可能会看到您的标准/usr/local/bin/usr/bin,但这不是 RVM 存储 Bundler 等的地方。

编辑您的 Capistranoconfig/deploy.rb文件,并根据这些说明添加以下行:

# Add RVM's lib directory to the load path.
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))

# Load RVM's capistrano plugin.    
require "rvm/capistrano"

set :rvm_ruby_string, '1.9.2'
set :rvm_type, :user  # Don't use system-wide RVM

这终于让 Capistrano 看到了 Bundler 并开始适当地加载 gem。

于 2010-09-20T15:16:46.460 回答
26

找不到 Bundler,因为 .bash_profile 没有被加载,因此您的 PATH 错误。这可能是因为您在 .bash_profile 中有 RVM 脚本。

简单的答案是将 RVM 脚本从 .bash_profile 移动到 .bashrc,Capistrano 应该能够找到它(同时验证 .bash_profile 是否来自 .bashrc)。

Capistrano 使用 SSH 通过非交互式 shell在服务器上执行命令。此 shell 会话将获取 .bashrc 而不是 .bash_profile。我向两者都添加了 ECHO 语句,并通过 SSH 运行了 LS。您可以在下面的结果中看到只有 .bashrc 的来源:

$ ssh user@123.amazonaws.com ls
.bashrc loaded
git
file1
file2
于 2011-08-12T11:20:09.590 回答
11

我在使用 rbenv 时遇到了同样的问题。解决方案是从我的 .bashrc 文件底部获取 rbenv 特定行并将它们放在顶部。如果 shell 未在交互模式下运行,我的 .bashrc 文件的第一行将返回 aborting。

于 2012-02-15T23:31:33.497 回答
7

最后一行实际上应该是

set :rvm_type, :user

也就是说,用户必须是一个符号而不是一个变量,否则你会得到

undefined local variable or method `user'
于 2010-11-24T15:46:27.107 回答
7

没有rvm/capistrano为我工作。我发现的最佳解决方案是将以下行添加到deploy.rb文件中(它适用于非系统范围的 RVM):

set :bundle_cmd, 'source $HOME/.bash_profile && bundle'

于 2011-11-27T03:45:14.637 回答
2

我的理解是找不到 bundle 命令,因为在用户的 ~/.bash_profile 中定义的 PATH 变量不是由 Capistrano 加载的。

为了解决这个问题,我创建了一个任务:bundle_gems。

task :bundle_gems do
    run "cd #{deploy_to}/current && export PATH=/usr/local/pgsql/bin:/opt/ruby-enterprise-X.X.X/bin:$PATH && bundle install vendor/gems"
end

请注意,我还包括 PostgreSQL 二进制文件的路径 - pg gem 的安装失败,因为无法找到它们,即使可以找到捆绑包。

不过,这似乎是一种混乱的方法。大概有一个更“全局”的地方来定义我不知道的二进制文件的路径。

23/12 更新

为所有用户添加目录到 $PATH:https ://serverfault.com/questions/102932/adding-a-directory-to-path-in-centos

然而,这仍然不会被加载,因为它是一个非交互式非登录 shell。

一个建议是将路径添加到 /etc/bashrc:如何设置 $PATH 以使 `ssh user@host command` 起作用?

然而,这对我也不起作用。我相信这是因为 SSH 也不加载 /etc/bashrc 。

另一个建议是编辑 ~/.ssh/environment: http://www.ruby-forum.com/topic/79248。然而,这似乎与在 deploy.rb 中指定路径一样混乱。

于 2010-12-19T16:23:42.593 回答
1

这个对我有用:

设置 :bundle_cmd, 'source $HOME/.bash_profile && bundle'

于 2014-02-14T13:53:00.220 回答
0

我尝试了一些建议。在 RVM 环境的 deploy.rb 文件中设置路径时遇到问题。我的最终解决方案是包括以下内容:

在 config/deploy.rb 文件中添加:

require "bundler/capistrano"

同样在 config/deploy.rb 中,或者在我的情况下为 config/production.rb,因为我使用 Capistrano 的多级选项

after "deploy", "rvm:trust_rvmrc"

这一步只是确保我们停止获取“你想信任 .rvmrc 文件吗”,它会调用 deploy.rb 文件中的一个任务,例如:

namespace :rvm do
   task :trust_rvmrc do
      run "rvm rvmrc trust #{release_path}"
   end
end

在进行这些细微的更改后,我能够运行cap production deploy检查代码;执行资产管道部署,将发布文件夹链接到当前,执行bundle install和清理。

于 2013-02-20T23:33:03.867 回答