Błąd w cache Tanka Nancy Optimization

Ostatio w poście napisałem jak łączyć arkusze stylów z użyciem Tanka Nancy Optimization. Podobnie można także robić z plikami javascript. Jednakże Tanka Nancy Optimization framework zawiera pewien błąd, który powoduje zwracanie błędnych pakietów zawierających połączone pliki css lub js.

Jak to? Jak to się stało?

Błąd polega na tym, że połączone i spakowane wiązki są przechowywane w cache, ale klucz do cache jest generowany w dość ubogi sposób i do tego z błędem. Bierze on pod uwagę jedynie czas modyfikacji pliku. Ponadto tworząc FileInfo nie jest brana pod uwagę absolutna ścieżka, co skutkuje pobieraniem własności nieistniejącego pliku, a czas ostatniej modyfikacji pliku, który nie istnieje to 1601-01-01. Wynikiem tego zamieszania jest to, że CacheKey zależy jedynie od ilości plików w wiązce.

Studium przypadku

Podczas migracji projektu z ASP.NET MVC do stworzyłem kilka wiązek:

A następnie użyłem ich w pliku razora:

Zgodnie z oczekiwaniami wynikowy plik HTML zawierał tagi:

Strona jednak nie działała, debugger komunikował brak jquery. Ku mojemu zdziwieniu serwer to samo dla /bundles/modernizr.js jak i dla /bundles/jquery.js.

blad-tanka-modernizr-zamiast-jquery
Analizując genezę problemu potwierdza się, że wszystkie wiązki zawierające po tyle samo plików źródłowych (tutaj słownie po jednym pliku źródłowym) dostają taki sam klucz cache i są nierozróżnialne z punktu widzenia serwera.

Workaround?

Zgłosiłem buga autorowi i trzeba czekać lub poprawić samemu i przekompilować. Najprostsze rozwiązanie typu „przyspawaj mufkę” to tworzenie pakietów zawierających różne ilości plików źródłowych. W razie czego upychamy sianem, czyli tworzymy puste pliki js lub css.Takie rozwiązanie polecam każdemu, kto ma na załatanie 3 minuty i popiera zasadę, że rozwiązania na ślinę i taśmę klejącą są najtrwalsze i najrozsądniejsze :).

Wersja dla twardzieli

Dla tych co chcą poprawić źródła projektu Tanka.Nancy.Optimization podaję 2 skuteczne kroki:

Po pierwsze: w pliku Bundle.cs dokonaj poniższych zmian

Po drugie: do projektu Tanka.Nancy.Optimization dodać klasę o nazwie Startup lub podobnej i poniższej treści:

I po przekompilowaniu i podstawieniu nowych bibliotek cache działa poprawnie.

Powyższe zmiany są dostępne na moim forku projektu https://github.com/isukces/Tanka.Nancy.Optimization.