Soru MSBuild.exe'nin Build Events'i çalıştırmasını engelleyebilir misiniz?


Bir komut dosyasıyla çok sayıda proje yapıyorum ve zaman zaman özel yapım etkinliklerinin kullanımı, yapı sistemi için büyük zorluklara neden oluyor. Mümkünse, MSBuild.exe dosyasını herhangi bir derleme olayının yürütülmesini engelleyecek şekilde çağırmak isterim. Uzun vadede, bu, inşa otomasyonu için bir sorun değildir - inşa olayları olan projelerin gönderenleri, bu türden mahrumiyetin kurallara aykırı olduğu şeklinde önceden uyarılmışlardır.

Kısacası, varsa, herhangi bir özel yapı adımlarının yürütülmesini engelleyecek MSBuild'i çağırmanın bir yolu var mı?

GÜNCELLEŞTİRME:

Proje dosyalarının yerinde (otomatik) bir düzenlemesini yapmayı düşünürdüm, ancak üç olayın her biri için Evet'e "Yapıdan Çıkarıldı" (bkz. Olayları Yapılandırma seçenekleri) ayarının komut satırı eşdeğerini tercih ederim.


44
2017-11-13 21:02


Menşei




Cevaplar:


Pre / PostBuildEvents özellikleridir, bu nedenle bunları geçersiz kılmak için komut satırından boş dizgiye ayarlayın.

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

82
2017-11-13 23:12



Bu benim için işe yaramıyor, MSBuild v4.0.30319.17929 kullanıyorum - whatsisname
Msbuild foo.sln / p kullanarak: PreBuildEvent = "" / p: PostBuildEvent = "" benim için çalıştı (MSBuild v4.0.30319). - Neil
Benim için de çalışmadı (C ++ projesi), ancak AndreiM ve dtopham75 tarafından yayınlanan çözüm (/ p: PostBuildEventUseInBuild = false) iyi çalıştı. - Michaël


Ayrıca, mülkün koşullu hale getirilmesini de sağlayabilirsiniz.

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

12
2017-10-19 17:06





Yapacağım şey yeni bir .proj dosyası tanımlamak, C: \ Data \ SupressBuildEvents.proj diyelim ve içerir:

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

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

Sonra, bu dosyaların Microsoft.Common.targets sonra alındığını belirtin ve bu dosyanın yoluna iyi bilinen özelliği CustomAfterMicrosoftCommonTargets tanımlayarak bunu yaparsınız. Bu yüzden derleme komut dosyanızın MyBuild.proj adlı bir dosyada olmasını sağlarsınız:

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

Bu, Microsoft.Common.targets dosyası alındıktan sonra PostBuildEvent ve PreBuildEvent hedeflerini geçersiz kılacak ve hiçbir şey yapmamasını sağlayacağından MSBuild'in dosyanızı almasına neden olur.

Şimdi MyBuild.proj dosyalarınız kullanıyorsa MSBuild görevi Başka hedefler oluşturmak için bunları şu şekilde de aktarmalısınız:

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

Bu, ana komuttaki tasarım özelliklerine göre MSBuild görevi tarafından yürütülen yapılara geçirilmediği için gereklidir.


10
2017-11-14 04:54





Cevap, proje tipine bağlı olarak farklı görünmektedir.

C / C ++ projeleri için (.vcxproj), komut satırında PostBuildEvent'i engelleyebilir /p:PostBuildEventUseInBuild=falseAndreiM'in de belirttiği gibi.

(Ayar /p:PostBuildEvent boş bir dizeye C ++ projeleri için çalışmıyor ve post-build komutunu geçersiz kılacak başka bir yol bulamıyorum).

C # projeleri için (.csproj), sen kutu komut satırında PostBuildEvent'i bastır /p:PostBuildEvent=Diğer çoğu yanıt verenlerin önerdiği gibi.


8
2018-04-21 10:32





MSBuild görevinizdeki özellikleri de ayarlayabilirsiniz:

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

4
2018-04-22 10:07





Ben de biraz oynadım msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent=ama benim için işe yaramadı, muhtemelen özel sahne dosyaları kullanıyorum.

Ne işe yarıyordum ama /p:PostBuildEventUseInBuild=false


3
2018-02-05 09:58





Microsoft.Common.targets'ı aldığınızda varsayılan olarak

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

Sanırım belki de onu değiştirebilirsin

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

Bu öncesi / sonrası oluşturma olaylarını kapatmak için. (.Proj dosyanıza içe aktarmadan önce veya sonra koymanız gerekiyorsa ya da Microsoft.Common.targets gibi bir etkiye sahip olmanız gerekirse değiştirmeniz gerekmediğinden emin olun. Şu anda deneme yapmak için zamanınız yok ...)


0
2017-11-13 21:11



Yapmak istediğin bu değil. BeforeBuild ve AfterBuild, yapım öncesi ve sonrası olaylarla ilgili değildir. - Sayed Ibrahim Hashimi


Bazı C # projelerinde, Visual Studio derlemesinde PostBuildEvent çalışmalarına gereksinim vardır, ancak MSBuild ve TFS oluşturma işlemlerinde çalışmaz. Bu amaçla VS'de PostBuildEvent öğesini ekliyorum. Aşağıdaki kodu .csproj olarak ayarlar:

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

bundan sonra aşağıdaki kodları .csproj'a ekliyorum:

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

Bu kod, PostBuildEvent öğesini boş olarak ayarlar ve yalnızca MSBuild ve TFSBuild BeforeBuild hedefinde oluşur. Bu basit, kalıcı, paramizleri ayarlamak ve iyi çalışıyor.


0
2017-08-01 04:42