2014-12-18 15 views
9

In Visual Studio 2013, wie kann ich Javascript und CSS im Post-Build-Schritt minimieren? Ich würde gerne jede einzelne css und js Datei in eine .min.js oder .min.css im selben Ordner komprimieren.Wie reduziere ich in Visual Studio 2013 Javascript und CSS im Post-Build-Schritt

Ich möchte die minimierten Dateien nicht einchecken, sondern sie nur post-build generieren lassen.

+0

Es gibt ein kostenloses Add-on in der Visual Studio-Galerie für dieses: https://visualstudiogallery.msdn.microsoft.com/059bdfb0-9111-47c7-805c-5d51bba7d0d4 – TylerH

+0

B & M ist eingebaut. Konfigurieren Sie bundleconfig und stellen Sie sicher, dass WebGrease- und Antlr-Referenzen vorhanden sind. Runtime verwendet gebündelte und minimierte Dateien basierend auf Ihrem debug = "false" in web.config. – Abhitalks

+2

Sie arbeiten nicht an einer MVC-App, oder? In diesem Fall werden Ressourcendateien automatisch verkleinert. – im1dermike

Antwort

3

Mit Microsoft Ajax Minifier können Sie Powershell-Skript erstellen, um verkleinerte Versionen aller Dateien im angegebenen Ordner zu erstellen und sie zu Post-Build-Ereignissen hinzuzufügen.

Beispiel für js Dateien (es wird für CSS ähnlich sein):

Get-ChildItem *.js -Exclude *.min.js | 
    Foreach-Object{ 
    $file = [io.fileinfo]$_.Name 
    ajaxmin $file.Name -out "$($file.Name).min$($file.Extension)" 
} 

prüft auch eine Seite mit vollständiger Liste des command line switches z.B .: -map schafft Quelle Map-Datei.

3

Alle Lösungen, die ich fand, erforderten die Verwendung verschiedener Dateinamen für die minimierten Versionen und eine Menge zusätzlicher Arbeit, um zwischen den normalen/minimierten Versionen zu wechseln.

Stattdessen wollte ich, dass die komprimierten JavaScript-Dateien die ursprünglichen Namen hatten, sodass ich die Verweise in meinem HTML-Markup nicht ändern musste. Ich könnte die normalen Javascript-Dateien in meiner Entwicklungsumgebung verwenden, dann würden minimierte Versionen automatisch beim Veröffentlichen bereitgestellt werden.

Ich fand eine einfache Lösung, die genau das tut.

Zuerst installieren Sie Microsoft Ajax Minifier.

Dann in Ihrer Visual Studio-Projektdatei, kurz vor dem Schließen </Project> Tag fügen Sie folgend:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\Microsoft Ajax Minifier\ajaxmin.tasks" /> 
<Target Name="AfterBuild" Condition="'$(ConfigurationName)'=='Release'"> 
    <ItemGroup> 
    <JS Include="**\*.js" Exclude="**\*.min.js;obj\**\*.*" /> 
    <CSS Include="**\*.css" Exclude="**\*.min.css;obj\**\*.*" /> 
    </ItemGroup> 
    <AjaxMin 
    JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".jsMIN" 
    CssSourceFiles="@(CSS)" CssSourceExtensionPattern="\.css$" CssTargetExtension=".cssMIN" /> 
</Target> 
<PropertyGroup> 
    <CopyAllFilesToSingleFolderForPackageDependsOn> 
    CustomCollectFiles; 
    $(CopyAllFilesToSingleFolderForPackageDependsOn); 
    </CopyAllFilesToSingleFolderForPackageDependsOn> 
</PropertyGroup> 
<Target Name="CustomCollectFiles"> 
    <ItemGroup> 
    <MinJS Include="**\*.jsMIN" /> 
    <FilesForPackagingFromProject Include="%(MinJS.Identity)"> 
     <DestinationRelativePath>%(RecursiveDir)%(Filename).js</DestinationRelativePath> 
    </FilesForPackagingFromProject> 
    <MinCSS Include="**\*.cssMIN" /> 
    <FilesForPackagingFromProject Include="%(MinCSS.Identity)"> 
     <DestinationRelativePath>%(RecursiveDir)%(Filename).css</DestinationRelativePath> 
    </FilesForPackagingFromProject> 
    </ItemGroup> 
</Target> 

Was ist der obige Code tun? Wenn Sie in Visual Studio veröffentlichen, findet dieser Code alle .js und .css Datei in Ihrer Quelle, und erstellen Sie eine minimierte Kopie mit der Erweiterung .jsMIN und .cssMIN. Es ignoriert Dateien, die bereits minimiert wurden. Dann kopiert es diese minimierten Dateien unter Verwendung der ursprünglichen Dateinamen in den Deployment-Ordner.

Voilà! Sie haben gerade veraltete JS/CSS-Dateien veröffentlicht, während Ihre Originaldateien in Ihrer Entwicklungsumgebung intakt bleiben.

Optional:
Möchten Sie, dass Ajax Minifier mit Ihrem Projekt kombiniert wird? Im Installationsordner von Ajax Minifier können Sie AjaxMin.dll und AjaxMinTask.dll direkt in Ihr Quellverzeichnis verschieben. Ich habe sie in meinen Ordner App_Data gelegt. Sobald sie sich irgendwo in Ihrer Quelle befinden, klicken Sie in Visual Studio mit der rechten Maustaste darauf, wählen Sie Include in Project und ändern Sie auch ihre Build Action-Eigenschaft in None.

Dann im Code enthalten ich oben, ändern
<Import Project="$(MSBuildExtensionsPath)\Microsoft\Microsoft Ajax Minifier\ajaxmin.tasks" />
zu
<UsingTask TaskName="AjaxMin" AssemblyFile="$(MSBuildProjectDirectory)\App_Data\AjaxMinTask.dll" />
Fertig.

Ein Tipp zur Fehlerbehebung:
Mein Hauptcode über AfterBuild ausführt und nur dann, wenn die Konfiguration Release. Das ist so, dass es nur während einer Veröffentlichung läuft.Wenn Ihre Konfiguration anders benannt ist oder unter anderen Umständen ausgeführt werden soll, ändern Sie den Code nach Bedarf.

+0

Bitte nicht die gleiche Antwort auf mehrere Fragen ([1] (http://stackoverflow.com/a/33591146), [2] (http://stackoverflow.com/a/33591166), [3 ] (http://stackoverflow.com/a/33591169), [4] (http://stackoverflow.com/a/33591179), [5] (http://stackoverflow.com/a/33591185)). Wenn es sich bei den Fragen tatsächlich um Duplikate handelt, sollten Sie Ihre einzige Antwort auf die beste Frage und das Flag/Vote posten, um die anderen als Duplikat zu schließen. Wenn dies keine Duplikate sind, müssen Sie jede einzelne Antwort auf die spezifische Frage anpassen. –

+0

@ ArtjomB. Die Antwort ist zutreffend und richtig für jede der Fragen. Die Fragen sind ähnlich genug, dass keine Anpassung der Antwort notwendig ist. Wenn Sie denken, dass die Fragen Duples sind, fühlen Sie sich frei, Maßnahmen zu ergreifen. Ich würde nie die gleiche Antwort zweimal posten, jedoch wurde diese Frage in mehreren verschiedenen Variationen, ohne eine vollständige einfache Antwort gefragt. Diese Antwort erfüllt dies, so dass jetzt jedes OP die Antwort hat, zusammen mit jedem, der nach der Antwort sucht, die über eine der Fragevarianten stolpert. –

+0

Ich habe gewählt, um fast alle Fragen zu schließen, die Sie beantwortet haben. Einer von ihnen war geschlossen. –