2012-01-21 35 views
6

Tôi mới bắt đầu với Rails, vì vậy xin lỗi câu hỏi khá cơ bản của tôi. Tôi đã nhận thấy rằng lệnh rake routes mất một lúc để thực thi mọi lúc tôi chạy nó. Tôi có khoảng 20 tuyến cho 3 bộ điều khiển và mất khoảng 40 giây để thực thi.Chạy "tuyến đường cào" trong bao lâu?

Điều đó có bình thường không? Làm thế nào tôi có thể tăng tốc độ này?

P.S .: Tôi đang trên Windows 7 với Rails 3.1.3 (thiết lập với Rails Installer).

+1

Là nó chỉ cào các tuyến đường mà phải mất một thời gian? Có chậm để khởi động máy chủ hoặc bảng điều khiển của bạn không? –

+0

Better u có thể kiểm tra các tuyến đường cho bộ điều khiển CONTROLLER = tuyến cào controllername đặc biệt –

+0

@Jan: máy chủ (khoảng 1:15 phút) và giao diện điều khiển (0:45 phút) cũng mất một thời gian –

Trả lời

2

Các tuyến cào nhiệm vụ phụ thuộc vào các nhiệm vụ môi trường mà tải môi trường Rails bạn và yêu cầu hàng ngàn file Ruby.

Thời gian khởi động của một môi trường Rails và các tuyến đường cào tương ứng thời gian thực hiện rất chặt chẽ (trên Linux on-steroid-máy tính xách tay của tôi với một ứng dụng Rails với ~ 50 tuyến):

$ 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 

Không có cách dễ dàng để giảm thời gian khởi động vì nó dựa vào cách người phiên dịch của bạn yêu cầu tệp tập lệnh: http://rhnh.net/2011/05/28/speeding-up-rails-startup-time

+0

Các biện pháp của tôi rất cao đối với phần 'thực' . Tôi chắc chắn rằng có thể giảm. Các đồng nghiệp của tôi làm việc với cùng một ứng dụng trong Ubuntu có được kết quả gần như ngay lập tức gọi ra các đường ray hoặc cào. real \t 0m26.287s người dùng \t 0m3.668s sys \t 0m1.672s – Steven

-1

Rails môi trường phải mất một lượng lớn thời gian hơn để được nạp trên Windows. Tôi khuyên bạn nên thử dùng Unix, như Ubuntu, vì Windows là môi trường tồi tệ nhất mà bạn có thể chạy và phát triển các ứng dụng Ruby on Rails. Nhưng nếu bạn chỉ đang thử Rails, Windows là đủ :)

+0

Bạn có nghĩa là để chạy 'rake tuyến' hoặc nó sẽ không có sẵn như là một nhiệm vụ Rake. Nếu OP chỉ mới bắt đầu với w/Rails, nhiệm vụ tuyến đường có thể hữu ích cho họ để hiểu các tuyến đường được thiết lập tự động. –

+0

Tôi chạy rake các tuyến đường tất cả các thời gian vì tôi tìm thấy nó dễ dàng hơn để tìm ra những gì một tuyến đường được dịch sang. –

+0

nhiệm vụ đường rake rất hữu ích khi bắt đầu với Rails. Tôi không phải là người mới bắt đầu nhưng thường sử dụng tác vụ đó, thực sự bất cứ khi nào tôi cần xem xét bản dịch các tuyến đường I18n. – Jef

0

Điều đó có vẻ hơi dài, nhưng bạn có thực sự cần chạy rake routes thường xuyên không? Trên hệ thống của tôi, OSX Lion/Rails 3.2.0, rake routes mất ~ 10 giây.

+0

Ít nhất là ban đầu trong khi cố gắng nắm bắt được khái niệm tôi có cảm giác mình sẽ phải ;-) –

1

Tôi đã đưa ra giải pháp cho rake routes mất khoảng 8 giây để chạy mỗi lần. Đó là một bộ nhớ cache dựa trên tệp đơn giản chạy bundle exec rake routes, lưu trữ kết quả đầu ra trong một tệp theo tmp. Tên tệp là băm md5 của config/routes.rb, vì vậy nếu bạn thực hiện thay đổi và thay đổi lại, tệp sẽ sử dụng tệp được lưu trong bộ nhớ cache cũ.

tôi đặt các chức năng bash sau đây trong một tập tin thực thi mà tôi gọi 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 

Dưới đây là một github link quá.

Bằng cách này, bạn chỉ cần tạo ra các tuyến đường một lần, và sau đó fastroutes sẽ sử dụng các giá trị được lưu trữ.

0

Trong Rakefile của bạn:

#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 
Các vấn đề liên quan