Как переопределить параметр CopyLocal (Private) для ссылок в.NET из MSBUILD

Я боролся с этим в течение нескольких дней, и после многих поисков я не могу найти путь, по которому я должен идти.

Что я хочу сделать, так это создать проект MSBUILD, в котором будет построено все наше приложение.NET (не более 8 решений, и, возможно, 250 проектов разделены между ними) с набором параметров, переопределенных из отдельных файлов проекта, для создания отладочной сборки. для себя.

В частности, я хочу построить нашу конфигурацию релиза с отключенной оптимизацией и сгенерированной полной отладочной информацией / pdbs. Кроме того, чтобы сократить наше в настоящее время сверхдлинное время сборки, я хочу, чтобы "copy local" (или private в фактическом файле proj xml) false для каждой ссылки каждого проекта.

Первые вещи были довольно просты, я могу довольно легко переопределить свойство уровня проекта (вы можете даже сделать это из командной строки MSBuild, используя /p), но я не могу понять, как переопределить свойство для ссылки. Я пробовал несколько вещей, которые я видел здесь, в Stackru и в Интернете, но пока что нет решения.

Я могу делать то, что хочу, изменив Microsoft.Common.targets, закомментировав код в цели _CopyFilesMarkedCopyLocal, полностью пропуская копирование этих файлов. Но я не хочу изменять свою глобальную конфигурацию и делать это при любых обстоятельствах. Я создал свой собственный файл альтернативных целей - который работает, если я изменяю отдельный файл проекта, чтобы указать на него, - но я не могу понять, как указать это для использования на верхнем уровне (мой файл.proj, который просто создает все 8 решений). Было бы здорово, если бы я мог как-то переопределить только цель _CopyFilesMarkedCopyLocal на верхнем уровне, чтобы, если MS изменяет файл целей по умолчанию, моя сборка не испортилась, но я также не могу понять, как заставить это работать.

Наилучшая вещь была бы, если бы был способ просто переопределить свойства опорного уровня, как вы можете проецировать свойство уровня, без необходимости переписывать / переопределить материал цели построения - но я не нашел информации, указывающую, что это возможно.

Заранее спасибо за любую помощь в этом.

PS Я не могу просто просмотреть все файлы проектов и изменить их; Мне нужно решение, которое оставляет существующий код на месте, как есть.

3 ответа

Решение

Попробуй это:

Задайте для CustomAfterMicrosoftCommonTargets значение C: \ foo \ filter.targets (или как вы его называете) и укажите filter.targets следующим образом:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemDefinitionGroup>
      <Reference>
        <Private>False</Private>
      </Reference>
    </ItemDefinitionGroup>
</Project>

В файл типа filter.targets добавьте цель:

<Target Name="BeforeBuild">
  <ItemGroup>
        <ReferenceNew Include="@(Reference)">
           <Private>False</Private>
        </ReferenceNew>
        <Reference Remove="@(Reference)"/>
        <Reference Include="@(ReferenceNew)"/>
  </ItemGroup>
</Target>

При этом в списке @(Reference) будет воссоздан метаданный "Private" со значением false, что гарантирует, что ссылка не будет скопирована. Затем запустите сборку своего решения или проекта со свойством $(CustomAfterMicrosoftCommonTargets), указав путь к этому файлу filter.targets.

msbuild foo.sln /p:CustomAfterMicrosoftCommonTargets=c:\foo\filter.targets

Таким образом, цель BeforeBuild будет вызвана перед сборкой проекта, и все ссылки будут установлены соответственно. Если вы хотите больше контролировать, когда или должно ли Private быть ложным или истинным, вы можете изменить цель BeforeBuild и управлять этим через свойства.

Изменить: может быть лучший способ установить метаданные в цели BeforeBuild.

Начиная с msbuild v 15, вы можете скопировать один файл с именем Directory.Build.props в корневую папку, содержащую ваш источник.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
</ItemDefinitionGroup>
</Project>

Это хорошо работает с Visual Studio 2017 и vNext Build. Возможно, вам придется закрыть Visual Studio, а затем снова открыть свое решение, чтобы применить эффект файла.

https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build

Другие вопросы по тегам