Rails 3 -- Bundler/Capistrano 错误

Posted

技术标签:

【中文标题】Rails 3 -- Bundler/Capistrano 错误【英文标题】:Rails 3 -- Bundler/Capistrano Errors 【发布时间】:2011-04-13 20:29:26 【问题描述】:

我有一个基本的 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

【问题讨论】:

【参考方案1】:

更新:

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


原始答案:

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

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

编辑您的 Capistrano config/deploy.rb 文件,并根据 these instructions 添加以下行:

# 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。

【讨论】:

我在系统范围内安装了 rvm 并与本地用户一起部署。为了使它工作,我必须确保我正在部署的用户已经正确设置了 rvm。此处描述的 .bashrc 故障排除 rvm.beginrescueend.com/rvm/install 有帮助 如果您尝试将 rvm capistrano 集成从此处列出的内容升级到此处:ariejan.net/2011/09/14/… 到此答案中提到的新方法,也许您会发现自己在这里。如果您确实删除了 default_environment 行,请务必同时删除 default_run_options[:shell] = 'bash' 否则您仍然不会在 capistrano shell 上拥有 rvm。 这对我不起作用。只有这样才有效:set :bundle_cmd, 'source $HOME/.bash_profile && bundle' 这种情况最近发生了变化。您现在可以执行 gem install rvm-capistrano 来解决问题 这会给你一个警告:RVM - Capistrano 集成被提取到一个单独的 gem,安装:gem install rvm-capistrano 并删除 $LOAD_PATH.unshift【参考方案2】:

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

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

Capistrano 使用 SSH 通过non-interactive shell 在服务器上执行命令。这个shell会话将source .bashrc but not .bash_profile。我向两者都添加了 ECHO 语句,并通过 SSH 运行了 LS。您可以在下面的结果中看到只有 .bashrc 的来源:

$ ssh user@123.amazonaws.com ls
.bashrc loaded
git
file1
file2

【讨论】:

始终从您的.bashrc 获取您的.bash_profile 是一个好习惯吗?这样,无论是交互式还是非交互式 shell,您的 .bash_profile 总是会被获取【参考方案3】:

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

【讨论】:

【参考方案4】:

最后一行应该是

set :rvm_type, :user

即user必须是符号而不是变量,否则会得到

undefined local variable or method `user'

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

据我了解,找不到 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 的路径:How do I set $PATH such that `ssh user@host command` works?

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

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

【讨论】:

【参考方案7】:

这个对我有用:

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

【讨论】:

【参考方案8】:

我尝试了一些建议。在 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并清理。

【讨论】:

以上是关于Rails 3 -- Bundler/Capistrano 错误的主要内容,如果未能解决你的问题,请参考以下文章

Rails:“bundle install”由于旧的 rails 版本(3.2)而失败

Rails 3.2.3 GeoLocation 使用 MaxMind

从 Rails 2 到 Rails 3 路由

在使用 Rails 3 时遇到一些问题,继续使用 Rails 4

如何在 Rails 6.0.3.3 中使用 jQuery?

通过 ajax rails 2 向 rails 3 提交表单