2011-12-17 102 views
8

rake - 任务大约需要18秒才能运行。这仅仅是它需要加载所有任务的时间,因此我定义至少需要这个时间量运行任何任务:如何加速Ruby/Rake任务

$time rake --tasks 
rake db:clean   # Cleaning up database 
rake passenger:restart # Restart Application 
rake spec    # Run specs 

real 0m18.816s 
user 0m7.306s 
sys 0m5.665s 

我的Rakefile:

$: << "." 
require "rubygems" 
require "rspec/core/rake_task" 

desc "Run those specs" 
task :spec do 
    RSpec::Core::RakeTask.new(:spec) do |t| 
    t.rspec_opts = %w{--colour --format progress} 
    t.pattern = 'spec/*_spec.rb' 
    end 
end 

task :default => :spec 

任何想法为什么耙子需要很多次? 谢谢

+0

这是否发生在空的Rakefile?你能向你展示吗? – 2011-12-17 15:39:30

+0

我的rakefile只包含rpec任务,如您在我的文章中看到 – Laughingman 2011-12-17 15:56:13

+0

您确定您拥有正确的Rakefile吗? 'rake -T'显示一个Passenger重启任务,它没有在Rakefile中定义(或包含)。 – 2011-12-20 23:38:58

回答

0

整个导轨环境必须加载,因此即使简单的耙架任务,如rake --tasks需要一段时间。打开一个控制台rails consolescript/console需要一个类似的时间。您可能会尝试破解Ruby或Rails to speed up rake,但如果您想稍后切换到较新版本,太多优化可能会变得很糟糕。由于必须加载导轨环境,所以cleaning up routes也可能有所帮助。

4

尝试spring

命令行会看起来像:

spring rake -T 

这将需要更多的时间运行第一次,但随后的运行中会非常快。

3

此解决方案对我有效:Faster rake tasks in Rails

我不得不做一些变化,我创建了一个lib/tasks/no_rails目录,并将所有不需要Rails的Rake文件放在那里,并只加载那些使用上述方法的文件。

1

我喜欢解决方案Pratik提到的一般情况下加载轨道的任务需要它,而不是那些没有,任何耙任务,而无需事先记住。

运行不需要rails的rake任务的一种侵入性较小的方法是使用-f rake选项告诉rake使用特定的rakefile。这样,rake就不会在所有rails中寻找rake任务。

例如,假设你上面的任务是在你的项目的顶层称为Rake文件的文件和你的Rakefile没有做任何事情,加载Rails的像require File.expand_path('../config/application', __FILE__),你可以这样做:

$ rake -f Rakefile spec 

和它应该更快地运行您的规范任务。尝试$ time rake -f Rakefile -T;我这样做是与我的一个轨道无关Rake文件,并得到:

real 0m1.543s 
user 0m1.308s 
sys  0m0.201s 

的缺点是你要记得每次指定该选项,并且不指定,如果你想从运行轨道rake任务像rake db:migrate