在Visual Studio中通過修改發布配置文件,可以在發布Web時自動調用YUICompressor批量壓縮項目中JS和CSS。這種方式的優點,一是不需要在項目的js、css文件夾中單獨建立debug子文件夾來存放未經壓縮的文件,二是使用debug模式發布時不會進行壓縮方便調試。具體方法如下:
1 安裝JRE,下載YUICompressor,並解壓(如:E:\工具\yuicompressor)
2 新建Compressor.bat文件內容為:
@echo off
if "%1" == "" goto exit
pushd "%1"
echo 正在壓縮Css文件
for /r %%i in (*.css) do call "java.exe" -jar E:\工具\yuicompressor\yuicompressor.jar -o %%i %%i
echo 正在壓縮js文件
for /r %%i in (*.js) do call "java.exe" -jar E:\工具\yuicompressor\yuicompressor.jar -o %%i %%i
:exit
exit
3 修改項目的發布配置文件, 項目的發布配置文件名為 <profilename>.pubxml,位於項目文件夾下的properties\PublishProfiles文件夾
增加下面的內容:
<Target Name="YUICompressor" AfterTargets="CopyAllFilesToSingleFolderForPackage" Condition="'$(ConfigurationName)'=='Release'">
<Message Text="調用YUICompressor壓縮CSS、JS" Importance="high" />
<Exec Command="call E:\工具\Compressor.bat $(ProjectDir)obj\$(ConfigurationName)\Package\" />
</Target>
注: E:\工具\Compressor.bat路徑根據需要替換。
完成上面的工作后在“解決方案資源管理器”中右擊要發布的項目點擊“發布”后就可以在項目發布文件夾中看到已經壓縮過的CSS、JS了
2013.3.17更新:
VS2010中沒有pubxml文件,可以在項目的根目錄下創建一個{ProjectName}.wpp.targets文件,如果你的項目文件名是WebFromApplication.csproj那么就是WebFromApplication.wapp.targets。它是一個MSBuild 構建文件(pubxml文件也是一個MSBuild構建文件),我們可以使用它來擴展Visual Studio生成/發布過程。
內容如下:
<?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/MsBuild/2003"> <PropertyGroup> <YUICompressor>E:\工具\yuicompressor\yuicompressor.jar</YUICompressor> </PropertyGroup> <ItemGroup> <JavaScriptFiles Include="$(ProjectDir)$(_PackageTempDir)\**\*.js"/> </ItemGroup> <Target Name="Compressor" AfterTargets="CopyAllFilesToSingleFolderForPackage" > <Message Importance="high" Text="YUICompressor JavaScriptFiles" ></Message> <Exec Command="java.exe -jar $(YUICompressor) -o %(JavaScriptFiles.Identity) %(JavaScriptFiles.Identity)" /> </Target> </Project>
說明:
1 在這個MSBUILD構建文件中使用<ItemGroup>元素來選取需要壓縮的文件集合,來代替上例中的bat文件。在后面的Exec任務使用%(JavaScriptFiles.Identity)來表示選取集合中當前執行壓縮的單個文件。其中$(ProjectDir)和$(_PackageTempDir)是MSBuild預定義的屬性,分別表示項目根目錄位置和相對項目根目錄的臨時打包文件的位置。
2 使用<PropertyGroup>元素來定義yuicompressor.jar文件的位置,在后面Exec 任務中使用$(YUICompressor)來獲取值。