2010-11-15 142 views
0

我已经编写了一个rake任务来通过系统运行一些其他rake任务(以便将ActiveRecord绑定到不同的数据库,其他事情)。它在我的OS X机器上工作正常,但在我们的生产Linux机器上出现加载错误时失败。任务平凡归结为:通过系统执行其他rake任务的rake任务失败 - 没有这样的文件要加载rake

namespace :jobs do 

    task :foo => :environment do 
    system "rake jobs:bar" 
    end 

    task :bar => :environment do 
    puts "foobar" 
    end 

和追踪输出为:

-bash-3.2$ rake jobs:foo --trace 
(in /the/path) 
** Invoke jobs:foo (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Erubis 2.6.6 
** Execute jobs:foo 
/usr/bin/rake:19:in `load': no such file to load -- rake (LoadError) 
    from /usr/bin/rake:19 

我甩了一个看跌期权$:到/ usr/bin中/耙子,已经发现一些有趣的事情。主作业具有同时含有这些路径的负载路径:

/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/bin 
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib 

而二次作业具有仅含负载路径:

/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib 

这或许可以解释负载误差,但不适合的原因它。有任何想法吗?

回答

0

检查以确保您的安装已正确设置所需的环境变量。 http://docs.rubygems.org/read/chapter/3 使用“导出RUBYOPT = RUBYGEM”而不是“导出RUBYOPT = RUBYGEMS”时出现同样的问题。啊,一个角色可以做出的差异。

+0

感谢您的建议,但不幸的是,似乎并不是这样。 rake可执行文件本身执行require'rubygems'位,并且loadpath证实rubygems正在完成它的工作,在两个上下文中略有不同。我很确定你是对的,但是我不能在我的生活中找出哪些是问题。 – 2010-11-15 18:51:53

0

如果您真的试图从另一个rake任务调用rake任务。为什么不这样做? “回扣::任务。[ '工作:酒吧']调用”。你甚至可以在一个循环中完成它,例如每个改变ENV变量的数组#等等。我之前在任务中完成了这个任务。

但是,如果你的例子被设计出来了,并且你没有真正调用一个任务,而只是问为什么子shell有不同的PATH设置,我不知道。也许如果这很难,那就暗示它应该以另一种方式来完成。

+0

因为我需要将ActiveRecord :: Base绑定到另一个数据库,当然,您自己告诉我不要使用establish_connection来明确地执行它,而只是更改ENV变量不会改变这一点,也不会重做其他任何ENV var特定的初始化。 – 2010-11-21 04:27:31