2008-09-26 13 views
13

क्या किसी के पास विजुअल स्टूडियो परियोजनाओं और कमांड लाइन से समाधान बनाने के लिए एमएसबिल्ड टूल की 260 वर्ण सीमा को पार करने का कोई तरीका है? मैं क्रूज़ कंट्रोल (क्रूज़ कंट्रोल.नेट) का उपयोग करके स्वचालित रूप से निर्माण का प्रयास करने की कोशिश कर रहा हूं (इसलिए मैं इसे सामान्य चींटी स्क्रिप्ट में बांधने की कोशिश कर रहा हूं) और मैं पथ की लंबाई के साथ समस्याओं में भाग लेता हूं। स्पष्टीकरण के लिए, समस्या समाधान फ़ाइल में संदर्भित परियोजनाओं के पथों की लंबाई में है, क्योंकि उपकरण सही तरीके से पथ को पतन नहीं करता है :(एमएसबिल्ड निर्देशिका संरचना सीमा वर्कअराउंड

मैंने कभी भी DevEnv का उपयोग करने का प्रयास किया है जो कभी-कभी काम करता है और कभी-कभी अपवाद फेंकता है , जो एक अलग मशीन पर स्वचालित निर्माण के लिए अच्छा नहीं है। इसलिए कृपया इसे प्रतिस्थापन के रूप में उपयोग करने का सुझाव न दें।

और इसे शीर्ष पर रखने के लिए, सामान्य आईडीई के माध्यम से विजुअल स्टूडियो का उपयोग करते समय प्रोजेक्ट ठीक बनाता है।

+0

मुझे पता है कि जब बनाम 2008 एक बिल्ड करता है तो यह सीएसनेट के तहत निष्पादित सरल एमएसबिल्ड की तुलना में एमएसबिल्ड लक्ष्यों का एक अलग सेट चलाता है - शायद उत्तर उन लक्ष्यों में से एक है – Richard

उत्तर

7

ऐसा लगता है कि यह एमएसबिल्ड की सीमा है। हमें एक ही समस्या थी, और अंत में, हमें पथ कम करना पड़ा, क्योंकि कोई अन्य समाधान नहीं मिला जो ठीक से काम करता था।

+0

कई दिनों के प्रयासों के बाद, ऐसा लगता है मुझे क्या अनुरोध करना है। शुक्र है कि इन परियोजनाओं के लिए एक नई (बहुत छोटी) पथ संरचना का प्रस्ताव दिया जा रहा है, इसलिए समस्या दूर होनी चाहिए :) – workmad3

+0

नेट फ्रेमवर्क (v1.0-v3.5) के System.IO में यह सीमा है और एमएसबिल्ड का उपयोग कर रहा है नेट। (वर्तमान में इसके आसपास एकमात्र तरीका PInvoke का उपयोग हर जगह के बारे में किया जाता है।) –

+2

क्या कोई यह पुष्टि कर सकता है कि यह msbuild 4.0 में कोई समस्या नहीं है? –

0

उपसर्ग आप डॉस रास्तों? या \\ की कोशिश की है? \? .NET BCL team blog अधिक जानकारी नहीं है।

7

SUBST command अभी भी मौजूद है प्रतीत होता है इसलिए ड्राइव बिल्ड में आपके बिल्ड फ़ोल्डर की जड़ को रीमेप करने से कुछ चरित्र बचा सकते हैं यदि यहूदा हिमांगो का समाधान अच्छा नहीं है।

+0

वे पहले से ही निर्देशिका संरचना की सबसे आम जड़ के लिए SUBST'd जा रहे हैं :(यह काम करेगा यदि पथ नाम इतने लंबे समय तक नहीं थे। – workmad3

+0

हम सिल्वरलाइट टूलकिट बनाने के लिए सबस्ट का उपयोग कर रहे हैं, यह नहीं है सही है, लेकिन यह हैक एक अच्छा पहला कदम है। +1 जेसन –

+0

यह कम से कम अब के लिए MSBuild फ़ाइलपैथ के साथ हमारी समस्याओं को ठीक करने में सक्षम है। – nebffa

2

निर्माण के लिए प्रासंगिक दो प्रकार की लंबी पथ समस्याएं हैं। एक ऐसा पथ है जो वास्तव में बहुत लंबा नहीं है, लेकिन उनमें बहुत सारे ".. \" हैं। आम तौर पर, ये संदर्भ 'हिंटपाथ मान हैं। एमएसबिल्ड को इन पथों को अधिकतम सीमा से नीचे सामान्य करना चाहिए, ताकि वे काम कर सकें।

अन्य प्रकार का पथ बस इतना लंबा है। क्षमा करें, लेकिन ये सिर्फ काम नहीं करेंगे। इसे थोड़ा सा देखने के बाद, समस्या यह है कि लंबे पथ के लिए पर्याप्त एपीआई समर्थन नहीं है। बीसीएल टीम (उनके ब्लॉग देखें) में समान समस्याएं थीं। केवल Win32 एपीआई के कुछ \ \ \ प्रारूप का समर्थन करते हैं। अनियंत्रित निर्माण उपकरण, और शायद वहां 98% ऐप्स हैं, नहीं; और बदतर शायद बुरी तरह व्यवहार करेगा (MAX_PATH के लिए आकार वाले सभी बफरों के बारे में सोचें)।

हम इस निष्कर्ष पर पहुंचे कि जब तक लंबे पथ काम करने के लिए कोई बड़ा पारिस्थितिकी तंत्र प्रयास नहीं होता है, या विंडोज़ उन्हें किसी भी तरह से काम करने के लिए कुछ सरल तरीके से आता है (जैसे छोटे रास्ते उलझन में?) लंबे पथ बस संभव नहीं हैं एमएसबिल्ड के समर्थन के लिए। वर्कअराउंड में पदार्थ शामिल है, जैसा कि आपने पाया; लेकिन यदि आपका पेड़ बस बहुत गहरा है, तो आपके एकमात्र विकल्प इसे टुकड़ों में बनाना या फ़ोल्डर नामों को छोटा करना है। माफ़ कीजिये।

दान/MSBuild

+0

क्या आप किसी समस्या के ".. \" पर विस्तार कर सकते हैं, हमारे पास सापेक्ष फ़ाइल है पथ जो बहुत लंबे नहीं हैं। और यदि पूर्ण पथ में परिवर्तित हो तो भी 200 वर्णों से कम हैं, लेकिन वे अभी भी csc.exe कॉल में विफल हो जाते हैं। – nietras

1

मैं बस उन्हें के रूप में जोड़कर कि जब सी # संकलक (Csc.exe) कहा जाता है यह उत्पादन पथ OUTPUTPATH ​​साथ मिलकर परियोजनाओं निर्देशिका पथ PROJECTDIRECTORY का उपयोग करता होने की समस्या दिखाई दी:

PROJECTDIRECTORY + OUTPUTPATH ​​

हालांकि, अगर OUTPUTPATH ​​रिश्तेदार यानी कि ".. \ .. \ बिल्ड \ ProjectName \ AnyCPU_Debug_Bin \" और परियोजना निर्देशिका बहुत लंबा है तो कुल लंबाई लंबी है 259 अक्षरों से अधिक के बाद से पथ हो जाएगा:

PROJECTPATH ​​+ ".. \ .. \ बिल्ड \ ProjectName \ AnyCPU_Debug_Bin \"

एक निरपेक्ष पथ के बजाय

यदि Win32 फ़ंक्शन को कॉल करने से पहले csc.exe एक पूर्ण पथ बनायेगा तो यह काम करेगा। चूंकि हमारे मामले में पूर्ण पथ लंबाई 160 वर्णों से कम है।

किसी कारण से दृश्य स्टूडियो से csc.exe को कॉल दृश्य स्टूडियो से एमएसबिल्ड से अलग है। पता नहीं क्यों।

किसी भी मामले में, समस्या को या तो दोनों या दोनों प्रोजेक्ट्रीक्ट्री और/या OUTPUTPATH ​​पथों को बदलकर हल किया जा सकता है। परिणाम संकलन के दौरान Csc.exe बजाय पूर्ण पथ प्राप्त करता सापेक्ष एक के रूप में

<BaseIntermediateOutputPath>$([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)\..\..\..\Intermediate\$(AssemblyName)_$(ProjectGuid)\'))</BaseIntermediateOutputPath> 

:

4

मैं CSPROJ फाइल का समायोजन करके समान समस्या हल हो जाती।

सीएससी.एक्सई पथ के साथ कैसे काम करता है इस पर सुराग के लिए हैरीडेव के लिए धन्यवाद।

0

यदि पथ की लंबाई 260 है, तो इस त्रुटि के 25 9 या 261 के लिए संदर्भ हल करने की चेतावनी चेतावनी है। मुझे लगता है कि एमएसबिल्ड बग है।

0

मुझे पता है कि पहले से ही एक स्वीकार्य उत्तर है, लेकिन msbuild का उपयोग करते समय मुझे एक अलग समस्या थी जिसने मुझे एक ही त्रुटि आउटपुट दिया, और मुझे एक गोलाकार जंगली-हंस चेस पर ले गया। तो, भविष्य Googler के लिए, यहाँ जाता है:

हम एक बैच फ़ाइल कि msbuild कॉल है, लेकिन निर्माण मशीन दृश्य स्टूडियो के कई संस्करण के लिए निर्माण कर सकते हैं के रूप में, प्रत्येक बैच फ़ाइल vcvarsall.bat कॉल करने से पहले इसे msbuild चलाता है। इस पथ को पूरी तरह से एक ही चीज़ से भरने के पथ को भरने का बुरा दुष्प्रभाव है। जब यह भर जाता है, तो आपको ऊपर दिए गए प्रश्न में दिखाई गई त्रुटि मिलती है: The input line is too long. एक साधारण Google खोज आपको यह सोच सकती है कि msbuild के लिए आपके पथ अचानक बहुत लंबे समय तक हैं।

मेरे मामले में, यह cmd.exe के सत्र को मारने और पुनरारंभ करने जितना आसान था, क्योंकि इसने पर्यावरण चर को अपने मूल राज्य में वापस कर दिया।

संबंधित मुद्दे