Dela via


Ange bygghändelser (C#)

Använd bygghändelser för att ange kommandon som körs innan bygget startar eller när bygget har slutförts.

Ange en bygghändelse

  1. I Solution Explorerväljer du det projekt som du vill ange bygghändelsen för.

  2. På menyn Project klickar du på Egenskaper.

  3. Välj fliken Skapa händelser.

  4. På kommandoraden Förskapa händelse anger du syntaxen för bygghändelsen.

    Not

    Förbyggnadshändelser körs inte om projektet är uppdaterat och ingen kompilering startas.

  5. Ange syntaxen för bygghändelsen på kommandoraden efter kompileringshändelsen.

    Not

    Lägg till en call-instruktion före alla kommandon efter bygget som kör .bat filer. Till exempel call MyFile.bat eller call MyFile.bat call MyFile2.bat. Sökvägar kan vara absoluta eller relativa till utdatafoldern.

  6. I rutan Kör händelsen efter bygget anger du under vilka villkor som händelsen efter bygget ska köras.

    Not

    För att lägga till en mer omfattande syntax eller för att välja några byggmakron från dialogrutan för kommandoraden Förskapa händelse/efter bygghändelse, klickar du på ellipsknappen (...) för att visa en redigeringsruta.

  1. I Solution Explorerväljer du det projekt som du vill ange bygghändelsen för.

  2. I menyn Project klicka på Egenskaper för {ProjectName} (eller, från Solution Explorer, tryck på Alt+Retur).

  3. Välj Skapa >-händelser.

    Skärmbild som visar inställningarna för Bygghändelser.

  4. I avsnittet Pre-build event anger du syntaxen för bygghändelsen.

    Not

    Förbyggnadshändelser körs inte om projektet är uppdaterat och ingen kompilering startas.

  5. I avsnittet Efter build-händelse anger du syntaxen för bygghändelsen.

    Not

    Lägg till en call-instruktion före alla kommandon efter bygget som kör .bat filer. Till exempel call MyFile.bat eller call MyFile.bat call MyFile2.bat. Sökvägar kan vara absoluta eller i förhållande till projektmappen.

  6. I avsnittet När efterbyggnadshändelsen ska köras, specificerar du under vilka förhållanden efterbyggnadshändelsen ska köras.

Skapa händelsekommandona för build

Kommandona för bygghändelsen kan innehålla alla kommandon som är giltiga i en kommandoprompt eller i en .bat-fil. I Windows-kommandoreferensendokumenteras tillgängliga kommandon. Namnet på en batchfil bör föregås av call för att säkerställa att alla efterföljande kommandon körs. Själva batchfilen körs från utdatamappen, till exempel bin/Debug. Om du behöver samma batchfil för alla konfigurationer kan du placera den i samma mapp som projektfilen och använda en relativ sökväg till den, till exempel call ../../prebuild.bat.

Du kan köra PowerShell- skript genom att ange ett kommando som PowerShell MyPowerShellScript.ps1. Sökvägen till PowerShell-skriptet kan vara absolut eller vara relativ till projektkatalogen. Du måste se till att körningsprincipen för PowerShell-skript i operativsystemet är korrekt inställd för att kunna köra skriptet. Se Om körningsprinciper.

Om du vill använda ett annat gränssnitt, till exempel bash, använder du vanligtvis samma kommandosyntax som du skulle använda för att starta ett gränssnittsskript från Windows-kommandotolken. Användning av gränssnitt från tredje part ligger utanför omfånget för den här dokumentationen, men webbplatser som Stack Overflow kan vara till hjälp.

I projektfilen

När du utför föregående steg ändrar Visual Studio projektfilen genom att lägga till PreBuild eller PostBuild mål och nödvändig MSBuild-kod för att köra de steg du angav. Du kan öppna projektfilen och se stegen. Det går bra att ändra stegen i projektfilen. Ändringarna visas i avsnittet Build > Events i projektegenskaperna när du har sparat ändringarna.

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

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

Elementet Exec refererar till UPPGIFTEN MSBuild Exec. Mer information om vilka andra parametrar du kan använda för att anpassa körningen finns i Exec-uppgift. Du kan till exempel använda WorkingDirectory för att ange mappen som den körbara filen ska köras från. Standardvärdet är den katalog som innehåller projektfilen.

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

Du kan använda MSBuild-egenskaper (makron), till exempel OutDir i föregående exempel, enligt beskrivningen senare i den här artikeln Makron.

Fel och andra utdata

Utdata från bygghändelserna skrivs till avsnittet Build i -utdatafönstret. Öppna den genom att välja View>Other Windows, Output Windoweller tryck på Ctrl+Alt+O. I listrutan bredvid Visa utdata frånväljer du Skapa.

Om din för- eller efterversionshändelse inte slutförs framgångsrikt kan du avsluta kompileringen genom att låta händelseåtgärden avslutas med en annan kod än noll (0). En nollavslutskod anger en lyckad åtgärd. någon annan slutkod anses vara ett fel.

Om din förekompileringsevent misslyckas kan du se ett fel som det här i fönstret Fellista:

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

Om det inte finns tillräckligt med information i fönstret fellista kan du prova att använda utdatafönster för att visa fullständiga byggutdata, inklusive utdata från batchfiler.

Tips

Fönstret fellista är begränsat till bara en rad med utdata, den första raden som du angav för händelsen. Om fellista fönsterutdata är viktigt för dig bör du undvika att placera fler än en rad i händelsen. Skapa en batchfil från Windows-kommandotolken eller i operativsystemet och använd sedan bara call mybatchfile.bat för händelsen. Inkludera kommandona i själva batchfilen.

Mer information om vilka kommandon du kan använda i batchfiler finns i Windows-kommandon.

Makron

Vanliga "makron" (i själva verket MSBuild-egenskaper) listas under vanliga egenskaper för MSBuild. För .NET SDK-projekt (.NET Core eller .NET 5 och senare) visas ytterligare egenskaper i MSBuild-egenskaper för Microsoft.NET.Sdk.

I skripten för bygghändelser kanske du vill referera till värdena för vissa variabler på projektnivå, till exempel namnet på projektet eller platsen för utdatamappen. I tidigare versioner av Visual Studio kallades dessa makron. Motsvarigheten till makron i de senaste versionerna av Visual Studio är MSBuild-egenskaper. MSBuild är den byggmotor som Visual Studio använder för att bearbeta projektfilen när den utför en version. Ett bygghändelse i IDE resulterar i ett MSBuild-mål i projektfilen. Du kan använda valfri MSBuild-egenskap som är tillgänglig i målet i projektfilen (till exempel $(OutDir) eller $(Configuration)). De MSBuild-egenskaper som är tillgängliga för dig i dessa händelser beror på de filer som implicit eller explicit importeras i en projektfil, till exempel .props och .targets filer och egenskaper som anges i projektfilen, till exempel i PropertyGroup element. Var noga med att använda den exakta stavningen för varje egenskap. Inget fel rapporteras om du felstavar en egenskap. I stället utvärderas en odefinierad egenskap till en tom sträng.

Anta till exempel att du anger en förberedelseträff enligt följande:

Skärmbild som visar exempel på förskapade händelser.

Händelsen före bygget resulterar i följande post, som kallas för en Target i projektfilen:

  <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>

Bygghändelsen visas som ett mål som innehåller Exec-uppgiften med de indata som du angav som Command. Newlines kodas i XML-koden.

När du skapar projektet i det här exemplet skriver händelsen pre-build ut värdena för vissa egenskaper. I det här exemplet skapar $(CscToolPath) inga utdata eftersom det inte har definierats. Det är en valfri egenskap som du kan definiera i projektfilen för att ge sökvägen till en anpassad instans av C#-kompilatorn (till exempel om du testade en annan version av csc.exeeller en experimentell kompilator).

Utdata från bygghändelser skrivs till byggutdata, som finns i fönstret Utdata. I listrutan Visa utdata från väljer du Skapa.

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

Not

Vissa scenarier kräver mer komplexa byggåtgärder än vad bygghändelserna kan göra. För många vanliga scenarier för kodgenerering behöver du till exempel hantera operationer för att rensa och bygga om, och du kanske vill aktivera inkrementell byggprocess för kodgenereringsstegen, så att steget bara körs om utdata är inaktuella i förhållande till indata. MSBuild är utformat för att hantera alla dessa scenarier på ett intelligent sätt. Överväg att skapa ett anpassat mål som anger AfterTargets eller BeforeTargets att köras vid en specifik tidpunkt i byggprocessen, och för ytterligare kontroll i avancerade scenarier kan du överväga att skapa en anpassad uppgift, eller granska de olika sätt du kan anpassa din build.

Exempel

  1. Skapa en batchfil med namnet postbuild.bat i projektmappen med följande innehåll:

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

    Kom ihåg att i en batchfil refererar %1 till det första argumentet som skickades in.

  2. Anropa batchfilen i avsnittet Efterbyggnadshändelse i projektegenskaperna och passera ett argument med egenskapen MSBuild $(TargetPath).

    call postbuild.bat $(TargetPath)
    
  3. Skapa projektet och kontrollera utdatamappen. Du bör se den kopierade filen bredvid den byggda sammansättningen. I utdatafönstreti avsnittet Build bör du se batchfilens utdata:

    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 ==========