7

Tôi có một ứng dụng web asp.net MVC4 sử dụng gói kiểu cho các chủ đề. Tôi có cấu trúc thư mục theo chủ đề vật lý như vậy ...Làm cách nào để tự động thêm các gói sau khi Application_Start đã xảy ra?

Themes\ 
    _Base\ 
    Theme1\ 
    Theme2\ 
    ...\ 

Mỗi thư mục chủ đề có một số lượng tệp LESS tùy ý. Trong phương thức BundleConfig.RegisterBundles của tôi, tôi có một số logic lặp qua từng thư mục chủ đề và tạo một gói cho mỗi thư mục. Cơ chế đóng gói từ System.Web.Optimization sẽ xem các thay đổi trong các tệp và thư mục nằm trong các gói hiện có và xóa bộ nhớ cache của gói, hoạt động tốt. Tuy nhiên, những gì tôi cần là một cách để thư mục chủ đề mới (tức là Theme3\) được sao chép vào thư mục gốc Themes và ứng dụng để nhận dạng những thư mục đó mà không cần phải khởi động lại thư mục đó trước tiên. Tôi đã thử tạo một gói "giả" tham chiếu tất cả các tệp trong mỗi thư mục ...

var changeTracking = new StyleBundle(BUNDLE_ROOT); 
changeTracking.Transforms.Clear(); 
changeTracking.IncludeDirectory(THEME_ROOT, "*.less", true); 
changeTracking.Transforms.Add(new LessTransform()); 
changeTracking.Transforms.Add(new CssMinify()); 
bundles.Add(changeTracking); 

... nhưng điều đó dường như không giúp ích gì. Khi tôi thực hiện Theme3\, nó không kích hoạt một cuộc gọi khác đến BundleConfig.RegisterBundles. Tôi vẫn phải làm một IISRESET, tái chế các hồ bơi ứng dụng, vv để có được chủ đề mới được công nhận.

Có cách nào để tự động thêm nhóm sau khi Application_Start đã xảy ra không?

Trả lời

4

Đây không phải là điều chúng tôi đang cố gắng hỗ trợ, mong đợi là tất cả các gói được đăng ký trước khi ứng dụng bắt đầu. Nếu không, điều này sẽ gây ra các sự cố trong các tình huống webfarm nơi một số gói không tồn tại trên tất cả các máy chủ của bạn, điều này sẽ dẫn đến 404.

Các gói phụ thuộc bộ nhớ cache sẽ xử lý các phản hồi cũ từ bộ nhớ cache ASP.NET, nhưng nó sẽ không kích hoạt một cuộc gọi đến RegisterBundles, được gọi từ global.asax của bạn và sẽ chỉ được gọi trong một ứng dụng tái chế như bạn đã đề cập.

+0

Cảm ơn Hảo. Có cách nào để tôi tự xóa bộ nhớ đệm (có lẽ tương tự như http://stackoverflow.com/questions/12317391/how-to-force-bundlecollection-to-flush-cached-script-bundles-in-mvc4) và buộc nó để xây dựng lại các bó trong khi ứng dụng đang chạy? – racingcow

+0

Vâng, bạn có thể làm điều này bằng cách thực hiện một thiết lập no-op trên bất kỳ thuộc tính nào trên Bundle, như Orderer/Builder/EnableFileExtensionReplacements, về cơ bản chỉ cần thực hiện bundle.Orderer = bundle.Orderer và điều đó sẽ gây ra sự tuôn ra mà tôi nghĩ. –

+0

Có lẽ tôi nên nói "hãy gọi RegisterBundles" thay vì "xây dựng lại các gói". Tôi đang tìm cách thêm những cái mới thay vì chỉ làm mới các tập tin trong các gói hiện có. – racingcow