2010-03-02 10 views
24

Mam folder Scripts, który zawiera wszystkie pliki .js używane w projekcie. Używając zadania Ajax Minifier, generuję pliki .min.js dla każdego z nich. W zależności od tego, czy aplikacja działa w trybie debugowania, czy zwolnienia, dołączam oryginalny plik .js lub plik minified.Visual Studio 2010: Publikuj skasowane pliki javascript zamiast oryginalnych

Folder Skrypty wygląda następująco:

Scripts/script1.js 
Scripts/script1.min.js // Outside the project, generated automatically on build 
Scripts/script2.js 
Scripts/script2.min.js // Outside the project, generated automatically on build 

W .min.js pliki są poza projektem (choć w tym samym folderze, co oryginalne pliki), a nie są one kopiowane do folderu docelowego, gdy publikujemy projekt.

mam żadnego doświadczenia z użyciem budować zadań (no, oprócz tym minifier zadania), więc byłbym wdzięczny, jeśli ktoś może mi doradzić, co do których byłby poprawny sposób:

  • skopiuj .min.js pliki do folderu docelowego po opublikowaniu aplikacji z programu Visual Studio.
  • Usuń/nie skopiuj oryginalnych plików js (nie jest to istotne, ale wolałbym nie kopiować plików, które nie będą używane w aplikacji).

Dzięki

Edit: Z odpowiedzi, widzę, że brakowało mi pewne szczegóły, i że być może szukam złym rozwiązaniem problemu. Dodam następujące szczegóły do ​​pytania:

  • Jeśli to możliwe, wolimy raczej nie tworzyć skryptów kopiowania w procesie kompilacji rozwiązania. Jasne, zastanawialiśmy się nad tym, ale do tej pory używaliśmy projektów wdrażania sieci Web i wolimy zacząć używać nowej funkcji publikowania VS2010 (która ma zastąpić te projekty) niż ręcznego dodawania poleceń kopiowania do zadania kompilacji.
  • Pliki * .min.js nie są uwzględnione w projekcie, ponieważ nie mogą być w systemie kontroli źródła (TFS w tym momencie). Są to pliki generowane podczas kompilacji i byłoby to podobne do umieszczania folderu "bin" w TFS (łącznie z problemami, które spowodowałoby to). Może powinniśmy utworzyć pliki min w innym folderze i traktować je jak "bin"? (Czy to nawet możliwe?)
+1

Czy istnieje szczególny powód, dla którego są "poza projektem"? Możesz oczywiście tworzyć zadania MSBUILD, aby poradzić sobie z tym wszystkim, ale znacznie łatwiej byłoby po prostu uwzględnić je w projekcie. –

+1

Dodałem wyjaśnienie do pytania. Jest tak, ponieważ dodanie plików do projektu spowoduje umieszczenie ich w serwerze TFS. Może istnieje sposób na włączenie ich do projektu, ale wykluczenie ich z TFS? Mmm ... Nie myślałem o tym! – salgiza

Odpowiedz

20

Edit (2012 października): ASP.NET 4.5 zawiera teraz Bundling and minification. Obecna wersja nie obsługuje bardzo dobrze dynamicznego generowania javascriptu, ale poza tym jest całkiem użyteczna i na przykład ogląda system plików, aby przeżyć zmiany, jak opisano poniżej; przed uruchomieniem własnej kompresji, spróbuj tego!

Old odpowiedź:

Zamiast zaimplementować to w czasie kompilacji, proponuję zrobić przy starcie. Ma to wiele zalet:

  • Można włączyć parametry debugowania, które wyłączają łączenie i zminimalizowanie, aby ułatwić identyfikację błędów. Pozwala to również na pracę z mniejszą różnicą między środowiskiem programistycznym a produkcyjnym.
  • Zyskujesz trochę elastyczności. Dwa razy udało mi się naprawić błędy za pomocą poprawki tylko do skryptu, która może zostać uruchomiona bezpośrednio. Dla prostych, ale krytycznych błędów jest to dobra opcja.
  • Jest to nieco prostsze do wdrożenia - masz już doświadczenie w implementowaniu odpowiedzi HTTP, co jest tutaj przyjemne.
  • Możesz śledzić datę ostatniej modyfikacji skryptów, a nie tylko użyć jej do ustawienia odpowiednich ETagów i innych (które mogą również zrobić usługi IIS), ale raczej ustawić datę końca przyszłej. Zamiast łączenia rzeczywistego sciptu (minified lub nie), możesz połączyć skrypt z krótkim tokenem w querystringu - w ten sposób klienci nie muszą sprawdzać, czy js się zaktualizował. Gdy tak się stanie, strony będą linkować do "nowego" pliku skryptu, który w każdym razie musi być osobno zamówiony. (Jest to możliwe do zrobienia w skryptach budujących, ale trudniejsze).
  • Złożony proces budowy często ma ukryte koszty. Nie tylko trwa dłużej, ale co się dzieje, gdy chcesz zaktualizować narzędzie do automatyzacji kompilacji? Kiedy przełączasz wersje IIS lub Windows? Po migracji do VS 2010? Jak łatwo przyspieszyć pracę nowych programistów?

To jest szorstka Zarys procesu śledzę:

  1. określić jako dwa katalogi zawierające tylko ściśliwy css i js. W instancji appdomain lub krótko po niej za pośrednictwem konstruktora statycznego klasa znajduje zawartość tych katalogów i tworzy FileSystemWatcher, aby obejrzeć zmiany.
  2. Wszystkie pliki są odczytywane w kolejności nazw plików (za pomocą prefiksów, takich jak 00_jquery.js10_init.js itp. Pomaga kontrolować kolejność tutaj). Lista nazw plików jest przechowywana do celów debugowania.
  3. Wszystkie pliki są łączone poprzez konkatenację ciągów, a następnie pomniejszane przez YUI, a następnie kompresowane za pomocą GZipStream. Token specyficzny dla wersji jest obliczany albo według daty ostatniej modyfikacji ostatniej, albo w wyniku wartości skrótu wyniku.
  4. Wynik kompresji (tablica bajtów, nazwy plików i token zależny od wersji) jest przechowywany w statycznej zmiennej klasy (chronionej przez lock). Jeśli obserwator systemu plików wykryje aktualizację, krok 2 rozpoczyna się od nowa i działa w tle do momentu zakończenia kompresji - a więc do zablokowania.
  5. Każda strona, która chce dołączyć połączony javascript (i/lub css), wywołuje wspólną zmienną statyczną. Jeśli jesteśmy w trybie debugowania, który generuje znacznik skryptu (lub łącza) dla każdej nazwy pliku zapisanej w kroku drugim, w przeciwnym razie generuje pojedynczy tag skryptu (lub łącza) do URI, który jest obsługiwany przez niestandardowe IHttpHandler. Wszystkie Uri zawierają token specyficzny dla wersji w querystringu - jest to ignorowane zarówno przez obsługę plików statycznych IIS, jak i niestandardową procedurę obsługi http dla połączonej, zminimalizowanej wersji, ale ułatwia buforowanie.
  6. W niestandardowym IHttpHandler, gdy zostanie odebrane żądanie dla połączonego javascript (lub css), nagłówek Content-Encoding: gzip jest ustawiony i data ważności jest znacznie późniejsza. Następnie wstępnie skompresowana tablica bajtów jest zapisywana bezpośrednio do strumienia http poprzez context.Response.OutputStream.

Stosując to podejście, nie będzie konieczne korzystanie z opcji web.config przy dodawaniu lub usuwaniu pliku skryptu; możesz aktualizować skrypty, gdy aplikacja jest uruchomiona, a klienci będą ich żądać na następnym widoku strony - ale nadal będziesz otrzymywać optymalne zachowanie pamięci podręcznej, ponieważ przeglądarki nie wyślą nawet żądania niezmodyfikowanego z powodu nagłówka wygasania. Zwykle kompresowanie skryptów powinno zająć mniej więcej sekundę, a skompresowany wynik powinien być tak mały, że narzut pamięci zmiennej statycznej jest pomijalny (co najwyżej kilka 100 KB dla naprawdę dużej ilości skryptów/css).

+0

Nie jest to dokładnie odpowiedź, której szukam, ale z pewnością jest to interesujące rozwiązanie (i na pewno ma kilka zalet). Sądzę, że jeśli nie można użyć Microsoft Minifier + Microsoft's TFS + Microsoft Visual Studio, to będzie to rozwiązanie:/ – salgiza

+2

Dlaczego jednak chcesz to zrobić w czasie kompilacji - jaka jest przewaga? Jest prawie pewne, że jest to więcej pracy, więcej kłopotów i mniej elastyczności. –

+0

To będzie mniej elastyczne, ale biorąc pod uwagę, że użycie Minimizer polega na dodaniu trzech linii do XML projektu, nie powiedziałbym, że to więcej pracy!;) – salgiza

3

Prawdopodobnie chcesz rzucić okiem na Build Events, za pomocą którego możesz określić wiersz poleceń, aby wykonać post-build. Twoje pytanie jest dodatkowo podobne do thesequestions.

Do rzeczywistego kopiowania można w łatwy sposób użyć polecenia COPY.

+0

Dziękuję za odpowiedź, ale jeśli to możliwe, wolimy użyć nowej funkcji publikowania VS2010, ponieważ zawiera ona pewne funkcje, których chcemy używać w przyszłości. – salgiza

7

Jeśli chcesz zrobić Javascript minifikacji przez Visual Studio, to będzie Ci zacząć: http://encosia.com/2009/05/20/automatically-minify-and-combine-javascript-in-visual-studio/

W przeciwnym razie, polecam narzędzie, które może automatycznie łączyć i Minify Javascript. Dwa narzędzia, na które patrzyłem, to: Justin Etheredge 's Bundler i Combres. Używam programu Bundler w moim bieżącym projekcie, a jeden z moich współpracowników używa Combres. Bundler jest nieco prostszy w użyciu, ale robi mniej niż Combres. Jeśli program Bundler jest wyłączony w web.config, to nie jest on pomijany i łączony, co oznacza, że ​​możesz debugować javascript w swoim środowisku programisty.

P.S.Bundler został przemianowany na SquishIt.

+0

Dzięki, ale minifying nie jest problemem (używaliśmy YUI w przeszłości, a ostatnio migrowaliśmy do minifier Microsoftu). Oczekiwaliśmy, że Microsoft uzna, że ​​ludzie użyją własnego miniarki podczas tworzenia opcji publikowania VS2010, ale: S – salgiza

+2

Pamiętaj, że łączenie skryptów w jeden plik javascript jest prawie tak samo ważne jak ich minimalizowanie. Przyspiesza to działanie, jeśli możesz ograniczyć liczbę żądań HTTP. –

2

Nie jestem do końca pewien, czy takie podejście byłoby przydatne w tej sytuacji, ale mogę to sobie wyobrazić ... Możesz modyfikować pliki csproj na przykład wpływ na to, jakie pliki powinny być zawarte w określonym typie kompilacji.

W przypadku niektórych typów mam na myśli program Configuration Manager.

Debugowanie i wydawanie są domyślnymi, ale nic nie powstrzyma cię przed zrobieniem nowych. Na podstawie wybranej konfiguracji możesz mieć różne pliki będące częścią konfiguracji i przypuszczam, że możesz publikować różne pliki w ten sposób. Mam describds tej strategii na moim blogu tutaj: http://realfiction.net/go/130

+0

Mmmm ... To interesujące rozwiązanie, ale czy rozwiązałoby problem polegający na tym, że nie chce dołączać plików *. Min do TFS/CSV? (Edytowałem to pytanie, ponieważ zapomniałem wspomnieć, że to był powód, aby wykluczyć zminimalizowane pliki z projektu). – salgiza