केवल डीबग बिल्ड के लिए Visual Studio पोस्ट-बिल्ड ईवेंट कैसे चलाएँ


592

मैं केवल एक प्रकार के निर्माण के लिए अपनी पोस्ट-बिल्ड ईवेंट को कैसे सीमित कर सकता हूं?

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

जवाबों:


746

प्री- और पोस्ट-बिल्ड इवेंट एक बैच स्क्रिप्ट के रूप में चलते हैं। आप पर एक सशर्त बयान कर सकते हैं $(ConfigurationName)

उदाहरण के लिए

if $(ConfigurationName) == Debug xcopy something somewhere

7
अजीब है, शायद इसकी सिर्फ मुझे लेकिन मैंने अगर शर्त जोड़ने की कोशिश की, और अब मुझे यह त्रुटि मिलती है - त्रुटि कोड 255 के साथ बाहर निकल गई
माइकल एल

101
मैंने पाया है कि पूरे कमांड को एक लाइन पर होना चाहिए या आपको "कोड 255 के साथ बाहर निकल जाएगा"
रॉबिन मिंटो

7
आप फुलर समाधान के लिए गोटो / लेबल का भी उपयोग कर सकते हैं (मेरे Jul 24 उत्तरदाता देखें)
CestLaGalere

11
और यदि आप कमांड के साथ कोष्ठक का उपयोग कर सकते हैं (उदाहरण के लिए मेरा उत्तर देखें)
gbjbaanb

1
आपको "xcopy / Y" का उपयोग करना चाहिए, ताकि लक्ष्य निर्देशिका में फ़ाइल ओवरराइट हो जाएगी।
मथायस

521

FYI करें, आपको गोटो का उपयोग करने की आवश्यकता नहीं है। शेल IF IF का उपयोग राउंड ब्रैकेट के साथ किया जा सकता है:

if $(ConfigurationName) == Debug (
  copy "$(TargetDir)myapp.dll" "c:\delivery\bin" /y
  copy "$(TargetDir)myapp.dll.config" "c:\delivery\bin" /y
) ELSE (
  echo "why, Microsoft, why".
)

62
मुझे यह भी जोड़ना चाहिए कि शुरुआती कोष्ठक से सावधान रहने के लिए जिसे तुरंत कथन का पालन करने की आवश्यकता है, जैसे कि यह अगली पंक्ति में है एक त्रुटि कोड का उत्पादन किया जाएगा
winea

37
"$(ConfigurationName)"यदि आपको त्रुटि कोड 255
jgauffin

20
ध्यान दें, यदि आप $ (कॉन्फ़िगरेशननाम) के आसपास "" का उपयोग करते हैं, तो आपको शब्द डिबग के आसपास भी उद्धरणों की आवश्यकता है - शेल कमांड IF स्टेटमेंट बहुत ही हैं .. शाब्दिक ... जब स्ट्रिंग तुलना की बात आती है।
gbjbaanb

5
ध्यान दें, 255 से छुटकारा पाने के लिए, मुझे $ "(कॉन्फ़िगरेशननाम) का उपयोग करना था और स्थिति के चारों ओर रिक्त स्थान हटाना होगा, उदाहरण के लिए यदि" $ (कॉन्फ़िगरेशननाम) "==" रिलीज़ "<- आसपास कोई स्थान नहीं है ==
फील्टन

15
दृश्य स्टूडियो 2017 के साथ मेरे मामले $(ConfigurationName)में खाली है (पोस्ट-बिल्ड इवेंट कमांड लाइन)। if "$(Configuration)" == "Debug"मेरे लिए काम किया। BTW, यदि आप अन्य सभी विन्यास में कुछ करना चाहते हैं, का उपयोग करें if NOT "$(Configuration)" == "Debug"
राल्फ हुनदेवत

125

अपनी पोस्ट बिल्ड ईवेंट को सामान्य की तरह जोड़ें। फिर अपनी परियोजना को बचाएं, इसे नोटपैड (या अपने पसंदीदा संपादक) में खोलें , और PostBuildEvent संपत्ति समूह में शर्त जोड़ें। यहाँ एक उदाहरण है:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>

5
यह काम करता है, लेकिन यह आपको प्रोजेक्ट फ़ाइल स्रोत में घटनाओं के लिए अपने सभी डिज़ाइन कार्य करने के लिए मजबूर करता है। अन्य सशर्त बिल्ड इवेंट घोषणाएँ IDE से भी छुपी हुई हैं।
जोसेफ Daigle

3
मुझे कहना होगा कि यह मेरे लिए बेहतर जवाब है, पसंदीदा तरीका अभी काम नहीं किया है।
माइकल एल

8
आपको इसे नोटपैड में खोलने की आवश्यकता नहीं है, आप विज़ुअल स्टूडियो में रह सकते हैं। आप प्रोजेक्ट-फाइल को राइट-क्लिक कर सकते हैं, "अनलोड प्रोजेक्ट" पर क्लिक करें, फिर राइट-क्लिक करें और "एडिट" पर क्लिक करें। अब आप सिंटैक्स रंग के साथ {{csproj}} फ़ाइल को संपादित कर सकते हैं। राइट क्लिक करें, लेकिन अब पुनः लोड करने के लिए "पुनः लोड परियोजना" पर क्लिक करें।
हाबिल

1
जब मैंने इसे आज़माया, तब इस दृष्टिकोण ने पोस्टबायिलवेंवेंट कमांड में मैक्रोज़ का विस्तार नहीं किया। cd "$(ProjectDir)"का विस्तार किया cd ""
२५:४६ में डैरिल

3
वीएस 2017 में आप इसके साथ भी कर सकते हैं <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>। मैक्रो चर और सब कुछ सामान्य के रूप में काम करते हैं।
एससी

106

वैकल्पिक रूप से (चूंकि घटनाओं को एक बैच फ़ाइल में डाल दिया जाता है और फिर बुलाया जाता है), निम्नलिखित का उपयोग करें (बिल्ड ईवेंट बॉक्स में, बैच फ़ाइल में नहीं):

if $(ConfigurationName) == Debug goto :debug

:release
signtool.exe ....
xcopy ...

goto :exit

:debug
' Debug items in here

:exit

इस तरह से आप किसी भी विन्यास के लिए ईवेंट हो सकते हैं, और अभी भी बजाय उन्हें एक बैच फ़ाइल में पारित करने के लिए की तुलना में मैक्रो साथ प्रबंधित करें, कि याद %1है $(OutputPath), आदि


6
यदि आपको रिफ्लेक्टर में अपने कुछ कोड को देखने का मौका मिलता है, तो कंपाइलर बहुत सारे स्विच / केस स्टेटमेंट को गोटो में बदल देता है।
स्टिंगजैक

10
अधिकांश सभी कंपाइलर कोड को सरल निर्देशों में अनुवाद करते हैं, जैसे कि गोटो। और रिवर्स इंजीनियरिंग सरल निर्देशों को "अच्छा" और अधिक जटिल निर्देशों में नहीं डाल सकता है जो आप देखेंगे। मैं यह नहीं देखता कि Microsoft हमें गोटो का उपयोग करने के लिए कैसे प्रेरित कर रहा है, या यह इस पोस्ट के लिए कैसे प्रासंगिक है।
तमसुजयर्स

1
@StingyJack: यदि आप संकलित कोड को देखते हैं, तो आप देखेंगे कि यह सब JMP निर्देशों में बदल गया है :) मुझे परवाह नहीं है कि कंपाइलर कवर के तहत क्या करता है, जब तक मुझे अच्छी तरह से पठनीय कोड लिखने के लिए नहीं मिलता है। (ऐसा नहीं है कि गोटो का उपयोग करना कभी-कभी पढ़ने में बहुत आसान नहीं होता है)
gbjbaanb

अगर मैं अपने पोस्ट-बिल्ड कमांड को एक बैच के अंदर रखता हूं तो मुझे यह त्रुटि संदेश मिलता है जब प्रेस बिल्ड:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
सेबस्टियन

4
यदि आप चाहें, तो आप हटा सकते हैं ifऔर उपयोग कर सकते हैंgoto :$(ConfigurationName)
Calimero100582

15

विजुअल स्टूडियो 2015: सही सिंटैक्स है (इसे एक पंक्ति पर रखें):

if "$(ConfigurationName)"=="My Debug CFG" ( xcopy "$(TargetDir)test1.tmp" "$(TargetDir)test.xml" /y) else ( xcopy "$(TargetDir)test2.tmp" "$(TargetDir)test.xml" /y)

यहां कोई त्रुटि नहीं 255।


3
इसे एक पंक्ति पर रखें
एरिक बोले-फ़ेयसोट

अच्छा काम कर रहा है। Tks
Vinicius Gonçalves

1
आपकी सशर्त तकनीक ने मेरे लिए सबसे अच्छा काम किया। हालाँकि, इसने बिना किसी शर्त के और भी बेहतर काम किया और यह अधिक संक्षिप्त है। कॉपी "$ (ProjectDir) \ .. \ $ (कॉन्फ़िगरेशननाम) \ MyFileName" "$ (TargetDir)"
shawn1874

1
आपकी स्क्रिप्ट सही है, लेकिन मेरी स्क्रिप्ट विभिन्न कॉन्फ़िगरेशन के लिए अलग-अलग फ़ाइलों को कॉपी करने की अनुमति देती है।
एरिक बोले-फ़्यसोट

8

विजुअल स्टूडियो 2019 के अनुसार, आधुनिक .csprojप्रारूप सीधे Targetतत्व पर एक शर्त जोड़ने का समर्थन करता है:

<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
    <Exec Command="nswag run nswag.json" />
</Target>

UI इसे सेट अप करने का एक तरीका प्रदान नहीं करता है, लेकिन Configurationयदि आप UI के माध्यम से परिवर्तन करते हैं तो यह विशेषता को सुरक्षित रूप से छोड़ने के लिए प्रकट होता है ।


इसने मेरे लिए वीएस 2019 में काम किया, धन्यवाद!
BrandoTheBrave

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

4

आप कॉन्फ़िगरेशन नाम को पोस्ट-बिल्ड स्क्रिप्ट में पास कर सकते हैं और इसे वहां देख सकते हैं कि यह चलना चाहिए या नहीं।

कॉन्फ़िगरेशन नाम के साथ पास करें $(ConfigurationName)

यह जाँचना इस बात पर आधारित है कि आप पोस्ट-बिल्ड चरण को कैसे लागू कर रहे हैं - यह एक कमांड-लाइन तर्क होगा।


-1

यह मेरे लिए Visual Studio 2015 में काम करता है।

मैं सभी DLL फ़ाइलों को लाइब्रेरी फ़ोल्डर में स्थित एक फ़ोल्डर से उसी स्तर पर कॉपी करता हूं, जिस तरह से मेरा सोल्यूशन फोल्डर प्रोजेक्ट के लक्ष्य-निर्धारण में बनाया जा रहा है।

मेरी परियोजना निर्देशिका से एक रिश्तेदार पथ का उपयोग करना और फ़ोल्डर संरचना के साथ दो चरणों में जाना .. \ _ \ lib

MySolutionFolder
.... MyProject
Lib

if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")

-2

किसी भी प्रोजेक्ट सेटिंग की तरह, बिल्डविंट्स को प्रति कॉन्फ़िगरेशन कॉन्फ़िगर किया जा सकता है। बस उस कॉन्फ़िगरेशन का चयन करें जिसे आप प्रॉपर्टी पेज डायलॉग के ड्रॉपडाउन में बदलना चाहते हैं और पोस्ट बिल्ड चरण को संपादित करें।


10
आईडीई में निर्मित होने पर बिल्ड इवेंट किसी भी कॉन्फ़िगरेशन के लिए विशिष्ट नहीं होते हैं।
जोसेफ डेगल

1
VS2015 में भी काम नहीं करता है। प्रति विन्यास विन्यास नहीं है।
विल्म

2
यह केवल Visual Studio में C ++ प्रोजेक्ट्स पर लागू होता है, C #
bytecode77

-3

विज़ुअल स्टूडियो 2012 में आपको उपयोग करना होगा (मुझे लगता है कि विज़ुअल स्टूडियो 2010 में भी)

if $(Configuration) == Debug xcopy

$(ConfigurationName) को मैक्रो के रूप में सूचीबद्ध किया गया था, लेकिन इसे असाइन नहीं किया गया था।

यहां छवि विवरण दर्ज करें

तुलना करें: बिल्ड कमांड और गुण के लिए मैक्रोज़


7
आप कॉन्फ़िगरेशन नाम का उपयोग करना चाहते हैं। यह छवि है ... वास्तव में सभी कलंक के साथ समझना मुश्किल है।
चुपके रब्बी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.