Delen via


Geef build-gebeurtenissen op (C#)

Gebruik build-gebeurtenissen om opdrachten op te geven die worden uitgevoerd voordat de build wordt gestart of nadat de build is voltooid.

Een build-gebeurtenis opgeven

  1. Selecteer in Solution Explorerhet project waarvoor u de build-gebeurtenis wilt opgeven.

  2. Klik in het menu Project op {ProjectName}-eigenschappen (of vanuit Solution Explorer, druk op Alt+Enter).

  3. Selecteer Build > Events.

    schermopname met de instellingen voor build-gebeurtenissen.

  4. Geef in de sectie pre-build-evenement de syntaxis van het build-evenement op.

    Notitie

    Gebeurtenissen vóór de build worden niet uitgevoerd als het project up-to-date is en er geen build wordt geactiveerd.

  5. Geef in de sectie post-build-gebeurtenis de syntaxis van de buildgebeurtenis op.

    Notitie

    Voeg een call-instructie toe vóór alle opdrachten na de build die .bat bestanden uitvoeren. Bijvoorbeeld call MyFile.bat of call MyFile.bat call MyFile2.bat. Paden kunnen absoluut zijn of relatief ten opzichte van de uitvoermap.

  6. Geef in de sectie Wanneer de post-build event uitgevoerd moet worden op onder welke voorwaarden de post-build event moet worden uitgevoerd.

De opdrachten voor de build events maken

De opdrachten voor build-gebeurtenissen kunnen elke opdracht bevatten die geldig is bij een opdrachtprompt of in een .bat-bestand. Beschikbare opdrachten worden beschreven in de Windows-opdrachtreferentie. De naam van een batchbestand moet worden voorafgegaan door call om ervoor te zorgen dat alle volgende opdrachten worden uitgevoerd. Het batchbestand zelf wordt uitgevoerd vanuit de uitvoermap, bijvoorbeeld bin/Debug. Als u hetzelfde batchbestand voor alle configuraties nodig hebt, kunt u het in dezelfde map als het projectbestand plaatsen en een relatief pad naar het bestand gebruiken, bijvoorbeeld call ../../prebuild.bat.

U kunt PowerShell scripts uitvoeren door een opdracht zoals PowerShell MyPowerShellScript.ps1in te voeren. Het pad naar het PowerShell-script kan absoluut zijn of kan relatief zijn ten opzichte van de projectmap. U moet ervoor zorgen dat het uitvoeringsbeleid voor PowerShell-scripts op uw besturingssysteem op de juiste wijze is ingesteld om het script uit te voeren. Zie Over uitvoeringsbeleidsregels.

Als u een andere shell wilt gebruiken, zoals bash, gebruikt u over het algemeen dezelfde opdrachtsyntaxis als voor het starten van een shellscript vanaf de Windows-opdrachtprompt. Het gebruik van shells van derden valt buiten het bereik van deze documentatie, maar sites zoals Stack Overflow kunnen nuttig zijn.

In het projectbestand

Wanneer u de vorige stappen uitvoert, wijzigt Visual Studio uw projectbestand door het PreBuild of PostBuild doel toe te voegen en de benodigde MSBuild-code om de stappen uit te voeren die u hebt opgegeven. U kunt het projectbestand openen en de stappen bekijken. Het aanpassen van de stappen in het projectbestand is prima. U ziet de wijzigingen in de sectie Build > Events van de projecteigenschappen nadat u wijzigingen hebt opgeslagen.

<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
  <Exec Command="call prebuild.bat" />
</Target>

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
  <Exec Command="call postbuild.bat" />
</Target>

Het Exec-element verwijst naar de taak MSBuild Exec. Zie Exec-taak voor informatie over welke andere parameters u kunt gebruiken om de uitvoering aan te passen. U kunt bijvoorbeeld WorkingDirectory gebruiken om de map in te stellen waaruit het uitvoerbare bestand wordt uitgevoerd. De standaardmap is de map die het projectbestand bevat.

<Exec Command="call prebuild.bat" WorkingDirectory="$(OutDir)">

U kunt MSBuild-eigenschappen (macro's), zoals OutDir in het vorige voorbeeld, gebruiken zoals later in dit artikel besproken op Macro's.

Fouten en andere uitvoer

De uitvoer van uw build-gebeurtenissen wordt geschreven naar de sectie Build van het Uitvoervenster. Als u het wilt openen, kiest u Weergave>Andere Windows, Uitvoervenster, of drukt u op Ctrl+Alt+O. Kies in de vervolgkeuzelijst naast Uitvoer weergeven van, Build.

Als uw pre-build- of post-buildgebeurtenis niet is voltooid, kunt u de build beëindigen door de gebeurtenisactie af te sluiten met een andere code dan nul (0). Een nul afsluitcode geeft een geslaagde actie aan; elke andere afsluitcode wordt beschouwd als een fout.

Als uw pre-build gebeurtenis mislukt, ziet u mogelijk een fout zoals deze in het venster Foutenlijst:

MSB3073    The command "call c:\source\repos\prebuild.bat" exited with code 1.

Als er onvoldoende informatie is in het venster foutenlijst, kunt u het uitvoervenster gebruiken om de volledige build-uitvoer weer te geven, inclusief uitvoer van batchbestanden.

Tip

Het venster Error List is beperkt tot slechts één regel uitvoer, de eerste regel die u voor het event hebt ingevoerd. Als de foutlijst vensteruitvoer belangrijk voor u is, moet u voorkomen dat u meer dan één regel in de gebeurtenis plaatst. Maak een batchbestand vanaf de Windows-opdrachtprompt of in het besturingssysteem en gebruik vervolgens call mybatchfile.bat voor de gebeurtenis. Neem de opdrachten op in het batchbestand zelf.

Zie Windows-opdrachtenvoor hulp bij de opdrachten die u in batchbestanden kunt gebruiken.

Macros

Algemeen beschikbare 'macro's' (eigenlijk MSBuild-eigenschappen) worden vermeld op msBuild algemene eigenschappen. Voor .NET SDK-projecten (.NET Core of .NET 5 en hoger) worden aanvullende eigenschappen vermeld op MSBuild-eigenschappen voor Microsoft.NET.Sdk.

In uw scripts voor buildgebeurtenissen wilt u mogelijk verwijzen naar de waarden van bepaalde variabelen op projectniveau, zoals de naam van het project of de locatie van de uitvoermap. In eerdere versies van Visual Studio werden deze macro'sgenoemd. Het equivalent van macro's in recente versies van Visual Studio zijn MSBuild-eigenschappen. MSBuild is de build-engine die Visual Studio gebruikt om uw projectbestand te verwerken wanneer er een build wordt uitgevoerd. Een build-gebeurtenis in de IDE resulteert in een MSBuild doel in het projectbestand. U kunt elke MSBuild-eigenschap gebruiken die beschikbaar is in het doel in uw projectbestand (bijvoorbeeld $(OutDir) of $(Configuration)). De MSBuild-eigenschappen die voor u beschikbaar zijn in deze gebeurtenissen, zijn afhankelijk van de bestanden die impliciet of expliciet zijn geïmporteerd in een projectbestand, zoals .props- en .targets-bestanden, en eigenschappen die zijn ingesteld in uw projectbestand, zoals in PropertyGroup elementen. Zorg ervoor dat u de exacte spelling van elke eigenschap gebruikt. Er wordt geen fout gerapporteerd als u een eigenschap verkeerd spelt; In plaats daarvan resulteert een niet-gedefinieerde eigenschap in een lege tekenreeks.

Stel dat u een pre-build gebeurtenis opgeeft, zoals:

schermopname met een voorbeeld van een vooraf gemaakte gebeurtenis.

Deze pre-build gebeurtenis resulteert in de volgende vermelding, genaamd een Target in uw projectbestand.

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="echo Configuration: $(Configuration)&#xD;&#xA;echo DevEnvDir: $(DevEnvDir)&#xD;&#xA;echo OutDir: $(OutDir)&#xD;&#xA;echo ProjectDir: $(ProjectDir)&#xD;&#xA;echo VisualStudioVersion: $(VisualStudioVersion)&#xD;&#xA;echo AssemblySearchPaths: $(AssemblySearchPaths)&#xD;&#xA;echo AssemblyName: $(AssemblyName)&#xD;&#xA;echo BaseIntermediateOutputPath: $(BaseIntermediateOutputPath)&#xD;&#xA;echo CscToolPath: $(CscToolPath)" />
  </Target>

De build-gebeurtenis wordt weergegeven als een doelstelling met de Exec-taak en de door u opgegeven invoer als de Command. Nieuwe regels worden gecodeerd in de XML.

Wanneer u in dit voorbeeld het project bouwt, drukt de pre-build gebeurtenis de waarden van sommige eigenschappen af. In dit voorbeeld produceert $(CscToolPath) geen uitvoer, omdat deze niet is gedefinieerd. Het is een optionele eigenschap die u in uw projectbestand kunt definiëren om het pad naar een aangepast exemplaar van de C#-compiler te geven (bijvoorbeeld als u een andere versie van csc.exeof een experimentele compiler test).

Uitvoer van uw bouwgebeurtenissen wordt geschreven naar de bouwuitvoer, die u kunt vinden in het venster Uitvoer. Open de vervolgkeuzelijst Uitvoer weergeven uit en kies Build.

Build started...
1>------ Build started: Project: ConsoleApp4, Configuration: Debug Any CPU ------
1>You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
1>Configuration: Debug
1>DevEnvDir: C:\Program Files\Microsoft Visual Studio\2022\Preview\Common7\IDE\
1>OutDir: bin\Debug\net6.0\
1>ProjectDir: C:\source\repos\ConsoleApp4\ConsoleApp4\
1>VisualStudioVersion: 17.0
1>ALToolsPath:
1>AssemblySearchPaths: {CandidateAssemblyFiles};{HintPathFromItem};{TargetFrameworkDirectory};{RawFileName}
1>AssemblyName: ConsoleApp4
1>BaseIntermediateOutputPath: obj\
1>CscToolsPath:
1>Skipping analyzers to speed up the build. You can execute 'Build' or 'Rebuild' command to run analyzers.
1>ConsoleApp4 -> C:\source\repos\ConsoleApp4\ConsoleApp4\bin\Debug\net6.0\ConsoleApp4.dll

Notitie

Voor sommige scenario's zijn complexere buildacties vereist dan waar de build-gebeurtenissen geschikt voor zijn. Voor veel veelvoorkomende scenario's voor het genereren van code moet u bijvoorbeeld opschonings- en herbouwbewerkingen afhandelen en mogelijk incrementele build inschakelen voor stappen voor het genereren van code, zodat de stap alleen wordt uitgevoerd als de uitvoer verouderd is met betrekking tot de invoer. MSBuild is ontworpen om al deze scenario's intelligent af te handelen. Overweeg om een aangepast doel te maken dat AfterTargets of BeforeTargets uitvoert tijdens een specifiek punt in het buildproces. Voor verdere controle in geavanceerde scenario's kunt u een aangepaste taakmaken of verschillende manieren bekijken waarop u uw build -aanpast.

Voorbeeld 1

  1. Voer een kopieeropdracht in om de build-uitvoer naar een andere map te kopiëren.

    xcopy "$(TargetDir)*.*" "C:\Drop\$(Configuration)\" /E /Y
    

    De opdracht verwijst naar de MSBuild-eigenschappen TargetDir en Configuration. Let op het gebruik van aanhalingstekens, die nodig zijn om paden met spaties te verwerken.

  2. Sluit de ontwerpfunctie voor eigenschappen af en bouw. De uitvoerbestanden moeten worden gekopieerd naar de doelmap C:\Drop, onder de Configuration submap.

  3. Gebruik in het uitvoervenster de vervolgkeuzelijst om over te schakelen naar build-uitvoer en kijk waar de xcopy opdracht is aangeroepen. Als er een fout optreedt, controleert u of uw gebruikersaccount schrijftoegang heeft tot de locatie.

Voorbeeld 2

  1. Maak een batchbestand met de naam postbuild.bat in de projectmap, met de volgende inhoud:

    echo Copying output file %1 to %1.copy
    copy %1 %1.copy
    

    Zoals u weet, verwijst %1 in een batchbestand naar het eerste argument dat is doorgegeven.

  2. Roep het batchbestand aan in de post-buildgebeurtenis sectie van de projecteigenschappen en geef een argument door met behulp van de eigenschap MSBuild $(TargetPath).

    call postbuild.bat $(TargetPath)
    

    Als u de waarde van een MSBuild-eigenschap (macro) in een batchbestand wilt gebruiken, kunt u deze als argument doorgeven, zoals hier wordt gedemonstreerd.

  3. Bouw je project en controleer de uitvoermap. U zou het gekopieerde bestand naast de gebouwde assembly moeten zien. In het Uitvoervenster, in de sectie Build, zou u de uitvoer van het batchbestand moeten zien:

    1>Output file is C:\source\repos\ConsoleApp-BuildEvents\ConsoleApp-BuildEvents\bin\Debug\net6.0\ConsoleApp-BuildEvents.dll
    1>        1 file(s) copied.
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    ========== Build started at 12:00 PM and took 00.723 seconds ==========