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

Я ищу способ запускать определенный 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 только один раз.


person Rand Random    schedule 10.02.2021    source источник
comment
Я думаю, вы хотите, чтобы цель была выполнена один раз, а затем, когда вы построите ее во второй раз, она не будет выполнена, верно?   -  person Mr Qian    schedule 11.02.2021
comment
@ PerryQian-MSFT - например, у меня есть решение, содержащее 3 проекта, я нажимаю Build Solution, который строит все 3 проекта, он должен выполняться только один раз, если я нажимаю Build Project B, но внутренний процесс сборки решает из-за ссылок, которые ему нужны для сборки проекта До Project B я все еще хотел бы запускать его только один раз, поэтому в основном то, что когда-либо решает сделать msbuild, когда я нажимаю какое-либо действие сборки, мое желание состояло бы в том, чтобы запускать материал только один раз, когда он выполняется со всем   -  person Rand Random    schedule 11.02.2021
comment
Но он должен запуститься еще раз, если начнется новый процесс сборки.   -  person Rand Random    schedule 11.02.2021
comment
@ PerryQian-MSFT - на случай, если вас это интересует или вам нужно знать, зачем мне это нужно, здесь вы найдете подробное объяснение - github.com/NuGet/Home/issues/10560   -  person Rand Random    schedule 11.02.2021
comment
мой ответ поможет вам справиться с проблемой?   -  person Mr Qian    schedule 17.02.2021
comment
@ PerryQian-MSFT - к сожалению, нет, потому что он срабатывает уже при второй сборке проекта, а не в самом конце, например. представьте себе решение с 50 проектами, и вы нажмете решение для перестройки, я бы хотел, чтобы мои материалы запускались один раз в самом конце, когда все было построено, но ваш ответ, кажется, выполняется уже после сборки второго проекта, да, он выполняет только один раз, но желаемое время выключено   -  person Rand Random    schedule 17.02.2021
comment
@ PerryQian-MSFT - после очередной поисковой охоты в Google это кажется дубликатом того, что я хочу - stackoverflow.com/questions/17709873/ / / stackoverflow.com/questions/2295454/   -  person Rand Random    schedule 17.02.2021
comment
Вы имеете в виду, что когда первый выполняет цель, второй не должен ее выполнять, верно? Я обнаружил, что решение по перестройке - это параллельная сборка. И они одновременно выполняют сборку.   -  person Mr Qian    schedule 22.02.2021
comment
Если мое предположение верно, вы можете попробовать отключить параллельную сборку. введите _1 _-- ›_ 2 _--› _ 3 _-- ›установите Maximum number of parallel project builds на 1.   -  person Mr Qian    schedule 22.02.2021


Ответы (1)


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

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

person Mr Qian    schedule 11.02.2021
comment
When you start a new build process, you should clear the test.txt file to 0 to make a new start. - означает ли это, что мне нужно вручную изменить текстовый файл? поэтому, прежде чем нажимать Build Soltuion в Visual Studio, мне нужно было бы каждый раз менять его на 0? - person Rand Random; 11.02.2021
comment
да. Если вы хотите сделать это проще, автоматически, вы можете использовать командный файл, чтобы очистить это. - person Mr Qian; 11.02.2021
comment
Просто случайная мысль, может быть, есть макрос, который знает, сколько проектов будет построено? если да, то, возможно, я мог бы написать строку для каждой сборки, а затем проверить, совпадает ли количество строк с макросом, выполнить свои действия и сбросить файл?!? - person Rand Random; 11.02.2021
comment
... Я не знал, есть ли какие-либо свойства msbuild, чтобы это понять. Предпосылка моего подхода заключается в том, что мне нужен гибкий, реалистичный, управляемый идентификатор. Если этот макрос MSBuild действительно существует, я должен изменить его, хотя я не знал, какое влияние он оказывает на сборку, а вторая сборка сбросит его до значений по умолчанию, фактически для всех свойств msbuild. И измененное значение должно быть восстановлено в каком-то фактическом файле, который не контролируется msbuild, а затем прочитать его из этого файла. Весь процесс не будет контролироваться msbuild, поэтому лучше использовать текстовый файл. - person Mr Qian; 11.02.2021
comment
А такого типа макроса я не знал. И если это так, вам также следует изменить это значение с помощью моей функции, и я не уверен, насколько это повлияет на сборку. Кроме того, если вы не используете дополнительный файл, то как сохранить значение, которое не контролируется каждой сборкой, является вопросом, если не использовать файл, это может усложнить задачу, этот макрос будет сбрасываться каждый раз при сборке и когда вы используйте msbuild для чтения этого значения, оно уже установлено по умолчанию. Так что использование лишнего файла не вызовет такой головоломки. Сделайте файл bat, чтобы это очистить. Вся функция может принести меньше, хотя она не идеальна. - person Mr Qian; 11.02.2021