【问题标题】:why would I get `no such file to load -- ruby-debug` in production rake task?为什么我会在生产 rake 任务中得到“没有要加载的文件——ruby-debug”?
【发布时间】:2012-03-30 07:04:28
【问题描述】:

我有一个看起来像这样的 rake 任务(crontab):

cd /data/TheApp/current && bundle exec rake nightly_tasks[3] 
   --trace --silent 2>> /data/TheApp/shared/log/tasks_prod_errors.log

在测试和开发中一切都运行良好,但在 prod 我得到这个错误:

rake aborted!
no such file to load -- ruby-debug
/usr/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in  
   `require'
/usr/lib/ruby/gems/1.9.1/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in 
        `block (2 levels) in require'

好的,所以我检查了我的 gemfile,我有这个:

group :development, :test do
  gem 'ruby-debug19', :require => 'ruby-debug', :platforms => :ruby
...

生产环境应该忽略 ruby​​ 调试要求。所以我检查了我的 RAILS_ENV,它是正确的:

$ echo $RAILS_ENV
production

最重要的是,在这个 rake 任务中曾经需要 ruby​​ debug 的行被注释掉了。所以在我看来,bundle exec 不可能尝试在 prod 中加载 ruby​​-debug。这可能与 gemfile.lock 有关吗?里面有一个 ruby​​-debug19 的条目。但是为什么我的 rake 任务会在这种情况下加载它呢?

此外,从命令行运行命令也可以正常工作。令人困惑。

【问题讨论】:

  • 您的应用程序中的任何地方都需要“ruby-debug”吗?
  • @FrederickCheung 是的,但它在我的规格测试中。怀疑 Rake 会使用该代码。

标签: ruby-on-rails ruby ruby-on-rails-3.1 rake


【解决方案1】:

rails 环境和打包程序组是两个完全不同的东西。一个人不知道另一个人,尽管他们在您的案例中使用了类似的术语

作为一种解决方法,您可以在生产环境中使用 bundle install --without development test 来告诉 bundler 不要安装这些组。或者,您可以在 Gemfile 中使用类似的内容:

unless ENV['RAILS_ENV'] == "production"
  gem 'ruby-debug19', :require => 'ruby-debug', :platforms => :ruby
end

这需要您设置环境变量 RAILS_ENV。在您的 bundle install 运行期间以及在您的 bundle exec 运行期间(即始终)。

【讨论】:

  • 你应该使用group :development, :test 而不是这个奇怪的ENV['RAILS_ENV'] 东西。
  • 是的,这通常是首选,因为这是大多数人的做法(以及一些部署脚本期望/支持)。 env 大部分时间用于 CI 配置(例如 Travis CI 或某些 Jenkins 配置)或特殊部署环境(例如 Heroku)。
  • 在我看来,我已经按照您在我的 gemfile 中的建议执行了 - 通过我的 group :dev etc... 。您是在告诉我不要安装 ruby​​-debug,但我的 gemfile 中已经有了该设置,并且已经有很长一段时间了。我正在部署的环境也是在我将 group 块添加到我的 gemfile 之后构建的。简而言之,我认为这不能回答我的问题。
  • @jcollum 但是您仍然需要告诉 bundler 您不希望使用/安装该组。这就是--without 所做的。然后,Bundler 会记住在 bundle exec 期间加载哪些 gem。默认情况下,Bundler 会安装所有组中的所有 gem。同样,Bundler 不知道您的 RAILS_ENV 并且不会仅仅因为它具有一定的价值而改变任何东西。
  • 我的另一个问题是为什么这只会通过 crontab 而不是通过命令行发生。这告诉我捆绑安装不是问题(我刚刚在我的帖子中添加了这个事实)。
【解决方案2】:

您需要做的就是使用 ruby​​ 1.9 的“调试器”gem。

gem install debugger

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2012-04-06
    • 2013-03-04
    相关资源
    最近更新 更多