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