在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)来获取值。