Как долго должны работать «рейковые маршруты»? - PullRequest
6 голосов
/ 21 января 2012

Я только начал с Rails, так что извините за мой довольно простой вопрос.Я уже заметил, что команда rake routes выполняется каждый раз, когда я ее запускаю.У меня есть около 20 маршрутов для 3 контроллеров, и выполнение занимает около 40 секунд.

Это нормально?Как я мог ускорить это?

PS: Я нахожусь на Windows 7 с Rails 3.1.3 (настроен с установщиком Rails).

Ответы [ 5 ]

2 голосов
/ 21 января 2012

Задача rake маршруты зависит от задачи среды, которая загружает вашу среду Rails, и требует тысячи файлов Ruby.

Время запуска среды Rails и время выполнения соответствующих маршрутов очень близки (на моем Linux-ноутбуке на стероидах с приложением Rails с ~ 50 маршрутами):

$ time ruby -r./config/environment.rb -e ''

real    0m5.065s
user    0m4.552s
sys 0m0.456s

$ time rake routes

real    0m4.955s
user    0m4.580s
sys 0m0.344s

Нет простого способа уменьшить время запуска, поскольку он зависит от того, как ваш интерпретатор требует файлы сценариев: http://rhnh.net/2011/05/28/speeding-up-rails-startup-time

1 голос
/ 20 ноября 2014

Я придумал решение для rake routes, для которого каждый раз требовалось около 8 секунд.Это простой файловый кеш, который запускает bundle exec rake routes, хранит вывод в файле под tmp.Имя файла - это хэш md5 config/routes.rb, поэтому, если вы внесете изменение и вернете его обратно, оно будет использовать старый кэшированный файл.

Я поместил следующие функции bash в исполняемый файл, который я называю fastroutes:

if [ ! -f config/routes.rb ]; then
  echo "Not in root of rails app"
  exit 1
fi

cached_routes_filename="tmp/cached_routes_$(md5 -q config/routes.rb).txt"

function cache_routes {
  bundle exec rake routes > $cached_routes_filename
}

function clear_cache {
  for old_file in $(ls tmp/cache_routes*.txt); do
    rm $old_file
  done
}

function show_cache {
  cat $cached_routes_filename
}

function show_current_filename {
  echo $cached_routes_filename
}

function main {
  if [ ! -f $cached_routes_filename ]; then
    cache_routes
  fi

  show_cache
}

if [[ "$1" == "-f" ]]
then
  show_current_filename 
elif [[ "$1" == "-r" ]]
then
  rm $cached_routes_filename
  cache_routes
else
  main
fi

Вот ссылка github тоже.

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

0 голосов
/ 14 мая 2015

В вашем Rakefile:

#Ouptut stored output of rake routes
task :fast_routes => 'tmp/routes_output' do |t|
   sh 'cat', t.source
end

#Update tmp/routes_output if its older than 'config/routes.rb'
file 'tmp/routes_output' => 'config/routes.rb' do |t|
  outputf = File.open(t.name, 'w')
  begin
     $stdout = outputf
     Rake.application['routes'].invoke
  ensure
     outputf.close
     $stdout = STDOUT
  end
end
0 голосов
/ 21 января 2012

Это кажется немного длинным, но вам действительно нужно запускать rake routes так часто? В моей системе OSX Lion / Rails 3.2.0, rake routes занимает ~ 10 с.

0 голосов
/ 21 января 2012

Среда Rails требует гораздо больше времени для загрузки в Windows.Я рекомендую вам попробовать Unix, как Ubuntu, так как Windows - худшая среда, в которой вы можете запускать и разрабатывать приложения Ruby on Rails.Но если вы просто пробуете Rails, Windows достаточно:)

...