Как минимизировать файлы 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" />
Другие вопросы по тегам