विजुअल स्टूडियो पोस्ट बिल्ड इवेंट - रिलेटिव डायरेक्टरी लोकेशन पर कॉपी करें


228

एक सफल निर्माण पर, मैं एक ही "आधार" फ़ोल्डर के तहत आउटपुट निर्देशिका की सामग्री को एक अलग स्थान पर कॉपी करना चाहता हूं । यह मूल फ़ोल्डर एक रिश्तेदार हिस्सा है और स्रोत नियंत्रण सेटिंग्स के आधार पर भिन्न हो सकता है।

मैंने अपने लिए उपलब्ध मैक्रो मूल्यों में से कुछ को सूचीबद्ध किया है ...

$ (SolutionDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ build

$ (ProjectDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ संस्करण \ ProjectA \

मैं आउटपुट फ़ोल्डर की सामग्री को निम्न फ़ोल्डर में कॉपी करना चाहता हूं:

D: \ GlobalDir \ Version \ AppName \ Solution2 \ Project \ निर्भरता

आधार स्थान "D: \ GlobalDir \ Version \ AppName" को उपरोक्त मैक्रोज़ में से एक लाने की आवश्यकता है। हालाँकि, कोई भी मैक्रो मान केवल मूल स्थान को सूचीबद्ध नहीं करता है।

पोस्ट बिल्ड कॉपी कमांड के लिए मैं केवल आधार स्थान कैसे निकालूं?

जवाबों:


188

यदि TargetDir या अन्य मैक्रोज़ में से कोई भी सही स्थान पर नहीं है, तो फ़ोल्डर पदानुक्रम को पीछे जाने के लिए ".." निर्देशिका का उपयोग करें।

अर्थात। $(SolutionDir)\..\..अपनी आधार निर्देशिका प्राप्त करने के लिए उपयोग करें ।


सभी मैक्रो की सूची के लिए, यहां देखें:

http://msdn.microsoft.com/en-us/library/c02as0cs.aspx


धन्यवाद!! अच्छी टिप
Merlyn007

293

यहाँ आप परियोजना के पोस्ट-बिल्ड ईवेंट कमांड लाइन में क्या रखना चाहते हैं:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

EDIT: या यदि आपका लक्षित नाम प्रोजेक्ट नाम से भिन्न है।

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"

1
अच्छा सुझाव। मैं उद्धरण भूल गया।
मैट मोंटेग जूल

3
यह मेरे लिए काम नहीं कर रहा था क्योंकि मैं भूल गया था /Y। पूरी कमांड दिखाने के लिए धन्यवाद।
मार्क

10
xcopyस्रोत फ़ोल्डर (ट्री) संरचना को बनाए रखते हुए वाइल्डकार्ड्स और उचित स्विच के साथ एक समान परिणाम प्राप्त करने के लिए उपयोग कर सकते हैं , जैसे:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Dr1Ku

4
मैं स्रोत-भाग में $ (ProjectName) के बजाय $ (TargetName) का उपयोग करने का सुझाव दूंगा।
अलेक्जेंडर श्मिट

2
मेरे मौजूदा को अद्यतन करें। टिप्पणी: copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\"अतिरिक्त बैकस्लैश के बिना, चूंकि $ (सॉल्यूशनडिर) में एक पीछे आने वाला बैकस्लैश (कम से कम VS2012 में)
बर्फीले

40

तुम कोशिश कर सकते हो:

$(SolutionDir)..\..\

8
कृपया ध्यान रखें कि चर $ (सॉल्यूशन) में पहले से ही बैक स्लैश है। स्रोत: "समाधान की निर्देशिका (ड्राइव और पथ के साथ परिभाषित), जिसमें पीछे की ओर '' 'शामिल हैं।" msdn.microsoft.com/en-us/library/42x5kfw4.aspx
हिनहिनाहट

10

मुझे लगता है कि यह संबंधित है, लेकिन मुझे एक समस्या थी जब msbuildवीएस के भीतर से कमांड लाइन (बैच फ़ाइल से) बनाम इमारत का उपयोग करके सीधे निर्माण किया गया था।

निम्नलिखित की तरह कुछ का उपयोग करना:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>

(ध्यान दें: अनुमति जारी करने के लिए इस्तेमाल होने के start XCOPYबजाय, XCOPYजिसने नकल को रोका हो)

मैक्रो $(SolutionDir)ने ..\बैचफाइल से msbuild को निष्पादित करते समय मूल्यांकन किया , जिसके परिणामस्वरूप XCOPYकमांड विफल हो गया। अन्यथा यह ठीक काम किया जब Visual Studio के भीतर से बनाया गया। /verbosity:diagnosticमूल्यांकन किए गए आउटपुट को देखने के लिए उपयोग करने की पुष्टि की गई ।

$(ProjectDir)..\इसके बजाय मैक्रो का उपयोग करना , जो एक ही चीज़ के बराबर है, ठीक काम किया और दोनों बिल्ड परिदृश्यों में पूर्ण पथ को बनाए रखा।


1
क्रॉस-लिंकिंग उसी हैक के मामले में मैं क्रेडिट देना भूल गया ...
drzaus

Startमेरे लिए ( xcopyएक साझा फ़ोल्डर में) के लिए काम किया ।
AgentFire

4

यह सीधे msbuild का उपयोग करने के लिए समझ में नहीं आएगा? यदि आप हर बिल्ड के साथ ऐसा कर रहे हैं, तो आप अंत में एक msbuild कार्य जोड़ सकते हैं? यदि आप केवल यह देखना चाहते हैं कि क्या आपको एक और मैक्रो मान नहीं मिल सकता है जो विज़ुअल स्टूडियो आईडीई पर नहीं दिखाया गया है, तो आप डायग्नोस्टिक के लिए msbuild विकल्पों पर स्विच कर सकते हैं और यह आपको उन सभी चर दिखाएगा जिनका आप उपयोग कर सकते हैं, जैसे कि साथ ही उनके वर्तमान मूल्य।

इसे दृश्य स्टूडियो में स्विच करने के लिए, टूल्स / विकल्प पर जाएं फिर ट्री व्यू को प्रोजेक्ट्स एंड सॉल्यूशंस नामक सेक्शन में स्क्रॉल करें, इसे विस्तृत करें और बिल्ड एंड रन पर क्लिक करें, दाईं ओर एक ड्रॉप डाउन है जो बिल्ड आउटपुट वर्बोसिटी निर्दिष्ट करता है , निदान के लिए सेटिंग, आपको दिखाएगा कि आप अन्य मैक्रो मानों का उपयोग क्या कर सकते हैं।

क्योंकि मैं यह नहीं जानता कि आप किस स्तर तक जाना चाहते हैं, और आप अपने निर्माण को कितना जटिल बनाना चाहते हैं, यह आपको कुछ विचार दे सकता है। मैं हाल ही में स्क्रिप्ट का निर्माण कर रहा हूं, कि निर्माण के हिस्से के रूप में भी SQL कोड निष्पादित करें। अगर आप कुछ और मदद चाहते हैं या कुछ सैंपल बिल्ड स्क्रिप्ट भी दे सकते हैं, तो मुझे बताएं, लेकिन अगर यह सिर्फ एक छोटी सी प्रक्रिया है जिसे आप बिल्ड के अंत में चलाना चाहते हैं, तो संभवत: पूरी msbuild स्क्रिप्ट जा रही है। ।

आशा है कि यह रिहान की मदद करता है


thx रिहान, लेकिन जाहिरा तौर पर VS 2003 इसका समर्थन नहीं करता है! मैं निश्चित रूप से पोस्ट बिल्ड इवेंट
;;

मुझे नहीं पता था कि यह vs2003 था, और इसलिए एक संभावित समाधान के रूप में msbuild का उपयोग करना, अगर मुझे याद है कि vs2003 ms3 युग से पहले था? जवाब देने के लिए धन्यवाद। वीएस 2003 के साथ शुभकामनाएं, मैंने वीएस
200
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.