Как создать цель MSBuild, которая запускается только один раз, а не один раз, перед целями, которые запускаются один разC#

Место общения программистов C#
Ответить
Anonymous
 Как создать цель MSBuild, которая запускается только один раз, а не один раз, перед целями, которые запускаются один раз

Сообщение Anonymous »

У меня есть инструмент генератора кода, которым я частично владею, и теперь, когда файлы csproj могут перечислять в них несколько целевых платформ и создавать сборки для всех из них, я пытаюсь выяснить, как заставить MSBuild Target выполнять генерацию кода только один раз за запуск сборки, независимо от того, сколько целевых платформ указано в списке, и заставить компиляцию для каждой из целевых платформ ждать завершения генерации кода.

В настоящее время у меня есть условие для определенного значения Целевая платформа. Например, Condition="'netstandard2.0' == '$(TargetFramework)'".

Это позволяет избежать одновременного запуска инструмента генерации кода для каждой целевой платформы и последующего получения ошибок об отказе в доступе, поскольку процессы пытаются создать/обновить одни и те же файлы.

Однако другие целевые платформы сразу же пытаются скомпилировать, не дожидаясь завершения генерации кода, и терпят неудачу. без этого кода.

Я бы хотел, чтобы генерация кода происходила только один раз при каждой сборке проекта, а компиляция для каждой целевой платформы начиналась только после ее завершения.

Его необходимо запускать каждый раз при запуске сборки на случай, если входные данные изменились и генерируется другой код.

Примечание: на данный момент я игнорирую случай, когда #if FrameworkSpecificDefine используется для ввода разного входного кода в генератор кода, так что разные целевые платформы вызывают разные выходные данные генератора кода. На данный момент я считаю, что выходные данные генератора кода одинаковы и действительны для всех целевых платформ.

Обновление: После поиска цели, которая происходит до того, как MSBuild разделяется на специальные сборки TargetFramework, которые я мог бы затем подключить к сборке раньше, я вижу это в подробном выводе сборки в VS:

Код: Выделить всё

1>Target _SetBuildInnerTarget:
1>Target _ComputeTargetFrameworkItems:
1>Target DispatchToInnerBuilds:
1>  Using "MSBuild" task from assembly "Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
1>  Task "MSBuild"
1>    Additional Properties for project "ProjectA.csproj":
1>      TargetFramework=netstandard2.0
1>    Additional Properties for project "ProjectA.csproj":
1>      TargetFramework=net47
Затем я установил свою цель как BeforeTargets="DispatchToInnerBuilds", и она запускается до отдельных сборок, которые специально устанавливают TargetFramework, и, кажется, точно соответствует моим потребностям.

(Добавление в свойство BuildDependsOn, похоже, больше не работает: добавьте задачу msbuild, которая запускается после сборки проекта .NET Core в Visual Studio 2017 RC; я подозреваю, что Microsoft.Common.targets оценивается позже в новом формате csproj, и любые добавления к свойствам, которые вы выполняете в файле проекта, перезаписываются Microsoft.Common.targets.)

Подробнее здесь: https://stackoverflow.com/questions/466 ... ore-target
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»