Как переопределить параметр 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