Tùy chọn biên dịch trước mới trong quá trình xuất bản có tác dụng gì đối với các ứng dụng MVC4?


85

Vì vậy, gần đây tôi đã cập nhật Visual Studio 2012 lên Cập nhật 2. Xin lưu ý, vào lần tiếp theo tôi xuất bản ứng dụng của mình (trong trường hợp này là Xuất bản tệp), tôi nhận thấy rằng có ba tùy chọn mới:

  1. Xóa tất cả các tệp hiện có trước khi xuất bản
  2. Biên dịch trước trong khi xuất bản (với liên kết để Định cấu hình)
  3. Loại trừ các tệp khỏi thư mục App_Data

Tùy chọn đầu tiên và thứ ba khá dễ hiểu, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về tùy chọn thứ hai vì nó áp dụng cho MVC. Khi tôi kiểm tra, dường như không có bất kỳ thay đổi nào trong các tệp được tạo trên trang web và tôi không thấy bất kỳ thay đổi thực sự nào về hiệu suất.


Vị trí của hàm có thể mới, nhưng bản thân hàm thì không. Ngay cả khi nó không liên quan đến việc biên dịch MVC, các WebForms có thể tương tác trong một dự án MVC.
Grant Thomas

Câu trả lời:


84

Việc sử dụng trình biên dịch trước ASP.NET có thể có tác động sau đối với ứng dụng MVC của bạn:

  • Nếu bạn có bất kỳ thứ gì trong App_Code, nó sẽ được biên dịch trước thành DLL trước khi triển khai. Nếu không biên dịch trước, điều này sẽ xảy ra nhanh chóng bởi thời gian chạy ASP.NET.
  • Nếu bạn chọn tùy chọn không làm cho các trang của bạn có thể cập nhật được (tức là bỏ chọn hộp kiểm đầu tiên trong hộp thoại cài đặt nâng cao), nó cũng sẽ biên dịch trước các chế độ xem của bạn (ASPX và Razor) thay vì biên dịch động chúng trong thời gian chạy. Cài đặt mặc định (đã chọn) của "Cho phép cập nhật trang web được biên dịch trước" cho phép bạn cập nhật nội dung chế độ xem của mình mà không cần phải xây dựng lại toàn bộ dự án.

Nếu bạn không có bất kỳ tệp nào trong App_Code và bạn muốn trang web của mình vẫn có thể cập nhật được, thì nó dường như không hiệu quả nhiều.


7
@Elsimer Các tệp .cshtml của bạn sẽ vẫn tồn tại, nhưng nếu nội dung của chúng được biên dịch trước, bạn sẽ thấy nội dung của chúng được thay thế bằng "Đây là tệp đánh dấu được tạo bởi công cụ biên dịch trước và không nên bị xóa!".
Jimmy

4
Ngoài ra, hiệu suất tăng chủ yếu là ở lần khởi chạy trang web đầu tiên, khi trình biên dịch được gọi động cho mỗi trang. Khi trang đã được truy cập một lần (và được biên dịch), kết quả biên dịch đó sẽ được sử dụng trong các lần tải trang tiếp theo ngay cả khi bạn chưa biên dịch trước.
Jimmy

15
Một lợi ích bổ sung của việc KHÔNG cập nhật các trang của bạn là VS sẽ tìm thấy các lỗi loại trong chế độ xem của bạn trước khi chúng đến trang web trực tiếp của bạn.
Chris

4
@Chris, bạn nên xem xét lại chiến lược thử nghiệm của mình nếu những lỗi như vậy xảy ra mà không có tùy chọn biên dịch trước.
user247702

2
@ AndersLindén: Chỉ cần kiểm tra phản hồi kết xuất thực tế của các hành động trên bộ điều khiển của bạn. Điều đó sẽ gọi Razor và nếu nó tạo ra một ngoại lệ, điều đó sẽ không thành công bài kiểm tra của bạn. Tuy nhiên, đây cũng là lý do tại sao quan điểm của bạn nên rất nhẹ về mã. Bạn thực sự không thể thực hiện kiểm tra đơn vị chi tiết trên mã chế độ xem như bạn có thể làm trên một lớp học. Nó gần như chỉ đạt hoặc không đạt, và thậm chí sau đó, vượt qua chỉ có nghĩa là nó không tạo ra bất kỳ ngoại lệ nào, không phải là nó thực sự đã làm những gì nó được cho là.
Chris Pratt

0

Đó là một câu hỏi cũ, nhưng tôi chỉ gặp vấn đề tương tự và cảm thấy có điều gì đó đáng chia sẻ.

Thông báo lỗi của tôi giống nhau trong bài đăng này. Dự án của tôi là MVC5, xây dựng bằng Visual Studio 2013 chuyên nghiệp. Lỗi biên dịch: Loại 'ASP.global_asax' tồn tại trong cả hai tệp DLL

Trong trường hợp của tôi, với tùy chọn biên dịch trước, có một tệp, App_global.asax.dll, trong thư mục bin và gây ra thông báo lỗi ở trên. Đầu tiên, tôi xóa App_global.asax.dll trên máy chủ, khởi động lại nhóm ứng dụng, sự cố đã biến mất. Sau đó, tôi đã thử một cách tiếp cận khác, bỏ chọn biên dịch trước và xuất bản lại, triển khai lại tới máy chủ, sự cố đã biến mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.