Как я могу ускорить задачу Ruby / Rake - PullRequest
8 голосов
/ 17 декабря 2011

рейк - задача занимает около 18 секунд, чтобы бежать.Это как раз время, необходимое для загрузки всех задач, в результате любая заданная мною задача будет запускаться по крайней мере так:

$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

Есть идеи, почему рейк занимает много времени?Спасибо

Ответы [ 4 ]

5 голосов
/ 21 февраля 2013

Попробуй Пружина

Командная строка будет выглядеть так:

spring rake -T

Первый запуск займет больше времени, но последующие запуски будут очень быстрыми.

3 голосов
/ 17 мая 2013

Это решение сработало для меня: Ускоренные рейк-задачи в Rails .

Мне пришлось сделать небольшой вариант, когда я создал каталог lib/tasks/no_rails и поместил туда все файлы Rake, которые не нуждаются в Rails, и загрузил только те, которые используют вышеописанный метод.

1 голос
/ 08 сентября 2013

Мне нравится решение, которое Pratik упоминает для общего случая загрузки рельсов для задач, которые в нем нуждаются, а не для тех, которые этого не делают, для любых граблей, без необходимости запоминать заранее.

Менее инвазивный метод запуска рейк-задачи, для которой не нужны рельсы, - это использование опции -f rake, чтобы указать рейку использовать определенный Rake-файл. Таким образом, рейк не будет искать рейки на всех рельсах.

Например, если ваша задача находится в файле Rakefile на верхнем уровне вашего проекта, а ваш Rakefile не выполняет ничего, что загружает Rails, например require File.expand_path('../config/application', __FILE__), вы можете сделать:

$ rake -f Rakefile spec

и он должен выполнить вашу задачу гораздо быстрее. Попробуйте $ time rake -f Rakefile -T; Я сделал это с независимым от рельсов Rakefile и получил:

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

Недостатком является то, что вы должны помнить, чтобы указывать эту опцию каждый раз, а не указывать ее, если вы хотите запускать рейк-задачу из рельсов, таких как rake db:migrate.

0 голосов
/ 21 июня 2012

Должна быть загружена вся среда рельсов, поэтому даже такие простые задачи, как rake --tasks, требуют времени. Открытие консоли с rails console или script/console занимает аналогичное время. Вы можете попытаться взломать Ruby или Rails для ускорения рейка , но слишком большая оптимизация может быть плохой, если вы захотите перейти на более новую версию позже. Так как среда рельсов должна быть загружена, очистка маршрутов также может помочь.

...