विजुअल स्टूडियो: मल्टीपल पोस्ट-बिल्ड कमांड?


101

विजुअल स्टूडियो 2008 मुझे एक कमांड की घोषणा करने और एक प्रोजेक्ट के लिए पोस्ट-बिल्ड इवेंट में संलग्न करने देता है। बहुत सारे डेवलपर्स की तरह, मैं इसे नियमित रूप से एप्लिकेशन आउटपुट निर्देशिका में xcopy फ़ाइलों के लिए उपयोग करता हूं।

मैं एक ऐसी परियोजना पर काम कर रहा हूँ जहाँ मुझे एक ही परियोजना के भीतर दो अलग-अलग स्थानों से दो अलग-अलग स्थानों की फ़ाइलों को xcopy करने की आवश्यकता है। दूसरे शब्दों में, मुझे एक ही पोस्ट-बिल्ड इवेंट से दो अलग-अलग xcopy कमांडों को आमंत्रित करने की आवश्यकता है। ऐसा लगता है कि पोस्ट-बिल्ड ईवेंट केवल एक ही आदेश लेगा, और अगर मुझे कई कमांडों को लागू करने की आवश्यकता है, तो मुझे कमांड्स को * .bat फ़ाइल में डालना होगा और पोस्ट-बिल्ड इवेंट से कॉल करना होगा।

क्या यह सही है, या पोस्ट-बिल्ड इवेंट से दो कमांड को आमंत्रित करने का एक सरल तरीका है? आपकी सहायता के लिये पहले से ही धन्यवाद।

जवाबों:


124

आप जितने चाहें उतने पोस्ट बिल्ड कमांड टाइप कर सकते हैं। बस उन्हें अलग करके newlines।

यहाँ मेरी एक परियोजना से एक उदाहरण है।

पोस्ट बिल्ड इवेंट कमांडलाइन


3
यदि आप इसे हमेशा के लिए होस्ट करने का इरादा रखते हैं, तो स्क्रीन-शॉट शामिल करना उपयोगी है।
अमंडलिशस

1
इस मामले में @ OWenJ23 ... या 'इमेजशेक';)
एंथोनी वाल्श

28
अलग-अलग रेखाओं पर होने के बावजूद, मेरी आज्ञाओं को एक साथ चलाया जा रहा है जैसे कि वे एक पंक्ति में हों।
ट्रेवर

6
दुर्भाग्य से, ऐसा लगता है कि कम से कम VS2015 एक त्रुटि की रिपोर्ट नहीं करता है यदि मध्यवर्ती कमांड में से एक विफल रहता है ... यह पोस्ट-बिल्ड चरण के परिणाम के रूप में अंतिम कमांड के परिणाम की रिपोर्ट करता है।
जोहान्स एस।

3
ऐसा लगता है कि यह Visual Studio के अंदर से काम करता है - लेकिन यदि आप TFS बिल्ड मशीन पर MsBuild का उपयोग करते हैं तो यह समर्थित नहीं है। MsBuild लाइन को तोड़ता है और फिर खराब सिंटैक्स के कारण कमांड को विफल करता है।
जेफ बी

107

महत्वपूर्ण: बैच फ़ाइल निष्पादित करते समय, आपको निम्नलिखित कॉल करने के लिए "कॉल" स्टेटमेंट का उपयोग करना होगा। यदि आप "कॉल" का उपयोग नहीं करते हैं, तो निष्पादन .bat में चला जाता है और निम्नलिखित पंक्तियों में वापस नहीं आता है। डॉस प्रॉम्प्ट पर भी।

उदाहरण के लिए:

call MyBatch1.bat
call MyBatch2.bat

3
यह टिप ग्रन्ट और npm कमांड पर लागू होती है क्योंकि वे दोनों बैच फ़ाइलों (grunt.cmd और npm.cmd) के माध्यम से चलते हैं।
मैट वर्ब्लो

16

एक और विकल्प है: आप कमांड को अलग कर सकते हैं &&। उदाहरण के लिए

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

यह बिल्कुल वैसा ही नहीं है जैसा कि नई सुर्खियों के साथ अलग होना: &&यदि पिछली कमांड विफल रही, तो अगला कमेंट नहीं चलेगा।

न्यूलाइन द्वारा अलग करना आसान है, इसलिए आपको इसे पसंद करना चाहिए। हालाँकि मुझे पता है कि कम से कम एक मामला &&उपयोगी है। यह परिदृश्य है, जब आप अलग-अलग मशीनों पर अलग-अलग पोस्ट-बिल्ड चरणों के लिए संपत्ति शीट का उपयोग करते हैं। VS 2008 प्रॉपर्टी शीट में सीधे पोस्टबिल्डस्टेप सेट करने की अनुमति नहीं देता है, लेकिन आप अपने कमांड के साथ एक उपयोगकर्ता मैक्रो जोड़ सकते हैं और इसे मुख्य प्रोजेक्ट सेटिंग्स से कॉल कर सकते हैं। एक मैक्रो सिंगल लाइन है, इसलिए आप &&वहां कई कमांड का उपयोग कर सकते हैं ।


11

प्रत्येक कमांड एक अलग लाइन पर होनी चाहिए। हालांकि मैंने पाया कि अगर उन सभी में से एक कमांड को पूरा करने में कोई त्रुटि है, तो पूरी पोस्ट-बिल्ड विफल हो जाती है और इसलिए आपको डिबग करने के लिए प्रत्येक पोस्ट-बिल्ड कमांड को एक बार आज़माना होगा।


2
"xcopy / f" पूर्ण स्रोत और लक्ष्य फ़ाइल नाम को दिखाएगा, जो कि विफलता से पहले मुद्रित किया जाएगा, जिससे कई कॉपी कमांड की तुलना में कई xcopy कमांड का निदान करना आसान हो जाता है।
योय

9

& / & या के साथ आदेशों को अलग करना; VS2017 में काम नहीं करता है। इस तरह की सरल कार्यक्षमता को प्राप्त नहीं कर सकते हैं VS2017 में उपलब्ध नहीं है। विज़ुअल स्टूडियो पोस्ट बिल्ड ईवेंट विंडो में पूरे पाठ को एक स्ट्रिंग के रूप में निष्पादित करने का प्रयास करता है। मेरे लिए केवल एक विकल्प अब एक बैच स्क्रिप्ट बनाना है जो मुझे विशेष रूप से पसंद नहीं है।


1
VS2017 में && के साथ कमांड को अलग करना मेरे लिए काम करता है। VS2017 संपादक में एक अलग लाइन पर प्रत्येक कमांड को निर्दिष्ट करना मेरे लिए काम नहीं करता है।
कोडनिफ़र

5

वैंप के उत्तर में जोड़ना :

यदि आपके पास एक ही बिल्ड ईवेंट पर कुछ करने के लिए कई प्रॉपर्टी शीट हैं, तो आप कमांड्स को चेन करने के लिए निम्न कार्य कर सकते हैं:

%(Command)
echo foo

जहां %(Command)कमांड के पिछले मूल्य में विस्तार होता है।

व्यक्तिगत रूप से मैं सभी बिल्ड इवेंट्स के लिए ऐसा करता हूं , भले ही मेरे पास वर्तमान में विरासत में मिली कमांड्स न हों, क्योंकि यह सुनिश्चित करता है कि अगर मैं बाद में प्रॉपर्टी शीट जोड़ देता हूं तो कोई समस्या नहीं होगी।


1
यह कस्टम बिल्ड स्टेप के साथ भी काम करता है। इसके अलावा, exitचेन के साथ कहीं भी एक बैच स्टेटमेंट निष्पादित करने से चेन का गर्भपात हो जाता है। वास्तव exit 1में निर्माण के विफल होने का कारण बनता है जबकि exit 0बस कदम को रोक देता है और निर्माण जारी रहता है।
मार्टिन कॉनेल

3

Visual Studio 2017 में आप ऐसा कर सकते हैं:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>

1
मैंने .csproj को संपादित किया और <कमांड> </ कमांड> को मेरे दो पोस्टबिल्ड इवेंट कमांड के आसपास जोड़ा। यह काम नहीं लगता था। जब मैंने बिल्ड इवेंट्स इन विजुअल स्टूडियो को देखा, तो इसमें दो कमांड के आसपास <कमांड> </ कमांड> था, लेकिन एक बिल्ड एरर दिया: कमांड "<कमांड xmlns =" ​​.. "> कमांड 1 कमांड 2 </ कमांड>" कोड 255 के साथ निर्वासित।
जिमी

1

स्पंदन द्वारा सुझाए गए दृष्टिकोण विजुअल स्टूडियो 2015/2017 (विंडोज) में काम करता है, लेकिन मैक (पूर्वावलोकन) के लिए विजुअल स्टूडियो में काम नहीं करता है, जो केवल पहले कमांड को निष्पादित करता है। एकमात्र तरीका जो मुझे विजुअल स्टूडियो के मैक और विंडोज दोनों संस्करणों में काम करते हुए मिला, वह 2 MSBuild कमांड्स का पीछा कर रहा था:

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

उपरोक्त उदाहरण "AfterResolveReferences" घटना का उपयोग करता है, लेकिन जाहिर तौर पर पोस्टबिल्ड इवेंट के लिए भी काम करना चाहिए।


1

इस समस्या का कोई अच्छा समाधान नहीं है। कॉल विचार अन्य स्क्रिप्ट को चलाने का कारण बनता है। मैंने देखा है कि त्रुटि का पता लगाने से काम नहीं चलेगा। FailMe.cmd में Put exit / b 1 ’लगाएं पोस्ट बिल्ड चरणों में उपयोग 'कॉल FailMe.cmd'। नोटिस निर्माण विफल नहीं होता है? मैं VS 2017 का उपयोग कर C # प्रोजेक्ट बना रहा हूं। अब इसे 'FailMe.cmd' के साथ आज़माएँ। बिल्ड अब एक त्रुटि की रिपोर्ट करता है।

तो आप केवल एक स्क्रिप्ट का उपयोग करके बेहतर हो सकते हैं, यदि त्रुटि रिपोर्टिंग महत्वपूर्ण है।


-4

बस अपने बैच स्क्रिप्ट के लिए "कॉल" उपसर्ग। ताकि बैच स्क्रिप्ट से कॉल लौटने के बाद बैच स्क्रिप्ट के नीचे दिए गए कथनों को भी निष्पादित किया जाए।

call Script1.cmd
call Script2.bat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.