2009-11-05 14 views
22

से .NET में संदर्भों के लिए CopyLocal (निजी) सेटिंग को ओवरराइड कैसे कर सकता हूं, मैं कुछ दिनों के लिए इसके साथ कुश्ती कर रहा हूं और कई खोजों के बाद मुझे वह रास्ता नहीं मिल रहा है जिस पर मुझे होना चाहिए।मैं MSBUILD

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

विशेष रूप से मैं ऑप्टिमाइज़ेशन बंद और पूर्ण डीबग जानकारी/पीडीबी उत्पन्न के साथ हमारी रिलीज कॉन्फ़िगरेशन बनाना चाहता हूं। इसके अलावा, हमारे वर्तमान में अल्ट्रा-लम्बा निर्माण समय को कम करने के लिए, मैं प्रत्येक परियोजना के प्रत्येक संदर्भ के लिए "स्थानीय प्रतिलिपि" (या वास्तविक proj फ़ाइल xml में निजी) चाहता हूं।

पहली चीजें काफी आसान थीं, मैं एक परियोजना स्तर की संपत्ति को काफी आसानी से ओवरराइड कर सकता हूं (आप इसे एमएसबिल्ड कमांड लाइन से/पी का उपयोग करके भी कर सकते हैं), लेकिन मुझे यह नहीं पता कि संपत्ति को ओवरराइड करना है एक संदर्भ पर। मैंने स्टैक ओवरफ्लो और वेब पर कई चीजों को आजमाया है, लेकिन अभी तक कोई समाधान नहीं है।

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

अगर वहाँ एक तरह से, जैसा कि आपने, स्तर गुण पेश कर सकती हैं पुनर्लेखन/बिल्ड लक्ष्य सामान ओवरराइड करने के लिए बिना संदर्भ के स्तर का गुण ओवरराइड करने के लिए सबसे अच्छा संभव था बात हो सकता है - लेकिन मैं यह दर्शाता है यह संभव है कोई जानकारी नहीं मिल गया है ।

इस पर किसी भी मदद के लिए अग्रिम धन्यवाद।

पीएस वास्तव में सभी परियोजनाओं के माध्यम से जाना और उन्हें बदलना मेरे लिए संभव नहीं है; मुझे ऐसे समाधान की आवश्यकता है जो मौजूदा कोड को जगह में छोड़ दे।

<Target Name="BeforeBuild"> 
    <ItemGroup> 
     <ReferenceNew Include="@(Reference)"> 
      <Private>False</Private> 
     </ReferenceNew> 
     <Reference Remove="@(Reference)"/> 
     <Reference Include="@(ReferenceNew)"/> 
    </ItemGroup> 
</Target> 

इस मेटाडाटा 'निजी' गलत पर सेट है, जो यह सुनिश्चित करेंगे कि संदर्भ नहीं करता है 'के लिए @ (संदर्भ) पुनः सूची जाएगा:

+0

सेट CopyLocal = false तैनाती के समय के दौरान विभिन्न मुद्दों पैदा कर सकता है। मेरी ब्लॉग पोस्ट "डॉट नॉट चेंज" कॉपी करें स्थानीय "परियोजना संदर्भों को झूठी, संदर्भों को समझने तक।" (Http://geekswithblogs.net/mnf/archive/2012/12/09/do-not-change-copy-local -प्रोजेक्ट-संदर्भ-से-झूठी-जब तक .aspx) –

+0

आपके प्रश्न का उत्तर नहीं देता है लेकिन उम्मीद है कि एमएस इसे मूल रूप से ठीक कर सकता है: https://visualstudio.uservoice.com/forums/121579-visual-studio-2015/suggestions/ 13280400-सुधार-दृश्य-स्टूडियो-बिल्ड-प्रदर्शन-बड़े – Mark

उत्तर

29

इस प्रयास करें:

सेल्सियस तक CustomAfterMicrosoftCommonTargets सेट करें: \ foo \ फिल्टर।लक्षित करता (या जो भी आप फ़ाइल को नाम) और होने के लिए filter.targets है:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemDefinitionGroup> 
     <Reference> 
     <Private>False</Private> 
     </Reference> 
    </ItemDefinitionGroup> 
</Project> 
+4

यह महान काम किया है, और मैं साधारण ऐड करने में सक्षम था इस तरह एक और नोड: झूठी अपने प्रोजेक्ट संदर्भों पर समान व्यवहार प्राप्त करने के लिए (करने के लिए सिर्फ फ़ाइल refs विपरीत) । –

+4

केवल ध्यान देने योग्य बात यह है कि यह '' के लिए डिफ़ॉल्ट सेट करता है। यदि यह किसी भी व्यक्ति '' पर सेट है, तो वह मान यहां निर्दिष्ट एक को ओवरराइड करेगा। –

+1

क्या सेटिंग को ओवरराइड करने का कोई तरीका है, अगर यह .csproj में कॉन्फ़िगर किया गया है? –

7

filter.targets की तरह एक फ़ाइल में कोई लक्ष्य जोड़ने टी कॉपी नहीं किया। फिर इस फ़िल्टर.targets फ़ाइल के पथ पर सेट $ (CustomAfterMicrosoftCommonTargets) संपत्ति के साथ अपना समाधान या प्रोजेक्ट चलाएं।

msbuild foo.sln /p:CustomAfterMicrosoftCommonTargets=c:\foo\filter.targets 

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

संपादित करें: पहलेबिल्ड लक्ष्य में मेटाडेटा सेट करने का एक बेहतर तरीका हो सकता है।

+0

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

+0

उन्हें बदलने से पहले और बाद में संदर्भों को प्रिंट करने का प्रयास करें, इससे पहले कि बिल्ड करें खुद को लक्षित करें। इस तरह प्रिंट करें: "रेफरी:% (रे ference.Identity):% (संदर्भ। निजी) " – radical

+0

मैं अंततः संदर्भों के लिए काम करने के लिए इस विधि को प्राप्त करने में सक्षम था (फ़िल्टर फ़िल्टर में मुझे कुछ और गलत था), लेकिन मुझे लगता है कि उपरोक्त सईद का समाधान क्लीनर है। –