Проблема с переопределением BuildDependsOn в проекте C#

Я пытаюсь следовать документам здесь — 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 с тем же эффектом.

Какие-либо предложения? Что мне здесь не хватает?

Заранее спасибо за помощь!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
511
2

Ответы 2

Метод, который я предпочитаю для добавления цели сборки, которая зависит от чего-то еще, — это 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 15.02.2019 20:35

@ddneilson Какая часть «Как продлить процесс сборки», кажется, не работает? Вы видели комментарий в этой документации, относящийся к проектам в стиле SDK?

Alan West 13.04.2020 20:18

Причина, по которой все работает не так, как вы ожидаете, заключается в том, что у вас есть проект в стиле 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.

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