2009-03-02 14 views
46

मुझे आश्चर्य है कि संदर्भ के लिए copy-local=true सेट करने के लिए कोई हेरिस्टिक है या नहीं?कॉपी-लोकल को कब सही किया जाना चाहिए और यह कब नहीं होना चाहिए?

संदर्भित प्रकार केवल आंतरिक रूप से उपयोग किया जाता है कर सकते हैं मैं true को copy-local सेट लेकिन संदर्भित प्रकार पैरामीटर के रूप में सामने आ रहा या मूल्यों मैं false को copy-local की स्थापना की और संकेत मिलता है कि निर्भरता के विशिष्ट संस्करण को जब मेरे पुस्तकालय होना चाहिए संदर्भित किया जाना चाहिए लौट रहे हैं उपयोग किया गया?

क्या कोई इसे मेरे लिए स्पष्ट कर सकता है?

उत्तर

2

यह विकल्प केवल निर्माण चरण को प्रभावित करता है। यह सिर्फ निर्मित असेंबली की स्थानीय निर्देशिका के संदर्भ की प्रतिलिपि बनाता है।

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

+3

यह उससे थोड़ा अधिक करता है। यह तैनाती परिदृश्य को भारी प्रभावित करता है। – JaredPar

+0

मुझे विश्वास है कि यह केवल एक साधारण फ़ाइल प्रति प्रक्रिया को छोड़कर निर्माण को प्रभावित नहीं करता है। अगर यह सच नहीं है तो कृपया मुझे सही करें। –

+0

@ मेहर्रड, यह निर्माण परिदृश्यों को प्रभावित करेगा, लेकिन यह कम से कम समान रूप से तैनाती के उद्देश्य से भी है। – JaredPar

41

तैनाती परिदृश्य और उपकरणों के लिए स्थानीय कॉपी महत्वपूर्ण है। एक सामान्य नियम के रूप में आपको CopyLocal = True का उपयोग करना चाहिए यदि संदर्भ जीएसी के भीतर निहित नहीं है।

कॉपी स्थानीय अनिवार्य रूप से इसका मतलब है कि मुझे अपने आवेदन के लिए मैन्युअल रूप से इस डीएलएल को तैनात करना होगा। जब यह गलत होता है तो इसका अर्थ यह है कि "मैं किसी अन्य घटक पर निर्भर करता हूं जिसे अलग से स्थापित किया जाना चाहिए या जंजीर होना चाहिए, डीएलएल पहले से ही वहां होगा"।

+1

मेरे पास एक उपयोगिता लाइब्रेरी MyUtils के मामले में कैसे है जो आंतरिक रूप से LibX (gac में नहीं) का उपयोग करता है और किसी भी LibX विशिष्ट प्रकार का खुलासा नहीं करता है। वहां मैं कॉपी-लोकल को सच में सेट कर दूंगा। अगर मैं MyUtils से लिबक्स प्रकार का पर्दाफाश करता हूं तो मुझे रेफरी करना होगा। प्रोजेक्टए से लिबक्स भी है जो MyUtils no का उपयोग करता है? – Fadeproof

+0

क्या मुझे उस मामले में कॉपी-लोकल को गलत पर सेट करना चाहिए क्योंकि मुझे प्रोजेक्ट ए से लिबक्स के साथ-साथ माईयूटल्स को रिफ्रेश करना होगा? – Fadeproof

10

यह वास्तव में लक्षित वातावरण के बारे में है। यदि स्थानीय प्रतिलिपि गलत है, तो आप कह रहे हैं कि असेंबली पहले से ही लक्षित वातावरण (आमतौर पर जीएसी में) में मौजूद होगी। इसे सत्य पर सेट करना सुनिश्चित करता है कि यह आपके निर्माण के आउटपुट में दिखाई देगा, इसलिए लक्षित वातावरण पर तैनाती करना आसान हो जाता है।

6

निम्न एमएसडीएन संदर्भ देखें जो प्रतिलिपि व्यवहार को विस्तार से बताता है।

Project References

दुर्भाग्य से वहाँ कुछ quirks कर रहे हैं और CopyLocal जिन्हें आप नीचे देख संरचित माध्यमिक विधानसभाओं में विधानसभा संदर्भ के लिए अपेक्षा के अनुरूप नहीं आवश्यक काम करेंगे।

  • MainApp.exe
    • MyLibrary.dll
      • ThirdPartyLibrary.dll (GAC CopyLocal में अगर MainApp बिन फ़ोल्डर में कॉपी नहीं करेंगे)

यदि आप pl नहीं करते हैं तो यह xcopy तैनाती को मुश्किल बनाता है लक्ष्य मशीन पर जीएसी में तीसरे पक्ष की असेंबली स्थापित करने पर।

11

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

कॉपीलोकल विशेष रूप से दर्द होता है जब बड़े स्रोत पेड़ों का निर्माण होता है।यहां पर CopyLocal को अक्षम करने के तरीके के बारे में एक संबंधित प्रश्न था, आप इसे How do I override CopyLocal (Private) setting for references in .NET from MSBUILD पर देख सकते हैं। साथ ही Best practices for large solutions in Visual Studio (2008).

मैंने लेख MSBuild: Best Practices For Creating Reliable Builds, Part 2 लेख में बड़े स्रोत पेड़ों के निर्माण से निपटने के तरीके के बारे में लिखा है।

तो संक्षेप में मैं कहूंगा कि कॉपी कॉपी करने पर फ़ाइल कॉपी करने से आपके अधिक समय लगने लगते हैं तो आप हर निर्माण के लिए खर्च करने के इच्छुक हैं।

+3

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

+0

@ माइकलफ्रेजिम: क्या आपको अपने प्रश्न का उत्तर मिला? – davenewza

0

सेट कॉपीलोकल = झूठी बिल्ड समय में सुधार करेगा, लेकिन तैनाती के समय के दौरान विभिन्न मुद्दों का कारण बन सकता है।

CopyLocal = false सेटिंग के साथ मेरा अनुभव सफल नहीं था। मेरे ब्लॉग पोस्ट "Do NOT Change "Copy Local” project references to false, unless understand subsequences" में समर्थक और विपक्ष का सारांश देखें।

0

CopyLocal false सेट करने के लिए कंज़र्वेटिव तरीका यह जांचना है कि संदर्भ परियोजना के आउटपुट पथ में मिलता है। आईओ की मात्रा को कम करने के दौरान, आपको कुछ बुरा रनटाइम मुद्दों को चकमा देने की अनुमति देनी चाहिए।

प्रक्रिया में मैंने CopyLocalFixer बनाया, जिसे आप किसी फ़ोल्डर के लिए चला सकते हैं। मैंने इसे एक बड़े निर्माण के साथ करने की कोशिश की, लेकिन परिणाम ईमानदार होने के लिए प्रभावशाली नहीं थे। मुझे लगता है कि यह परियोजना की फ़ोल्डर संरचना के लिए नीचे आता है।

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