Pytanie Czy można zapobiec uruchamianiu programu MSBuild.exe Build Events?


Buduję szereg projektów za pomocą skryptu, a okazjonalne korzystanie z niestandardowych zdarzeń kompilacji powoduje duże trudności w systemie kompilacji. Jeśli jest to możliwe, chciałbym wywołać MSBuild.exe w taki sposób, aby zablokować wykonanie wszelkich zdarzeń kompilacji. Na dłuższą metę nie stanowi to problemu dla automatyzacji budowania - dostawcy projektów zawierających zdarzenia budowania są uprzedzeni, że takie snafuery są niezgodne z zasadami.

Krótko mówiąc, czy istnieje sposób wywołania MSBuild, który uniemożliwi wykonanie dowolnych niestandardowych kroków kompilacji, jeśli są obecne?

AKTUALIZACJA:

Zastanawiałam się nad automatyczną edycją plików projektu, ale wolałabym ekwiwalent wiersza polecenia ustawienia "Wyłączony z kompilacji" (patrz opcje Tworzenie zdarzeń) na Tak dla każdego z trzech zdarzeń.


44
2017-11-13 21:02


pochodzenie




Odpowiedzi:


Pre / PostBuildEvents są właściwościami, więc aby je przesłonić, po prostu ustaw je z wiersza poleceń na pusty ciąg.

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

82
2017-11-13 23:12



To nie wydaje się działać dla mnie, używam MSBuild v4.0.30319.17929 - whatsisname
Używanie msbuild foo.sln / p: PreBuildEvent = "" / p: PostBuildEvent = "" pracował dla mnie (MSBuild v4.0.30319). - Neil
To też nie działało dla mnie (projekt C ++), ale rozwiązanie (/ p: PostBuildEventUseInBuild = false) zamieszczone poniżej przez AndreiM i dtopham75 działało dobrze. - Michaël


Możesz także uzależnić usługę od właściwości

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

12
2017-10-19 17:06





Chciałbym zdefiniować nowy plik .proj, powiedzmy C: \ Data \ SupressBuildEvents.proj i zawierałoby:

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

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

Następnie musisz określić, że te pliki zostaną zaimportowane po Microsoft.Common.targets i możesz to zrobić, definiując dobrze znaną właściwość CustomAfterMicrosoftCommonTargets na ścieżce tego pliku. Więc pozwól, aby skrypt budowy był w pliku o nazwie MyBuild.proj, który wywołasz jako:

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

Spowoduje to, że MSBuild zaimportuje twój plik po zaimportowaniu pliku Microsoft.Common.targets, który zastąpi cele PostBuildEvent i PreBuildEvent i sprawi, że nie zrobią nic.

Teraz, jeśli twoje pliki MyBuild.proj używają Zadanie MSBuild aby zbudować inne cele, powinieneś także przekazać im tę właściwość w następujący sposób:

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

Jest to konieczne, ponieważ właściwości projektu skryptu nadrzędnego nie są przekazywane do kompilacji wykonywanych przez zadanie MSBuild.


10
2017-11-14 04:54





Wydaje się, że odpowiedź jest różna w zależności od rodzaju projektu.

Dla projektów C / C ++ (.vcxproj), możesz wyłączyć PostBuildEvent w wierszu poleceń przy pomocy /p:PostBuildEventUseInBuild=false, jak sugeruje AndreiM.

(Oprawa /p:PostBuildEvent do pustego łańcucha nie działa w przypadku projektów C ++ i nie mogę znaleźć innego sposobu na zastąpienie polecenia następującego po instalacji).

Dla projektów C # (.csproj), ty mogą pomiń PostBuildEvent w wierszu poleceń przy pomocy /p:PostBuildEvent=, jak sugeruje większość innych respondentów.


8
2018-04-21 10:32





Możesz także ustawić właściwości w swoim zadaniu MSBuild:

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

4
2018-04-22 10:07





Ja też trochę grałem msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent=, ale dla mnie to nie zadziałało, prawdopodobnie dlatego, że używam niestandardowych plików rekwizytów.

Okazało się jednak, że działa /p:PostBuildEventUseInBuild=false


3
2018-02-05 09:58





Domyślnie, gdy importujesz Microsoft.Common.targets, które otrzymujesz

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

Myślę, że możesz po prostu go zastąpić

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

wyłączyć te wstępne / następujące po wydaniu kompilacji. (Nie masz pewności, czy musisz umieścić to w pliku .proj przed lub po imporcie, czy też musisz zmodyfikować Microsoft.Common.targets, aby uzyskać taki efekt.) Nie masz czasu na eksperymentowanie już teraz ...)


0
2017-11-13 21:11



To nie jest to, co chcesz robić. Obiekty BeforeBuild i AfterBuild nie są powiązane ze zdarzeniami przed i po kompilacji. - Sayed Ibrahim Hashimi


W niektórych projektach C # potrzebuję PostBuildEvent działa w Visual Studio kompilacji, ale nie działa w kompilacji MSBuild i TFS. W tym celu dodaję PostBuildEvent w VS. Ustawia poniżej kod w .csproj:

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

potem dodaję poniżej kody do .csproj:

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

Ten kod ustawia PostBuildEvent na pusty i występuje tylko w obiekcie docelowym MSBuild i TFSBuild BeforeBuild. Jest prosty, trwały, nie wymaga ustawiania parametrów i działa dobrze.


0
2017-08-01 04:42





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

Dodanie tego warunku do celu dla PreBuild w pliku csproj projektu jest jedynym rozwiązaniem, które zadziałało dla mnie. Wpadłem na ten problem, próbując zautomatyzować kompilację w VSTS, w której chciałem pominąć zdarzenie PreBuild zdefiniowane w pliku csproj projektu. Korzystanie z Visual Studio 2017, projektu .NET Core 2.0.

Wypróbowałem wymienione tutaj sugestie wiersza poleceń msbuild, ale żaden z nich nie działał dla mnie.


0
2018-01-10 23:19