सवाल क्या आप बिल्ड इवेंट चलाने से MSBuild.exe को रोक सकते हैं?


मैं एक स्क्रिप्ट के माध्यम से कई परियोजनाओं का निर्माण कर रहा हूं, और कस्टम बिल्ड इवेंट्स के कभी-कभी उपयोग से निर्माण प्रणाली के लिए बड़ी कठिनाई होती है। यदि यह संभव है, तो मैं किसी भी निर्माण घटनाओं के निष्पादन को अवरुद्ध करने के लिए MSBuild.exe को आमंत्रित करना चाहता हूं। लंबे समय तक, यह निर्माण स्वचालन के लिए कोई मुद्दा नहीं है - निर्माण कार्यक्रमों के साथ परियोजनाओं के जमाकर्ताओं को आगाह किया जाता है कि इस तरह के स्नैफरी नियमों के खिलाफ है।

संक्षेप में, क्या MSBuild को कॉल करने का कोई तरीका है जो मौजूद होने पर किसी भी कस्टम बिल्ड चरणों के निष्पादन को रोक देगा?

अद्यतन करें:

मैं प्रोजेक्ट फ़ाइलों के इन-प्लेस (स्वचालित) संपादन को करने पर विचार करता हूं, लेकिन तीनों घटनाओं में से प्रत्येक के लिए "बिल्ड से अलग" सेटिंग (बिल्ड इवेंट बिल्ड विकल्प) को सेट करने के लिए कमांड-लाइन समकक्ष पसंद करेंगे।


44
2017-11-13 21:02


मूल




जवाब:


Pre / PostBuildEvents गुण हैं, इसलिए उन्हें ओवरराइड करने के लिए बस उन्हें कमांड लाइन से खाली स्ट्रिंग पर सेट करें।

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

82
2017-11-13 23:12



यह मेरे लिए काम नहीं करता है, मैं MSBuild v4.0.30319.17929 का उपयोग कर रहा हूं - whatsisname
Msbuild foo.sln / p का प्रयोग करना: PreBuildEvent = "" / p: PostBuildEvent = "" मेरे लिए काम किया (MSBuild v4.0.30319)। - Neil
यह मेरे लिए या तो (सी ++ प्रोजेक्ट) काम नहीं करता है, लेकिन समाधान (/ p: PostBuildEventUseInBuild = false) नीचे एंड्रॉइड और dtopham75 द्वारा पोस्ट किया गया ठीक काम करता है। - Michaël


आप संपत्ति को सशर्त भी बना सकते हैं

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

12
2017-10-19 17:06





मैं क्या करूँगा एक नई .proj फ़ाइल को परिभाषित करें, कहें सी: \ डेटा \ SupressBuildEvents.proj और इसमें शामिल होगा:

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

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

फिर आपको यह निर्दिष्ट करने की आवश्यकता है कि इन फ़ाइलों को Microsoft.Common.targets के बाद आयात किया जाता है और आप उस फ़ाइल के पथ पर जाने-माने संपत्ति CustomAfterMicrosoftCommonTargets को परिभाषित करके ऐसा करेंगे। तो आपकी बिल्ड स्क्रिप्ट MyBuild.proj नाम की फ़ाइल में है, आप इसे इस प्रकार कहते हैं:

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

यह MSBuild को Microsoft के बाद आपकी फ़ाइल आयात करने का कारण बन जाएगा। कॉमन। लक्ष्य फ़ाइल आयात हो जाती है और यह PostBuildEvent और PreBuildEvent लक्ष्यों को ओवरराइड कर देगी और उन्हें कुछ भी नहीं करेगी।

अब अगर आपकी MyBuild.proj फ़ाइलें उपयोग करती हैं एमएसबिल्ड कार्य अन्य लक्ष्यों को बनाने के लिए आपको उन्हें इस संपत्ति को निम्नानुसार पास करना चाहिए:

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

यह आवश्यक है क्योंकि मूल लिपि पर डिज़ाइन गुणों द्वारा MSBuild कार्य द्वारा निष्पादित बिल्डों को पास नहीं किया जाता है।


10
2017-11-14 04:54





ऐसा लगता है कि परियोजना प्रकार के आधार पर जवाब अलग है।

सी / सी ++ परियोजनाओं के लिए (.vcxproj), आप कमांड लाइन पर PostBuildEvent को दबा सकते हैं /p:PostBuildEventUseInBuild=false, जैसा कि आंद्रेमीएम सुझाव देता है।

(सेटिंग /p:PostBuildEvent एक खाली स्ट्रिंग के लिए सी ++ परियोजनाओं के लिए काम नहीं करता है, और मुझे पोस्ट-बिल्ड कमांड को ओवरराइड करने का कोई अन्य तरीका नहीं मिल रहा है)।

सी # परियोजनाओं के लिए (.csproj), आप कर सकते हैं कमांड लाइन पर PostBuildEvent दबाएं /p:PostBuildEvent=, जैसा कि अधिकांश अन्य उत्तरदाताओं का सुझाव है।


8
2018-04-21 10:32





आप अपने एमएसबिल्ड-टास्क के भीतर गुण भी सेट कर सकते हैं:

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

4
2018-04-22 10:07





मैंने थोड़ा सा खेला msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent=, लेकिन मेरे लिए यह काम नहीं किया, शायद इसलिए क्योंकि मैं कस्टम प्रोप फ़ाइलों का उपयोग कर रहा हूं।

हालांकि मुझे जो काम मिला वह था /p:PostBuildEventUseInBuild=false


3
2018-02-05 09:58





डिफ़ॉल्ट रूप से जब आप Microsoft.Common.targets को आयात करते हैं

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

मुझे लगता है कि आप इसे बस इसके साथ बदल सकते हैं

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

इन पूर्व / पोस्ट बिल्ड घटनाओं को बंद करने के लिए। (सुनिश्चित नहीं है कि आपको आयात से पहले या उसके बाद अपनी .proj फ़ाइल में रखना होगा, या यदि आपको ऐसा प्रभाव रखने के लिए Microsoft.Common.targets को संशोधित करने की आवश्यकता है। अभी प्रयोग करने का समय नहीं है ...)


0
2017-11-13 21:11



यह वह नहीं है जो आप करना चाहते हैं। इससे पहले कि बिल्ड और आफ्टरबिल्ड प्री और पोस्ट बिल्ड इवेंट से संबंधित नहीं हैं। - Sayed Ibrahim Hashimi