【问题标题】:Rails 3 -- Bundler/Capistrano ErrorsRails 3 -- Bundler/Capistrano 错误
【发布时间】: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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 capistrano bundler


    【解决方案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并清理。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-11-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-07-22
                • 1970-01-01
                相关资源
                最近更新 更多