我发现所有解决方案都需要为最小化版本使用不同的文件名,并且在使用正常/最小化版本之间切换需要做很多额外的工作。
相反,我希望压缩的 JavaScript 文件具有原始名称,因此我不必更改 HTML 标记中的引用。我可以在我的开发环境中使用普通的 Javascript 文件,然后在发布时会自动部署最小化版本。
我找到了一个简单的解决方案。
首先,安装Microsoft Ajax Minifier。
然后,在您的 Visual Studio 项目文件中,在结束 </Project> 标记之前添加以下内容:
<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>
上面的代码是做什么的?当您在 Visual Studio 中发布时,此代码将在您的源代码中找到每个 .js 和 .css 文件,并使用扩展名 .jsMIN 和 .cssMIN 创建一个缩小的副本。它将忽略已经缩小的文件。然后它将使用原始文件名将这些缩小的文件复制到部署文件夹。
瞧!您刚刚发布了缩小的 JS/CSS 文件,而您的原始文件在您的开发环境中保持不变。
可选:
想要将 Ajax Minifier 打包到您的项目中吗?从 Ajax Minifier 安装文件夹中,您可以将 AjaxMin.dll 和 AjaxMinTask.dll 直接移动到您的源目录中。我把它们放在我的App_Data 文件夹中。一旦它们位于源中的某个位置,在 Visual Studio 中右键单击它们,选择 Include in Project,并将它们的 Build Action 属性更改为 None。
然后在我上面包含的代码中,更改
<Import Project="$(MSBuildExtensionsPath)\Microsoft\Microsoft Ajax Minifier\ajaxmin.tasks" />
到
<UsingTask TaskName="AjaxMin" AssemblyFile="$(MSBuildProjectDirectory)\App_Data\AjaxMinTask.dll" />
完成。
故障排除提示:
我上面的主要代码执行AfterBuild 并且仅当配置为Release 时。所以它只会在发布期间运行。如果您的配置被命名为其他名称,或者您希望它在其他情况下运行,请根据需要修改代码。