2010-06-23 13 views
26

क्या मैं विजुअल स्टूडियो में "स्थानीय कॉपी करें" का डिफ़ॉल्ट विकल्प गलत पर सेट कर सकता हूं? ज्यादातर बार, जब मैं किसी प्रोजेक्ट की निर्भरता के रूप में एक डीएल जोड़ता हूं, तो मैं कॉपी स्थानीय संपत्ति को गलत पर सेट करना चाहता हूं। डिफ़ॉल्ट रूप से, यह सच है। क्या विजुअल स्टूडियो के डिफ़ॉल्ट व्यवहार को बदलने का कोई तरीका है? (2008)डिफ़ॉल्ट रूप से "स्थानीय कॉपी करें" को गलत पर सेट करें?

उत्तर

32

नहीं - विजुअल स्टूडियो स्थानीय नियमों को सेट करने के लिए निर्धारित करने के लिए नियमों के आंतरिक सेट का उपयोग करता है।

MSDN से:

  1. संदर्भ एक अन्य परियोजना है, तो एक परियोजना करने वाली परियोजना संदर्भ कहा जाता है, तो मूल्य सच है।
  2. यदि असेंबली वैश्विक असेंबली कैश में पाई जाती है, तो मान झूठा है।
  3. एक विशेष मामले के रूप में, mscorlib.dll संदर्भ के लिए मान झूठा है।
  4. यदि असेंबली फ्रेमवर्क एसडीके फ़ोल्डर में पाया जाता है, तो मान झूठा है।
  5. अन्यथा, मान सत्य है।
23

असल में, आप कर सकते हैं। आप नीचे दिए कुछ की जरूरत है:

  1. .targets फ़ाइल है कि बनाता है copylocal बनाएँ (<Private> टैग, सटीक होना करने के लिए) false by default
  2. .csproj फ़ाइलों में लक्ष्य आयात करें। </Project> टैग बंद करने से पहले, आप इसे अंतिम पंक्ति में जोड़ सकते हैं, यह <Import Project="..\Build\yourtarget.targets" /> जैसा दिखेगा।

अब इस लक्ष्य के साथ प्रत्येक प्रोजेक्ट में डिफ़ॉल्ट रूप से प्रतिलिपि अक्षम है।

दोष यह है कि आपको प्रत्येक सहित प्रत्येक csproj फ़ाइल को संशोधित करने की आवश्यकता है। आप modifying the VS project template द्वारा नए प्रोजेक्ट इश्यू के आसपास काम कर सकते हैं। ब्लॉग आलेख में वर्णित Class.cs के बजाय, आपको Class.vstemplate (उसी ज़िप फ़ाइल में) को संशोधित करने की आवश्यकता है।

उस दृष्टिकोण के साथ, एक और समस्या है - पथ स्वयं। यदि आप नव-जेनरेट की गई सीस्पोज़ फाइलों में हार्डकोडेड सापेक्ष पथ का उपयोग करते हैं, तो वे गलत हो सकते हैं (जब तक आपके पास फ्लैट प्रोजेक्ट संरचना न हो)।

आप कर सकते हैं:

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

इसके लिए बेहतर समाधान होना चाहिए, लेकिन इसे अभी तक नहीं मिला है।

+0

यह सही उत्तर प्रतीत होता है, मैंने मार्गदर्शन और लिंक का पालन किया है और यह काम करता है! –

+0

@ एंथनी मैस्टरियन: क्या आपने नव निर्मित सीस्पोज़ फाइलों में आयात करने के लिए एक चालाक तरीका निकाला है? – ya23

+0

हम एक सामान्य '.csproj' फ़ाइल के साथ खेल रहे हैं जो टेम्पलेट का उपयोग कर हर नई परियोजना में आयात किया जाता है। टेम्पलेट सिस्टम बहुत साफ नहीं है और हमें यकीन नहीं है कि हमें अभी तक यह पसंद है या नहीं। –

5

इस Bumping क्योंकि ऐसा लगता है वहाँ अब एक nuget पैकेज वास्तव में इस की इजाजत दी ...

https://nuget.org/packages/CopyLocalFalse

अभी तक आज़माया नहीं, बस उम्मीद यह मदद करता है।

+0

इस nuget पैकेज के साथ कोई गारंटी नहीं है। इंस्टॉल स्क्रिप्ट में कुछ पूर्वनिर्धारित फ़िल्टरिंग है जो कुछ संदर्भों को छोड़ देगा। इसके अलावा यह केवल nuget पैकेज के इंस्टॉल समय पर ही है। nuget पैकेज पहले ही स्थापित हो सकता है और एक नया संदर्भ जोड़ा गया है। इसके अलावा अगर nuget पैकेज को पुनर्स्थापित किया जाता है तो क्या होगा अन्य पैकेजों को बहाल करने से पहले, कौन से अन्य पैकेज उनके संदर्भित असेंबली के स्थानीय प्रतिलिपि को रीसेट कर सकते हैं? अनुशंसित दृष्टिकोण नहीं। स्थानीय प्रतिलिपि को ओवरराइड करने के लिए लक्ष्य का बेहतर उपयोग करें और अपनी खुद की फाई लें ltering। – vezenkov

3

हम (के रूप में ya23 द्वारा जवाब में सुझाव दिया) एक .targets फ़ाइलों का उपयोग नहीं करते हैं, तो हम सिर्फ एक पाठ संपादक में मैन्युअल .csproj परियोजना फ़ाइल को संपादित और संदर्भ के लिए <Private> तत्व जोड़, इस तरह:

<Reference Include="[...]"> 
    <Private>False</Private> 
    [...] 
</Reference> 

<Private> तत्व का मान "स्थानीय कॉपी करें" संपत्ति के मूल्य से मेल खाता है। उदाहरण के लिए, यदि <Private> गलत पर सेट है, तो "स्थानीय कॉपी करें" भी गलत है ..

0

@herzbube द्वारा पोस्ट किए गए समाधान के संबंध में, यदि आप सभी (या अधिकतर) के लिए "कॉपी स्थानीय" बंद करना चाहते हैं

<ItemDefinitionGroup> 
    <Reference> 
    <Private>False</Private> 
    </Reference> 
</ItemDefinitionGroup> 

यह संदर्भित परियोजनाओं को प्रभावित नहीं करता: अपने .csproj फ़ाइल में संदर्भ, आप आप बस डाल सकते हैं सीधे निम्नलिखित .csproj में प्रत्येक Reference पर व्यक्तिगत रूप से <Private>False</Private> निर्धारित करने की आवश्यकता नहीं है, <ProjectReference> के साथ, लेकिन आप वही काम कर सकते हैं - या तो इसके बजाय या साथ ही - वें ose:

<ItemDefinitionGroup> 
    <ProjectReference> 
    <Private>False</Private> 
    </ProjectReference> 
</ItemDefinitionGroup> 

आप इन दोनों को रखना चाहते हैं, तो आप उन्हें एक ही समूह में विलय कर सकते हैं:

<ItemDefinitionGroup> 
    <Reference> 
    <Private>False</Private> 
    </Reference> 
    <ProjectReference> 
    <Private>False</Private> 
    </ProjectReference> 
</ItemDefinitionGroup> 

सुनिश्चित करें कि आप पहली वास्तविक <Reference ...> या <ProjectReference ...> आप को प्रभावित करना चाहते हैं करने से पहले इन ओवरराइड डाल बनाओ क्योंकि ये ब्लॉक केवल उन संदर्भों पर लागू होंगे जो उनके नीचे दिखाई देते हैं। फिर, वहाँ कुछ कर रहे हैं कि आप वास्तव में स्थानीय रूप से कॉपी किया जा करना चाहते हैं, तो आप सिर्फ उन वापस व्यक्तिगत रूप से (जैसे कि, एक टैग के भीतर ही), इस बार True का उपयोग कर ओवरराइड कर सकते हैं।

अधिक उन्नत मामलों के लिए आप अधिभावी मूल्य आगे पीछे सच और झूठी कई बार के बीच एक ही .csproj फ़ाइल में बदल सकते हैं। एक और उन्नत तकनीक रणनीतिक रूप से इन ब्लॉकों और उपरोक्त अन्य लोगों के नीचे आपके कुछ संदर्भों को रखना होगा, इसलिए बाद वाला प्रभावित नहीं होगा।

यह सब आपके .csproj में एक्सएमएल को बहुत साफ और पढ़ने में आसान बनाना चाहिए। लेकिन वहाँ भी अधिक अच्छी खबर है, इतने पर पढ़ें ...


चयन जो परियोजनाओं <Private>False</Private> चिह्नित किया जाना चाहिए यह आम तौर पर विशिष्ट स्थिति पर निर्भर करेगा का सवाल है, लेकिन वहाँ कुछ मौलिक हर किसी को है कर सकते हैं और शुरुआत करने वालों के लिए करना चाहिए। यह एक कदम इतना बुनियादी, सरल और प्रभावी है और यह इतना विशाल एमएसबिल्ड विश्वसनीयता सुधार 1 प्रदान करता है। और निर्माण समय speedup - और थोड़ा नकारात्मक पक्ष के साथ - यह है कि हर बड़े समाधान डिफ़ॉल्ट (यानी प्रति-परियोजना स्थानीय) का उपयोग करता है सी # उत्पादन स्थानों लगभग हमेशा यह समायोजन करना चाहिए:

किसी भी में और हर दृश्य स्टूडियो समाधान जो <ProjectReference> अंतर-निर्भरता के किसी भी गैर तुच्छ संख्या के साथ कई सी # वर्ग पुस्तकालयों बनाता, और जो एक और अनुप्रयोगों के निर्माण में खत्म (यानी निष्पादनयोग्य):

  1. शीर्ष के पास .csproj प्रत्येक कक्षा पुस्तकालय, ऊपर दिखाए गए ब्लॉक को सम्मिलित करें।
    कारण: किसी भी .dll की किसी भी पुस्तकालय को इकट्ठा करने के लिए इसकी कोई उप-निर्देशिका में संदर्भित करने की आवश्यकता नहीं है, क्योंकि उस स्थान से कोई निष्पादन योग्य कभी नहीं चलाया जाता है। इस तरह की प्रचलित प्रतिलिपि बेकार व्यस्त कार्य है और संभवतः काफी नाटकीय रूप से आपके निर्माण को धीमा कर सकती है।

  2. दूसरी ओर, कर अपने समाधान के अनुप्रयोगों से किसी के लिए .csproj संशोधित नहीं
    कारण: निष्पादन योग्यों को अपनी संबंधित उप-निर्देशिकाओं में आवश्यक सभी निजी-निर्मित पुस्तकालयों की आवश्यकता होती है, लेकिन प्रत्येक ऐप के लिए निर्माण अकेले प्रत्येक निर्भरता को व्यक्तिगत रूप से एकत्र करने के लिए ज़िम्मेदार होना चाहिए, सीधे अपने संबंधित उप-निर्देशिका से, ऐप में उप-निर्देशिका।

यह पूरी तरह से एक वर्ग पुस्तकालय कई अन्य वर्ग पुस्तकालयों को संदर्भित कर सकते के लिए .csproj, लेकिन एक निष्पादन के लिए .csproj आमतौर पर एक और निष्पादन का संदर्भ कभी नहीं क्योंकि काम करता है। इस प्रकार, प्रत्येक स्थानीय रूप से निर्मित लाइब्रेरी के लिए, केवल .dll अपने bin फ़ोल्डर में ही होगा, जबकि प्रत्येक स्थानीय रूप से निर्मित एप्लिकेशन में स्थानीय रूप से निर्मित पुस्तकालयों का पूर्ण सेट होगा।

सुविधाजनक रूप से, आपके समाधान द्वारा निर्मित संदर्भित पुस्तकालयों के लिए कुछ भी नहीं बदलेगा, क्योंकि ये आमतौर पर <ProjectReference> के बजाय <Reference> का उपयोग करते हैं, और हमने पूर्व टैग को बिल्कुल संशोधित नहीं किया है। लेकिन अभी उल्लेख किया गया धारणा ध्यान दें; यदि आपकी कुछ परियोजनाओं का उल्लंघन किया जाता है, तो आपको कुछ समायोजन करने की आवश्यकता हो सकती है।

[1.] विश्वसनीयता सुधार फ़ाइल टकराव से संबंधित हो सकते हैं जो एक निर्भरता ग्राफ में कई अलग-अलग पथों से समान लाइब्रेरी एकत्र करते समय हो सकता है, विशेष रूप से समवर्ती बिल्डों में।