“耙路”应该运行多久?

时间:2012-01-21 14:27:19

标签: ruby-on-rails routes rake

我刚开始使用Rails,请原谅我相当基本的问题。我已经注意到每次运行rake routes命令都需要一段时间才能执行。我有大约20条路由器用于3个控制器,执行大约需要40秒。

这是正常的吗?我怎么能加快速度呢?

P.S。:我在Windows 7上使用Rails 3.1.3(使用Rails安装程序设置)。

5 个答案:

答案 0 :(得分:2)

rake路由任务取决于加载Rails环境的环境任务,需要数千个Ruby文件。

Rails环境的启动时间和相应的rake路由执行时间非常接近(在我的Linux on-steroids-laptop上,带有大约50条路由的Rails应用程序):

$ 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 :(得分:1)

我想出了rake routes的解决方案,每次运行大约需要8秒钟。它是一个基于文件的简单缓存,运行bundle exec rake routes,将输出存储在tmp下的文件中。文件名是config/routes.rb的md5哈希值,因此如果您进行更改并将其更改回来,它将使用旧的缓存文件。

我将以下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 link

这样,您只需生成一次路由,然后fastroutes将使用缓存的值。

答案 2 :(得分:0)

这似乎有点长,但你真的需要经常运行rake routes吗?在我的系统上,OSX Lion / Rails 3.2.0,rake routes大约需要10秒。

答案 3 :(得分:0)

在您的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

答案 4 :(得分:-1)

Rails环境需要花费大量时间在Windows上加载。我建议你试试Unix,比如Ubuntu,因为Windows是运行和开发Ruby on Rails应用程序的最差环境。但如果您只是尝试Rails,Windows就足够了:))