无论何时使用rails

时间:2015-06-29 14:17:01

标签: ruby-on-rails cron rake whenever

你好我有一个奇怪的问题,我正试图让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

Rake文件:

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

Mobizard邮件程序是我自己的宝石,它通过ruby mail 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'

回答问题。

2 个答案:

答案 0 :(得分:2)

这是因为输出是使用-l标志设置的,rvm错误地解释了该标志。

您可以在此处详细了解此问题:

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

答案 1 :(得分:0)

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) }将自动添加这些环境,以确保使用正确的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。