कोड 1 के साथ बाहर निकलें पोस्ट बिल्ड


107

मेरे पास पोस्ट बिल्ड इवेंट वाली एक परियोजना है:

copy $(ProjectDir)DbVerse\Lunaverse.DbVerse.*.exe  $(TargetDir)

यह मेरी मशीन पर हर बार ठीक काम करता है। मेरे पास एक नया डेवलपर है जो हमेशा "कोड 1 के साथ बाहर" त्रुटि प्राप्त करता है। मैंने उसे DOS प्रॉम्प्ट में एक ही कमांड चलाया था, और यह ठीक काम किया। ऐसा किसके कारण हो सकता है? क्या वास्तविक त्रुटि के लिए कोई रास्ता है?

हम दोनों विजुअल स्टूडियो 2008 का उपयोग कर रहे हैं।


मेरे मामले में, टिम स्कॉट इस पृष्ठ के अंत के पास प्रदान करते हैं (इसलिए मैं शुरुआत में अनदेखी करता हूं) मेरी समस्या को हल करता है।
यू यांग जियान

जवाबों:


115

उसके पथ में एक फ़ोल्डर के नाम में एक स्थान था, और उसके आसपास कोई उद्धरण नहीं था।


12
पथ नामों पर उद्धरण देना एक अच्छा अभ्यास है। उन रास्तों में काम नहीं करना जिनमें स्थान सम्‍मिलित है घटना बेहतर है :-)
आशेर

4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" यह कमांड मेरे लिए उल्लेखनीय है और यदि मैं अंत में बाहर निकलें 0 लिख रहा हूँ तो ठीक काम करें। क्या आप मुझे बता सकते हैं क्यों?
रिकिन पटेल

59

"पिंग्स" वाले ने मेरी मदद की ... लेकिन इसे थोड़ा बेहतर बताया जा सकता है ...

मेरे लिए समाधान बदलना था:

copy $(TargetDir)$(TargetName).* $(SolutionDir)bin

इसके लिए:

copy "$(TargetDir)$(TargetName).*" "$(SolutionDir)bin"

आशा है कि यह आप के लिए काम करता है। :-)


47

मैंने इसे भविष्य के आगंतुकों के लिए जोड़ा है क्योंकि यह काफी सक्रिय प्रश्न है।

ROBOCOPY "सफलता कोड" के साथ बाहर निकलता है जो 8 के अंतर्गत आता है। देखें: http://support.microsoft.com/kb/954404

इस का मतलब है कि:

robocopy exit code 0 = no files copied
robocopy exit code 1 = files copied
When the result is 1, this becomes an error exit code in visual studio.

इसलिए मैंने इसे आसानी से बैच फ़ाइल के नीचे जोड़कर हल किया

exit 0

सुझाव है कि इस तरह से ROBOCOPY त्रुटियों को संभालें

rem each robocopy statement and then underneath have the error check.
if %ERRORLEVEL% GEQ 8 goto failed

rem end of batch file
GOTO success

:failed
rem do not pause as it will pause msbuild.
exit 1

:success
exit 0    

जब कोई फ़ाइल कॉपी नहीं की जाती है, तो भ्रम की स्थिति सेट हो जाएगी। VS में कोई त्रुटि नहीं है। फिर जब परिवर्तन होते हैं, तो फाइलें कॉपी हो जाती हैं, वीएस त्रुटियां होती हैं, लेकिन वह सब कुछ जो डेवलपर चाहता था।

अतिरिक्त युक्ति: स्क्रिप्ट में विराम का उपयोग न करें क्योंकि यह वीएस बिल्ड में एक अनिश्चित समय का ठहराव बन जाएगा। स्क्रिप्ट विकसित करते समय, कुछ का उपयोग करें timeout 10। आप इसे नोटिस करेंगे और हैंगिंग बिल्ड के बजाय इसे कमेंट करेंगे।


4
मुझे इसकी ही खोज थी। धन्यवाद!!
रिकी

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

46

कोड 1 का मेरा कारण यह था कि लक्ष्य फ़ोल्डर केवल पढ़ा गया था। आशा है कि यह किसी की मदद करता है! मेरे पास एक निर्देशिका से एक प्रतिलिपि बनाने के लिए पोस्ट बिल्ड इवेंट था और गंतव्य केवल पढ़ा गया था। इसलिए मैं बस गया और निर्देशिका और उसके सभी उपनिर्देशिकाओं पर केवल पढ़ने के लिए अनियंत्रित किया! बस यह सुनिश्चित करें कि इसकी एक निर्देशिका जो ऐसा करने के लिए सुरक्षित है!


मुझे एक घंटा बचाया, धन्यवाद! इंटरनेट से कुछ कोड डाउनलोड किया और विंडोज 7 फ़ोल्डर को केवल-पढ़ने के लिए स्वचालित रूप से सेट करता है।
जोहान पीटरसन

1
मैंने xcopy का उपयोग इसके बजाय / y ध्वज के साथ किया। सभी कमांड microsoft.com/resources/documentation/windows/xp/all/proddocs/…
जोहान पीटरसन


8

मुझे अपना पोस्ट-बिल्ड कॉपी ओएस संरक्षित करने के लिए ".. \ _ कॉमन 7 \ IDE \ PrivateAssemblies" को काम करने के लिए वी.एस.


5

उन है, जो 'का उपयोग के लिए प्रतिलिपि में' कमांड बिल्ड घटनाक्रम ( पूर्व निर्माण घटना कमांड लाइन या / और पोस्ट-निर्माण घटना कमांड लाइन ) से परियोजना -> गुण : यदि आप ' कॉपी ' कमांड पैरामीटर यहां तरह दिखना चाहिए: copy "source of files" "destination for files"। उद्धरण चिह्नों का उपयोग करना याद रखें (पते के तारों में रिक्त स्थान के साथ समस्याओं से बचने के लिए)।


4

मेरे पास एक समान मुद्दा था लेकिन विशेष रूप से जेनकींस के निर्माण के माहौल में। समस्या को ठीक करने के लिए, मैंने पोस्ट बिल्ड ईवेंट में एक कॉपी कमांड का उपयोग करके कॉपी लक्ष्य का उपयोग करने से स्विच किया।

मैंने इसे बदल दिया:

   <PropertyGroup>
      <PostBuildEvent>copy $(ProjectDir)bin\BLAH.Common.xml $(ProjectDir)App_Data\BLAH.Common.xml</PostBuildEvent>
   </PropertyGroup>

इसके लिए:

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(ProjectDir)bin\BLAH.Common.xml" DestinationFolder="$(ProjectDir)App_Data\" />
  </Target>

और यह अब ठीक काम करता है।

मुझे मिलने वाली विशिष्ट त्रुटि थी:

(PostBuildEvent target) -> 
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "copy <http://1.2.3.4/job/BLAHv2/ws/Api/bin/BLAH.Common.xml> <http://1.2.3.4/job/BLAHv2/ws/Api/App_Data/BLAH.Common.xml"> exited with code 1. [<http://1.2.3.4/job/BLAHv2/ws/Api/Api.csproj]>

आपने वह परिवर्तन कैसे किया? क्या आपने इसे मैन्युअल रूप से संपादित किया था? आप लक्ष्य को कैसे निष्पादित करते हैं? ऐसा लगता है कि कुछ आपको msbuild कमांड लाइन में निर्दिष्ट करना होगा। मेरे पास मेरे जेनकिंस वातावरण में ठीक यही मुद्दा है जो अजीब है क्योंकि सभी msbuild बनाए गए फ़ोल्डर हमेशा केवल-पढ़ने के लिए होते हैं। यह मेरी मशीन पर क्यों कॉपी करता है लेकिन सर्वर में नहीं है यह मेरे से परे है।
shawn1874

मैंने csproj फ़ाइल को संपादित करने के लिए सिर्फ नोटपैड ++ का उपयोग किया। "AfterBuild" हुक एक मानक हुक है, इसलिए यदि यह मौजूद है, तो निर्माण प्रक्रिया के बाद इसे स्वचालित रूप से कहा जाता है।
TechSavvySam

धन्यवाद। मुझे यकीन नहीं था कि अगर आपके पास लक्ष्य के साथ एक कस्टम एमएसबिल्ट फ़ाइल थी या यदि यह सिर्फ दृश्य स्टूडियो निर्मित फ़ाइल थी। FYI करें: मेरे मामले में मुझे समझ में आया कि समस्या का निर्माण क्रम से करना था। मैं रिलीज़, समाधान कॉन्फ़िगरेशन में बिल्ड निर्भरता सेट करना भूल गया, इसलिए प्रोजेक्ट सर्वर पर एक अलग क्रम में निर्माण कर रहे थे जैसे कि इनपुट फ़ाइल अभी तक उपलब्ध नहीं थी जब कॉपी निष्पादित हुई थी। यह सुनिश्चित करना कि .dll का निर्माण दूसरे प्रोजेक्ट से पहले किया गया था, जिसे इसकी आवश्यकता थी, उसने इसे मेरे लिए तय किया। यह समाधान कॉन्फ़िगरेशन के साथ एक बहुत ही सूक्ष्म मुद्दा था जो इसका कारण बना।
shawn1874

यह पहली बार में स्पष्ट नहीं था कि प्रत्येक कॉन्फ़िगरेशन के लिए बिल्ड ऑर्डर है। मैंने सोचा था कि एक समाधान सेटिंग का अधिक था, लेकिन जाहिर है आपको सभी कॉन्फ़िगरेशन में बिल्ड ऑर्डर को अपडेट करना होगा।
shawn1874

3

मैं विजुअल स्टूडियो को एडमिन के रूप में चलाकर अपने कोड 1 को ठीक करने में सक्षम था। जाहिरा तौर पर इसमें बिना व्यवस्थापक के शेल कमांड निष्पादित करने की पहुंच नहीं थी।



2

मेरे लिए मुझे यह सुनिश्चित करना था कि जिस प्रोग्राम को मैं फाइल कॉपी कर रहा था वह उस समय नहीं चल रहा था। वाक्य रचना में कोई त्रुटि नहीं थी। आशा है कि यह किसी की मदद करता है।


2

मुझे बस वही त्रुटि मिली। मेरे पास गंतव्य पथ में एक% था जिससे बचने की आवश्यकता थी

c:\projects\%NotAnEnvironmentVariable%

होना चाहिए

c:\projects\%%NotAnEnvironmentVariable%%

2

ठीक है, यह कई समाधानों के साथ एक समस्या है, इसलिए मैं सिर्फ लोगों को अधिक संकेत देने के लिए मेरा पोस्ट करता हूं। मेरी स्थिति यह है कि अपने पथ के फ़ोल्डरों की दोबारा जांच करें और सुनिश्चित करें कि वे सभी आपके मशीन में मौजूद हैं। उदाहरण के लिए: "$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb", लेकिन "बिन" partBin फ़ोल्डर में नहीं है।


1
BTW, के बाद $(SolutionDir)बेमानी है।
डियाब्लो

2

उन लोगों के लिए, जो प्रोजेक्ट से बिल्ड इवेंट्स (प्री-बिल्ड इवेंट कमांड लाइन या / और पोस्ट-बिल्ड इवेंट कमांड लाइन) में 'कॉपी' कमांड का उपयोग करते हैं -> गुण: लक्ष्य फ़ोल्डर मौजूद होना चाहिए


0

इतने सारे उपाय ...

मेरे मामले में, मुझे गैर-यूनिकोड (पश्चिमी, विंडोज) एन्कोडिंग के साथ बैट फाइल को सहेजना था। डिफ़ॉल्ट रूप से जब मैंने फ़ाइल को विज़ुअल स्टूडियो में जोड़ा (और शायद मुझे इसे वीएस के बाहर करना चाहिए था), तो यह यूटीएफ -8 एन्कोडिंग के साथ जोड़ा गया।


0

मेरे पास यही मुद्दा था और यह पता चला कि ऐसा इसलिए था क्योंकि मैंने परियोजना का नाम बदल दिया था। मैं परियोजना के गुणों में चला गया और विधानसभा का नाम और रूट नेमस्पेस बदलकर परियोजना का नाम रख दिया और इसके बाद बहुत अच्छा काम किया!


0

फिर भी एक और जवाब ...

मेरे मामले में मेरे पास एक दृश्य स्टूडियो 2017 परियोजना है जो दोनों .Net मानक 1.3 और .Net फ्रेमवर्क 2.0 को लक्षित कर रही है। यह इस तरह .csproj फ़ाइल में निर्दिष्ट किया गया था:

<TargetFrameworks>netstandard1.3;net20</TargetFrameworks>

मेरे पास इस तरह की पोस्ट-बिल्ड इवेंट कमांड लाइन भी थी:

copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"

दूसरे शब्दों में, मैं .Net फ्रेमवर्क की प्रतिलिपि बनाने की कोशिश कर रहा था। निर्माण के लिए वैकल्पिक स्थान पर निर्मित।

इस त्रुटि के साथ विफल हो रहा था जब मैंने एक पुनर्निर्माण किया:

MSB3073 The command "copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"" exited with code 1.

बहुत हताशा के बाद मैंने अंत में यह निर्धारित किया कि क्या हो रहा था कि पुनर्निर्माण ने सभी आउटपुट फ़ाइलों को हटा दिया, फिर बिल्ड .Net मानक 1.3 किया, फिर पोस्ट-बिल्ड इवेंट कमांड लाइन को चलाने की कोशिश की, जो विफल हो गई क्योंकि फ़ाइल को कॉपी किया जाना था अभी तक नहीं बनाया गया था।

इसलिए समाधान था कि भवन निर्माण के क्रम में बदलाव किया जाए, यानी .Net फ्रेमवर्क 2.0 के लिए निर्माण किया जाए, फिर .Net मानक 1.3 के लिए।

<TargetFrameworks>net20;netstandard1.3</TargetFrameworks>

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


0

मेरे मामले में मुझे cdबैट फाइल को कॉल करने से पहले (निर्देशिका को बदलना) था, क्योंकि बैट फाइल के अंदर एक कॉपी ऑपरेशन था जो सापेक्ष पथ निर्दिष्ट करता था।

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.