Как минимизировать файлы JavaScript, которые изменились (и только они) при сборке (или дублировать элементы после добавления "ItemGroup" в 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).
1 ответ
Чтобы скрыть ItemGroup
из Visual Studio, переместите его в промежуточный 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" />