webentwicklung-frage-antwort-db.com.de

Können Sie verhindern, dass MSBuild.exe Build-Ereignisse ausführt?

Ich erstelle eine Reihe von Projekten über ein Skript, und die gelegentliche Verwendung von benutzerdefinierten Erstellungsereignissen bereitet dem Erstellungssystem große Schwierigkeiten. Wenn es möglich ist, möchte ich MSBuild.exe so aufrufen, dass die Ausführung von Build-Ereignissen blockiert wird. Langfristig ist dies kein Problem für die Build-Automatisierung - Projekteinreicher mit Build-Ereignissen werden darauf hingewiesen, dass ein solcher Fehler gegen die Regeln verstößt.

Kurz gesagt, gibt es eine Möglichkeit, MSBuild aufzurufen, die die Ausführung von benutzerdefinierten Erstellungsschritten verhindert, falls vorhanden?

AKTUALISIEREN:

Ich hatte überlegt, die Projektdateien direkt (automatisch) zu bearbeiten, bevorzuge jedoch die Befehlszeileneinstellung "Vom Build ausgeschlossen" (siehe Optionen für Buildereignisse) für jedes der drei Ereignisse auf "Ja".

48

Pre/PostBuildEvents sind Eigenschaften. Um sie zu überschreiben, setzen Sie sie einfach von der Befehlszeile auf eine leere Zeichenfolge.

msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent=
84
radical

Sie können die Eigenschaft auch bedingt machen

<PreBuildEvent Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> ... </PreBuildEvent>
12
Sarin

Was ich tun würde, ist eine neue .proj-Datei zu definieren, sagen wir C:\Data\SupressBuildEvents.proj Und diese würde enthalten:

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
    <Target Name="PostBuildEvent"/>

    <Target Name="PreBuildEvent" />
</Project>

Anschließend müssen Sie angeben, dass diese Dateien nach Microsoft.Common.targets importiert werden sollen. Dazu müssen Sie die bekannte Eigenschaft CustomAfterMicrosoftCommonTargets für den Pfad dieser Datei definieren. Das Build-Skript befindet sich also in einer Datei namens MyBuild.proj, in der Sie es wie folgt aufrufen würden:

msbuild MyBuild.proj /p:CustomAfterMicrosoftCommonTargets="C:\Data\SupressBuildEvents.proj
"

Dies führt dazu, dass MSBuild Ihre Datei importiert, nachdem die Microsoft.Common.targets-Datei importiert wurde, und die PostBuildEvent- und PreBuildEvent-Ziele überschrieben werden.

Wenn Ihre MyBuild.proj-Dateien nun die MSBuild-Task verwenden, um andere Ziele zu erstellen, sollten Sie diese Eigenschaft auch wie folgt übergeben:

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <ProjectsToBuild Include=" FILL THIS IN "/>
    </ItemGroup>

    <Target Name="YourTarget">
        <MSBuild Projects="@(ProjectsToBuild)"
                 Properties="CustomAfterMicrosoftCommonTargets=$(CustomAfterMicrosoftCommonTargets)"/>
    </Target>

</Project>

Dies ist erforderlich, da die Eigenschaften des übergeordneten Skripts nicht an die von der MSBuild-Task ausgeführten Builds übergeben werden.

10

Es scheint, dass die Antwort je nach Projekttyp unterschiedlich ist.

Für C/C++ - Projekte (.vcxproj) können Sie das PostBuildEvent in der Befehlszeile mit /p:PostBuildEventUseInBuild=false unterdrücken, wie AndreiM vorschlägt. 

(Das Festlegen von /p:PostBuildEvent auf einen leeren String funktioniert für C++ - Projekte nicht, und ich kann keine andere Möglichkeit finden, den Postbuild-Befehl zu überschreiben.).

Für C # -Projekte (.csproj), Sie can unterdrücken das PostBuildEvent in der Befehlszeile mit /p:PostBuildEvent=, wie die meisten anderen Responder vorschlagen. 

9
dtopham75

Sie können die Eigenschaften auch innerhalb Ihrer MSBuild-Task festlegen:

<MSBuild 
  Projects="$(MSBuildProjectDirectory)\YourProject.csproj" 
  Properties="Configuration=$(BuildConfiguration);BuildingFromBuildProjXml=true;PreBuildEvent=;PostBuildEvent=" 
  ContinueOnError="false" />
4
derFunk

Ich habe auch ein wenig mit msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent= gespielt, aber für mich hat es nicht funktioniert, wahrscheinlich weil ich benutzerdefinierte Requisiten-Dateien verwende.

Was ich jedoch gefunden habe, war /p:PostBuildEventUseInBuild=false

3
AndreiM
<Target Name="PreBuild" BeforeTargets="PreBuildEvent" 
Condition="'$(VisualStudioDir)' != ''">

Das Hinzufügen dieser Bedingung zum Ziel für PreBuild in der Projektdatei csproj ist die einzige Lösung, die für mich funktioniert hat. Bei diesem Problem habe ich versucht, ein Build innerhalb von VSTS zu automatisieren, bei dem ich das PreBuild-Ereignis überspringen wollte, das in der Projekt-Csproj-Datei definiert ist. Verwenden von Visual Studio 2017, einem .NET Core 2.0-Projekt. 

Ich habe die hier aufgeführten Befehlszeilenvorschläge von msbuild ausprobiert, aber keiner von ihnen hat für mich funktioniert. 

0
Neil Schurrer

In einigen C # -Projekten brauche ich PostBuildEvent-Arbeiten in Visual Studio Build, aber nicht in MSBuild und TFS Build. Zu diesem Zweck füge ich PostBuildEvent in VS hinzu. Es setzt den folgenden Code in .csproj:

  <PropertyGroup>
    <PostBuildEvent>*... my custom post build event ....*</PostBuildEvent>
  </PropertyGroup>

danach füge ich .csproj folgende Codes hinzu: 

  <Target Name="BeforeBuild">
      <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'false' Or '$(BuildingInsideVisualStudio)' != 'true'">
        <PostBuildEvent></PostBuildEvent>
      </PropertyGroup>
  </Target>

Dieser Code setzt PostBuildEvent auf leer und tritt nur in MSBuild und TFSBuild BeforeBuild-Ziel auf. Es ist einfach, permanent, braucht keine Parameter und funktioniert gut.

0
AhmadYo

Beim Importieren von Microsoft.Common.targets erhalten Sie standardmäßig

<PropertyGroup>
    <BuildDependsOn>
        BeforeBuild;
        CoreBuild;
        AfterBuild
    </BuildDependsOn>
</PropertyGroup>

Ich denke, du kannst es vielleicht einfach durch ersetzen

<PropertyGroup>
    <BuildDependsOn>
        CoreBuild
    </BuildDependsOn>
</PropertyGroup>

um diese Pre/Post Build-Ereignisse zu deaktivieren. (Nicht sicher, ob Sie das vor oder nach dem Import in Ihre .proj-Datei einfügen müssen, oder ob Sie Microsoft.Common.targets ändern müssen, um einen solchen Effekt zu erzielen. Zeit zum Experimentieren ...)

0
Brian