.Csproj में प्रोजेक्ट शंकु के बाहर की सामग्री फ़ाइलों को शामिल करना


85

"C: \ Projects \ MyProject \" पर स्थित MyProject.csproj का मेरे पास एक C # प्रोजेक्ट है। मेरे पास ऐसी फाइलें भी हैं जिन्हें मैं इस परियोजना के आउटपुट निर्देशिका में कॉपी करना चाहता हूं। लेकिन, फाइलें "C: \ MyContentFiles \" स्थान पर हैं, अर्थात वे परियोजना शंकु के भीतर नहीं हैं। इस निर्देशिका में उप-निर्देशिकाएं भी हैं। निर्देशिका की सामग्री प्रबंधित नहीं है। इसलिए मुझे इसके अंतर्गत सभी को शामिल करना होगा।

जब मैं उन्हें परियोजना में 'सामग्री' के रूप में शामिल करता हूं, तो उनकी नकल की जाती है, लेकिन निर्देशिका संरचना खो जाती है। मैंने कुछ इस तरह किया:

<Content Include="..\..\MyContentFiles\**">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

मैं इन फ़ाइलों / निर्देशिकाओं को प्रोजेक्ट के आउटपुट डायरेक्टरी में पुन: कॉपी करके डायरेक्टरी स्ट्रक्चर के साथ कैसे संरक्षित कर सकता हूँ?

जवाबों:


55

आपको लिंक के रूप में फ़ाइल जोड़ने की आवश्यकता है:

  1. वी.एस. में परियोजना पर राइट क्लिक करें।
  2. जोड़ें -> मौजूदा आइटम ...
  3. फ़ाइल ढूँढें।
  4. इसे चुनें और
  5. एक लिंक के रूप में जोड़ें (संवाद में जोड़ें बटन में नीचे छोड़ें)।
  6. फ़ाइल के गुणों को खोलें और "आउटपुट निर्देशिका में कॉपी करें" को "हमेशा कॉपी करें" पर सेट करें।

लेकिन आप इसे डायरेक्टरी ट्री के लिए नहीं कर सकते।
इसके बजाय आपको उसके लिए पोस्ट-बिल्ड कार्य लिखना होगा। यह एक नमूना है जो आपको घूर जाएगा।


8
जैसा कि इस उत्तर में कहा गया है , "आप इसे डायरेक्ट्री ट्री के लिए नहीं कर सकते।" कथन सत्य नहीं है।
मंदार

160

मेरा मानना ​​है कि @Dmytrii इसे एक तरफ सही करता है - आप "लिंक" सुविधा का उपयोग करना चाहते हैं।

हालाँकि, वह केवल आंशिक रूप से सही है जब आप यह कह सकते हैं कि आप किसी डायरेक्ट्री ट्री से लिंक नहीं कर सकते। हालांकि, यह वास्तव में सच है, जब विजुअल स्टूडियो के GUI का उपयोग करके लिंक जोड़ने की कोशिश कर रहा है, MSBuild इस का समर्थन करता है।

यदि आप निर्देशिका संरचना को संरक्षित करना चाहते हैं, तो केवल %(RecursiveDir)अपने <link>नोड में टैग जोड़ें :

<Content Include="..\..\MyContentFiles\**\*.*">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

पृष्ठ MSBuild प्रसिद्ध आइटम मेटाडेटा मेटाडेटा पर अधिक विवरण में जाता है जिसे आप एक्सेस कर सकते हैं।


1
1) यदि शेयर की गई एसेट्स स्टोर से कोई फाइल डिलीट हो जाए तो क्या होगा? ऐसा नहीं लगता कि यह सॉल्यूशन डीआर 2 से हटा दिया जाएगा) क्या रन-वे के पूरा होने के बाद इन फ़ाइलों को $ (सॉल्यूसिर) से हटाने के लिए विजुअल स्टूडियो प्राप्त करने का कोई तरीका है। उन्हें छोड़कर अन्य देवों को भ्रमित कर सकते हैं।
एडम

@ एडम नीचे मेरा जवाब देखें
रॉबिन वैन डेर कनाव

8
कम भोजन, पानी के साथ जंगल में दुर्घटनाग्रस्त होने और साहचर्य की मजबूत आवश्यकता होने के कारण, मुझे यह उत्तर मददगार लगता है। इन निर्देशों का पालन करके, मैं पूरी तरह कार्यात्मक एआई का निर्माण करने में सक्षम था जिसने अब सभी मानवीय जरूरतों को प्रतिस्थापित कर दिया है जो एक बार मुझे यहां के जंगल में प्रेतवाधित किया था। धन्यवाद मन्दारक!
गहरीकरण

1
@ विज मेरे संपादन को देखें, आपको आवश्यकता है <Content Include="..\..\MyContentFiles\**\*.*">- \*.*पथ के अंत में ध्यान दें ।
सीएडी

2
VS2017 (15.8.6) पर .NET कोर प्रोजेक्ट के लिए काम नहीं कर रहा है।
zwcloud

29

मंदार का उत्तर सामग्री फ़ाइलों को सीधे समाधान में जोड़ता है, और वे समाधान एक्सप्लोरर में दिखाई देंगे। जब भी किसी फ़ाइल को मूल निर्देशिका में जोड़ा या हटाया जाता है, तो यह दृश्य स्टूडियो द्वारा स्वचालित रूप से नहीं उठाया जाता है। इसके अलावा, जब भी कोई फ़ाइल हटा दी जाती है या समाधान एक्सप्लोरर में जोड़ दी जाती है, तो प्रोजेक्ट फ़ाइल को बदल दिया जाता है, और सभी फ़ाइलों को अलग से शामिल किया जाता है, बजाय फ़ोल्डर सहित।

इसे रोकने के लिए, आप एक ही ट्रिक का उपयोग कर सकते हैं, लेकिन इसे एक अलग प्रोजेक्ट फ़ाइल में डालें और फिर इसे आयात करें।

परियोजना की फ़ाइल (उदाहरण के लिए शामिल हैं ।proj) इस तरह दिखता है:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Content Include="..\..\MyContentFiles\**">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

अपनी स्वयं की प्रोजेक्ट फ़ाइल में, निम्न पंक्ति जोड़ें

<Import Project="include.proj" />

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

इस ट्रिक को यहाँ उठाया: http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-use-msbuild.aspx


1
किसी कारण से, यह .proj फ़ाइल का उपयोग करके मेरे लिए काम नहीं करता था, लेकिन मैं इसे एक .csproj फ़ाइल के साथ काम करने में सक्षम था।
स्ट्रिपिंगवर्यर 18

6
आप आइटम एक्सप्लोरर को सोल्यूशन एक्सप्लोरर में प्रदर्शित करने के लिए कंटेंट एलिमेंट में <Visible> true </ Visible> जोड़ सकते हैं।
माइकल बेकर

मेरा सिर्फ एक .proj के साथ ठीक था
जेसन Dufair 19

यह मेरे लिए बिल्कुल भी काम नहीं करता था और मैं यह मान रहा हूँ क्योंकि आइटम-टू-बी-लिंक्ड खुद एक प्री-बिल्ड इवेंट में उत्पन्न हुए थे।
पॉल के

2
VS2017 (15.8.6) पर .NET कोर प्रोजेक्ट के लिए काम नहीं कर रहा है।
zwcloud

10

निम्नलिखित, जिसे आप अपनी परियोजना फ़ाइल के निचले हिस्से में जोड़ेंगे, अपनी निर्माण फ़ाइलों को निर्देशिका संरचना को बनाए रखने के बाद $(TargetDirectory)आपके निर्माण की लक्षित निर्देशिका (आमतौर पर $(MSBuildProjectDirectory)\bin\Debug) के निर्माण की घटना को बनाए रखेगा ।

<ItemGroup>
    <ExtraContent Include="$(MSBuildProjectDirectory)\..\..\MyContentFiles\**" />
</ItemGroup>

<Target Name="AfterBuild">
    <Copy 
        SourceFiles="@(ExtraContent)" 
        DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
        SkipUnchangedFiles="true" />
</Target>

यदि इन फ़ाइलों को MyContentFiles नामक निर्देशिका में जाने की आवश्यकता है, तो आप इसे प्रतिलिपि से पहले जोड़ सकते हैं:

<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " />

और बदल जाते हैं

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

सेवा

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

1
आपके ट्रांसफ़ॉर्म में एक टाइप-ओ: @ (एक्स्ट्राकॉन्टेंट) -> '...') @ (एक्सट्रा कॉन्टेक्स्ट -> '...') होना चाहिए। अन्यथा अच्छा जवाब!
अलेक्सडे

@Todd 1) यदि कोई फ़ाइल MyContentFiles स्टोर से हटा दी जाती है तो क्या होता है? ऐसा नहीं लगता कि यह सॉल्यूशन डीआर 2 से हटा दिया जाएगा) क्या रन-वे के पूरा होने के बाद इन फाइलों को $ (सॉल्यूसिर) से हटाने के लिए विजुअल स्टूडियो प्राप्त करने का कोई तरीका है। उन्हें छोड़कर अन्य देवों को भ्रमित कर सकते हैं।
एडम

3

मुझे लगता है

<Content Include="..\..\MyContentFiles\**\*.*">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

बस पर्याप्त है, क्योंकि आप उस फ़ोल्डर और सबफ़ोल्डर में सब कुछ चाहते हैं


2

.NET कोर प्रोजेक्ट के लिए फ़ोल्डर में फ़ाइलें शामिल करने के लिए,

<!--Just files-->
<ItemGroup>
  <None Update="..\..\MyContentFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>
<!--Content files-->
<ItemGroup>
  <Content Include="..\..\MyContentFiles\**\*.*" Link="MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

और आइटम की संपत्ति "आउटपुट निर्देशिका में कॉपी करें" "यदि नया है तो कॉपी करें":
यदि नया है तो कॉपी करें


-1

एक .Net कोर परियोजना में एक फ़ाइल को अनदेखा करने के लिए:

<ItemGroup>
 <Content Include="appsettings.local.json">
   <CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory>
 </Content>
</ItemGroup>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.