Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Цель msbuild - AfterTargets = Сборка для решения?

Автор вопроса: Rand RandomОтветов: 1

Я ищу способ запускать определенный Target только один раз для каждого процесса сборки, а не для каждого проекта, который получает сборку.

Я определил следующее в Directory.Build.props

<Target Name="MyTarget" AfterTargets="AfterBuild" >

    <Message Text="Hello World!!!" Importance="High" />

</Target>

Должен запускаться только один раз, независимо от того, сколько проектов создает msbuild процесс, в настоящее время это происходит для каждого проекта.

Не имеет значения, нажму ли я (Re-)Build Soltution, (Re-)Build [ProjectName] или F5 в Visual Studio, пока выполняется любая сборка, я хочу выполнить MyTarget только один раз.

  • Я думаю, вы хотите, чтобы цель была выполнена один раз, а затем, когда вы построите ее во второй раз, она не будет выполнена, верно? Mr Qian 11.02.2021
  • @ PerryQian-MSFT - например, у меня есть решение, содержащее 3 проекта, я нажимаю Build Solution, который строит все 3 проекта, он должен выполняться только один раз, если я нажимаю Build Project B, но внутренний процесс сборки решает из-за ссылок, которые ему нужны для сборки проекта До Project B я все еще хотел бы запускать его только один раз, поэтому в основном то, что когда-либо решает сделать msbuild, когда я нажимаю какое-либо действие сборки, мое желание состояло бы в том, чтобы запускать материал только один раз, когда он выполняется со всем Rand Random 11.02.2021
  • Но он должен запуститься еще раз, если начнется новый процесс сборки. Rand Random 11.02.2021
  • @ PerryQian-MSFT - на случай, если вас это интересует или вам нужно знать, зачем мне это нужно, здесь вы найдете подробное объяснение - github.com/NuGet/Home/issues/10560 Rand Random 11.02.2021
  • мой ответ поможет вам справиться с проблемой? Mr Qian 17.02.2021
  • @ PerryQian-MSFT - к сожалению, нет, потому что он срабатывает уже при второй сборке проекта, а не в самом конце, например. представьте себе решение с 50 проектами, и вы нажмете решение для перестройки, я бы хотел, чтобы мои материалы запускались один раз в самом конце, когда все было построено, но ваш ответ, кажется, выполняется уже после сборки второго проекта, да, он выполняет только один раз, но желаемое время выключено Rand Random 17.02.2021

visual-studiomsbuildmsbuild-taskcsproj

Ответы

Ответ 1 · рейтинг 1 · Mr Qian

Просто ответьте на эту ситуацию:

Если мое предположение верно, чистой функции msbuild недостаточно, и вам нужно использовать внешний файл, чтобы она работала.

создайте файл с именем test.txt в папке решения и напишите 0 в текстовом файле.

Затем измените свой Directory.Build.props следующим образом:

<Project>
<PropertyGroup>
  <Record></Record>
</PropertyGroup>
<ItemGroup>
    <File Include="..\test.txt"></File>
</ItemGroup>
    <Target Name="GetConditionValue" BeforeTargets="PrepareForBuild">

    <ReadLinesFromFile File="@(File)">
        <Output TaskParameter="Lines" PropertyName="Record"/>
      </ReadLinesFromFile>
    </Target>


<Target Name="MyTarget" AfterTargets="Build" Condition="'$(Record)'=='0'">

 <WriteLinesToFile File="@(File)" Lines="2" Overwrite="true"></WriteLinesToFile>

  <Message Text="Hello World!!!" Importance="High" />
  </Target>

</Project>

Когда вы запускаете новый процесс сборки, вам следует очистить файл test.txt до 0, чтобы начать новый процесс.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы