你好我有一个奇怪的问题,我试图让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邮件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'
谢谢回答。
将其添加到schedule.rb
ENV.each { |k, v| env(k, v) }
参考:https://github.com/javan/whenever/issues/656
我的猜测是在crontab中运行时以及在正常/开发环境中运行时GEM_PATH
不一样。你可以检查一下这个命令
gem which rake
在我的情况下:
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
ruby
引用此答案https://stackoverflow.com/a/20499839/1819549
-l选项(根据man page)使“bash表现为好像它已被作为登录shell调用”。登录shell从主目录中读取某些初始化文件,例如
.bash_profile
。由于您在.bash_profile
中设置了TEST的值,因此在bash启动时会覆盖您在命令行上设置的值。
因此,@ Yury的答案可能是因为命令在.bash_profile
中执行某些操作,我猜它会为rvm更新GEM_PATH。