【问题标题】:Capistrano custom task fails because "Rails requires RubyGems >= 1.3.2"Capistrano 自定义任务失败,因为“Rails 需要 RubyGems >= 1.3.2”
【发布时间】:2009-11-27 08:28:42
【问题描述】:

我的自定义 capistrano 任务“app:sample”失败并显示以下错误消息:

mnylen ilmo-on-rails $ cap app:sample
* executing `app:sample'
* executing "export RAILS_ENV=production; cd /home/mnylen/ilmo-on-rails/current; ruby script/coursegen 10"
servers: ["rails.cs.helsinki.fi"]
* establishing connection to gateway `melkinpaasi.cs.helsinki.fi'
* Creating gateway using melkinpaasi.cs.helsinki.fi
* establishing connection to `rails.cs.helsinki.fi' via gateway
Password: 
[rails.cs.helsinki.fi] executing command
*** [err :: rails.cs.helsinki.fi] Rails requires RubyGems >= 1.3.2. Please install RubyGems and try again: http://rubygems.rubyforge.org
command finished
failed: "sh -c 'export RAILS_ENV=production; cd /home/mnylen/ilmo-on-rails/current; ruby script/coursegen 10'" on rails.cs.helsinki.fi

我是否遗漏了什么或做错了什么?任务是:

namespace :app do
  desc "Run sample data on production2
  task :sample do
    run "export RAILS_ENV=production; cd #{current_path}; ruby script/coursegen 10"
  end
end

如果我从实际服务器运行相同的命令,它工作正常。

【问题讨论】:

    标签: ruby-on-rails capistrano


    【解决方案1】:

    Cap 以意外用户的身份运行远程命令 - 并且该用户没有正确的 ruby​​ 和 gem 路径。检查:user:use_sudo 配方中的设置。仔细阅读上限输出以查看正在连接的用户。我看到您使用的是:gateway;在这种情况下可能有两个用户。一个用于连接网关,另一个用于在目标服务器上实际运行命令。

    【讨论】:

    • 谢谢。这让事情变得更清楚了。我修改了任务以运行 ruby​​ --version。看来,它使用了错误的 Ruby 版本。我可以在我的部署配方中以某种方式设置 ruby​​ 和 gem 可执行文件的路径吗?
    • 哦,忘了说,我已经尝试将正确的 ruby​​ 路径放到我的 .profile 文件中。在我的食谱中,我使用 set :use_sudo, false set :user, "mnylen"
    【解决方案2】:

    好的,解决了。

    问题在于生产服务器上安装了两个 Ruby。

    生产服务器上我的主目录下的 .profile 文件将 PATH 环境变量设置为指向正确的 Ruby 版本。

    run 命令似乎没有获取 .profile 文件,因此在任务中运行 ruby script/coursegen 10使用了错误的 Ruby 版本,这就是关于 RubyGems 版本的奇怪错误消息的原因。这也解释了为什么它在从生产服务器 shell 手动运行命令时起作用。

    我的解决方案是在我的运行任务中使用 Ruby 可执行文件的完整路径,如下所示:

    run "export RAILS_ENV=production; cd #{current_path}; /opt/ruby-enterprise-1.8.7-2009.10/bin/ruby script/coursegen 10"
    

    当然,这并不漂亮,但它确实有效。如果有人有任何更漂亮的解决方案,我会很乐意使用这些解决方案。 :)

    【讨论】:

      【解决方案3】:

      看来您应该更新远程服务器上的 RubyGems。

      【讨论】:

      • 感谢您的回复。但是,远程服务器上的 gem --version 表示 RubyGems 版本是 1.3.5,因此根据错误消息,不需要更新。好吧,如果我手动连接到远程服务器并运行该命令,它仍然有效。 :-)
      • 那很奇怪。 +1 你的问题给你一些勇气。 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      相关资源
      最近更新 更多