Я пытаюсь следовать документам здесь — https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=vs-2017 — чтобы добавить простую цель в конвейер сборки файла проекта .NET Core. Тем не менее, я делаю что-то не так, но просто не вижу этого.
Я взял простой файл проекта «Hello World», добавил простую цель, которая просто печатает сообщение, и переопределил BuildDependsOn, как это предлагается в документах, чтобы получить:
<Project Sdk = "Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<BuildDependsOn>
Target1;
$(BuildDependsOn)
</BuildDependsOn>
</PropertyGroup>
<Target Name = "Target1">
<Message Text = "Running Target1" Importance = "high" />
</Target>
</Project>
Сообщение не печатается, когда я пытаюсь "собрать" этот проект с помощью msvc2017 или CLI dotnet ("dotnet build -c Release Hello.csproj").
Когда я использую msbuild для просмотра полностью предварительно обработанного проекта, я ясно вижу определение свойства BuildDependsOn. Я не уверен, почему мое переопределение не принимается. Я также пробовал то же самое с RebuildDependsOn с тем же эффектом.
Какие-либо предложения? Что мне здесь не хватает?
Заранее спасибо за помощь!





Метод, который я предпочитаю для добавления цели сборки, которая зависит от чего-то еще, — это BeforeTargets и AfterTargets.
Задокументировано здесь:
https://docs.microsoft.com/en-us/visualstudio/msbuild/target-build-order?view=vs-2017
Я думаю, что это намного проще, и я мог бы добавить, что в нем меньше XML.
<Project Sdk = "Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<Target Name = "Target1" AfterTargets = "Build" >
<Message Text = "Running Target1" Importance = "high" />
</Target>
</Project>
@ddneilson Какая часть «Как продлить процесс сборки», кажется, не работает? Вы видели комментарий в этой документации, относящийся к проектам в стиле SDK?
Причина, по которой все работает не так, как вы ожидаете, заключается в том, что у вас есть проект в стиле SDK: <Project Sdk = "Microsoft.NET.Sdk">.
Обратите внимание, что это:
<Project Sdk = "Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
</Project>
эквивалентно этому:
<Project>
<!-- Implicit top import -->
<Import Project = "Sdk.props" Sdk = "Microsoft.NET.Sdk" />
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
<!-- Implicit bottom import -->
<Import Project = "Sdk.targets" Sdk = "Microsoft.NET.Sdk" />
</Project>
Неявный импорт Sdk.targets в конце вашего проекта перезаписывает ваше определение BuildDependsOn.
Вместо этого вы можете явно добавить импорт, а затем добавить свое определение BuildDependsOn после импорта Sdk.targets.
<Project>
<Import Project = "Sdk.props" Sdk = "Microsoft.NET.Sdk" />
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<Target Name = "Target1">
<Message Text = "Running Target1" Importance = "high" />
</Target>
<Import Project = "Sdk.targets" Sdk = "Microsoft.NET.Sdk" />
<PropertyGroup>
<BuildDependsOn>
Target1;
$(BuildDependsOn)
</BuildDependsOn>
</PropertyGroup>
</Project>
См. Практическое руководство. Расширение процесса сборки Visual Studio и Практическое руководство. Использование пакетов SDK проекта MSBuild.
Да, я смог заставить его работать с чем-то вроде этого. Мне просто показалось очень странным, что механизм, описанный на странице «Как расширить процесс сборки», похоже, не работает. Итак, я полагаю, что я должен просто что-то упустить, но не могу понять, что.