msbuild - हरण - शंकु में किनारों की संख्या




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

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

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

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

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


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

<ItemGroup>
  <None Update="..\..\MyContentFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

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


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

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

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


निम्नलिखित, जिसे आप अपनी परियोजना फ़ाइल के निचले हिस्से में जोड़ेंगे, अपनी निर्माण फ़ाइलों को निर्देशिका संरचना को बनाए रखने के बाद अपने निर्माण की लक्षित निर्देशिका $(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" />

मुझे लगता है

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

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


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

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

प्रोजेक्ट फ़ाइल (उदाहरण के लिए शामिल हैं ।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-using-msbuild.aspx





csproj