【问题标题】:Could not find rake using whenever rails无论何时使用rails都找不到rake
【发布时间】:2015-06-29 14:17:00
【问题描述】:

您好,我有一个奇怪的问题,我正在尝试让 rake 任务随时运行,但是有这个问题Could not find rake-10.4.2 in any of the sources (Bundler::GemNotFound)。这很奇怪,因为它在 ruby​​ 2.1.2 版本/home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/spec_set.rb:92 中搜索这个 rake 版本。但是,我在 rvm 中使用 ruby​​ 2.2.0,并且 gem 列表也在使用该版本。
这是一个简单的 cron 作业:

every 1.minute do
  rake 'process_email:handle', output: 'log/mail.log', environment: 'development'
end

瑞克文件:

namespace :process_email do
  desc 'Handle email'
  task handle: :environment do
    MOBIZARD_MAILER.processor.retrieve_mail
  end
end

Mobizard mailer 是我自己的 gem,它通过 ruby​​ 邮件 gem 检索邮件,它使用相同的 ruby​​ 2.2.0 和相同的 gem 列表。
mail.log 中的整个堆栈跟踪如下所示:

/home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/spec_set.rb:92:in `block in materialize': Could not find rake-10.4.2 in any of the sources (Bundler::GemNotFound)
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/spec_set.rb:85:in `map!'
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/spec_set.rb:85:in `materialize'
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/definition.rb:133:in `specs'
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/definition.rb:178:in `specs_for'
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/definition.rb:167:in `requested_specs'
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/environment.rb:18:in `requested_specs'
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/runtime.rb:13:in `setup'
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler.rb:120:in `setup'
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/setup.rb:17:in `<top (required)>'
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /home/vyivrain/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'

谢谢回答。

【问题讨论】:

    标签: ruby-on-rails cron rake whenever


    【解决方案1】:

    这是因为输出设置了 -l 标志,它被 rvm 错误地解释了。

    您可以在此处阅读有关此问题的更多信息:

    https://github.com/javan/whenever/issues/325

    【讨论】:

    • 链接中的任何内容对我来说都没有任何意义。我不知道“-l”标志是什么,在哪里被调用,被什么调用,或者如何包含或排除它。
    • 这肯定会用到更多细节
    【解决方案2】:

    TL;DR

    将此添加到schedule.rb

    ENV.each { |k, v| env(k, v) }
    

    参考:https://github.com/javan/whenever/issues/656


    我的猜测是GEM_PATH 在 crontab 中运行时和在您的正常/开发环境中运行时是不一样的。你可以检查它是哪个命令

    gem which rake
    

    在我的情况下:

    • 在 crontab 中运行时,GEM_PATH 会类似于 /usr/local/lib/ruby/site_ruby/2.3.0/bundle
    • 在“正常”下运行时,GEM_PATH/usr/local/bundle

    此脚本 ENV.each { |k, v| env(k, v) } 将自动添加这些环境以确保 ruby​​ 使用正确的 GEM_PATH


    引用这个答案https://stackoverflow.com/a/20499839/1819549

    -l 选项(根据man page)使“bash 的行为就像它已被作为登录 shell 调用一样”。登录 shell 从您的主目录读取某些初始化文件,例如 .bash_profile。由于您在 .bash_profile 中设置了 TEST 的值,因此当 bash 启动时,您在命令行中设置的值将被覆盖。

    所以@Yury 的答案可能是因为该命令在.bash_profile 中执行了某些操作,我猜它更新了 rvm 的 GEM_PATH。

    【讨论】:

      猜你喜欢
      • 2014-03-02
      • 2015-02-21
      • 2012-03-30
      • 2020-10-16
      • 2011-09-08
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      相关资源
      最近更新 更多