如何在构建时缩小 JavaScript 已更改(且仅更改)的文件(也就是将 "ItemGroup" 添加到 csproj 后的重复项目)
How to minify JavaScript files that have changed (and only them) when building (aka duplicate items after adding "ItemGroup" to csproj)
我已将以下代码添加到我的 .csproj 中,以缩小在构建项目时更改的 JS 文件:
<Target Name="BeforeBuild">
<MSBuild Targets="CheckAndMinifyJS" Projects="$(MSBuildProjectFile)" />
</Target>
<ItemGroup>
<JS Include="$(ProjectDir)\**\*.js" />
</ItemGroup>
<Target Name="CheckAndMinifyJS" Inputs="@(JS)" Outputs="@(JS->'$(ProjectDir)%(RecursiveDir)%(Filename).min.js')">
<AjaxMin JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".min.js" />
</Target>
<UsingTask TaskName="AjaxMin" AssemblyFile="..\..\ThirdParty\AjaxMinTask.dll" />
这很好用,但它有一个副作用:当您查看 Visual Studio (2015) 中的项目时,所有 JS 文件都出现重复(相同路径,但构建操作不同):
我想避免在项目中出现具有 "JS" 构建操作的项目。我该怎么做?
请注意,多个开发人员正在处理该项目,因此任何建议的解决方案都应包含在 .csproj 或解决方案中(例如:要求所有开发人员修改其注册表以更改默认设置是不可接受的为 JS 文件构建操作)。
要从 Visual Studio 中隐藏你的 ItemGroup
,请将其移至中间 Target
。除了该更改之外,以下代码还会过滤现有的 Content
项,而不是再次递归文件系统。这确保您不会选择无关的 .js
文件(例如 obj\
中的中间输出文件,或脚本生成但未明确添加到项目中的 .min.js
文件)。
<Target Name="BeforeBuild">
<MSBuild Targets="CheckAndMinifyJS" Projects="$(MSBuildProjectFile)" />
</Target>
<Target Name="GetJSItems" BeforeTargets="CheckAndMinifyJS">
<ItemGroup>
<JS Include="@(Content)" Condition=" '%(Extension)' == '.js' " />
</ItemGroup>
</Target>
<Target Name="CheckAndMinifyJS" Inputs="@(JS)" Outputs="@(JS->'$(ProjectDir)%(RecursiveDir)%(Filename).min.js')">
<AjaxMin JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".min.js" />
</Target>
<UsingTask TaskName="AjaxMin" AssemblyFile="..\..\ThirdParty\AjaxMinTask.dll" />
我已将以下代码添加到我的 .csproj 中,以缩小在构建项目时更改的 JS 文件:
<Target Name="BeforeBuild">
<MSBuild Targets="CheckAndMinifyJS" Projects="$(MSBuildProjectFile)" />
</Target>
<ItemGroup>
<JS Include="$(ProjectDir)\**\*.js" />
</ItemGroup>
<Target Name="CheckAndMinifyJS" Inputs="@(JS)" Outputs="@(JS->'$(ProjectDir)%(RecursiveDir)%(Filename).min.js')">
<AjaxMin JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".min.js" />
</Target>
<UsingTask TaskName="AjaxMin" AssemblyFile="..\..\ThirdParty\AjaxMinTask.dll" />
这很好用,但它有一个副作用:当您查看 Visual Studio (2015) 中的项目时,所有 JS 文件都出现重复(相同路径,但构建操作不同):
我想避免在项目中出现具有 "JS" 构建操作的项目。我该怎么做?
请注意,多个开发人员正在处理该项目,因此任何建议的解决方案都应包含在 .csproj 或解决方案中(例如:要求所有开发人员修改其注册表以更改默认设置是不可接受的为 JS 文件构建操作)。
要从 Visual Studio 中隐藏你的 ItemGroup
,请将其移至中间 Target
。除了该更改之外,以下代码还会过滤现有的 Content
项,而不是再次递归文件系统。这确保您不会选择无关的 .js
文件(例如 obj\
中的中间输出文件,或脚本生成但未明确添加到项目中的 .min.js
文件)。
<Target Name="BeforeBuild">
<MSBuild Targets="CheckAndMinifyJS" Projects="$(MSBuildProjectFile)" />
</Target>
<Target Name="GetJSItems" BeforeTargets="CheckAndMinifyJS">
<ItemGroup>
<JS Include="@(Content)" Condition=" '%(Extension)' == '.js' " />
</ItemGroup>
</Target>
<Target Name="CheckAndMinifyJS" Inputs="@(JS)" Outputs="@(JS->'$(ProjectDir)%(RecursiveDir)%(Filename).min.js')">
<AjaxMin JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".min.js" />
</Target>
<UsingTask TaskName="AjaxMin" AssemblyFile="..\..\ThirdParty\AjaxMinTask.dll" />