Csproj डॉटनेटकोर का उपयोग करके आउटपुट डायरेक्टरी में फाइल कॉपी करें


103

इसलिए मेरा मुद्दा बहुत सरल है। मेरे पास कुछ फाइलें हैं जिन्हें मैं बिल्ड आउटपुट डायरेक्टरी में कॉपी करना चाहता हूं चाहे वह डीबग बिल्ड हो या रिलीज पब्लिश। सभी जानकारी जो मुझे मिल सकती है वह पुराने जोंस कॉन्फिगर दृष्टिकोण के बारे में है। किसी के पास डॉटनेटकोर के साथ csproj का उपयोग करने का एक उदाहरण है?

जवाबों:


143

आपके लक्ष्यों को प्राप्त करने के लिए कुछ तरीके हैं, जो आपकी आवश्यकताओं के आधार पर हैं।

सबसे आसान तरीका है मेटाडेटा ( CopyToOutputDirectory/ CopyToPublishDirectory) आइटम को सशर्त रूप से सेट करना (मानने के बजाय .txtएक Noneआइटम होना Content, अगर यह काम नहीं करता है, तो इसके <Content>बजाय प्रयास करें :

<ItemGroup Condition="'$(Configuration)' == 'Debug'">
  <None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

यदि अधिक नियंत्रण की आवश्यकता होती है, तो सबसे बहुमुखी दृष्टिकोण कस्टम लक्ष्यों को जोड़ना है जो कि csproj फ़ाइल में निर्माण प्रक्रिया में हुक करते हैं:

<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
  <Copy SourceFiles="foo.txt" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyCustomContentOnPublish" AfterTargets="Publish">
  <Copy SourceFiles="foo.txt" DestinationFolder="$(PublishDir)" />
</Target>

यह एक फाइल को संबंधित डायरेक्टरी में कॉपी करता है। <Copy>कार्य के लिए अधिक विकल्पों के लिए इसके दस्तावेज देखें । इसे कुछ कॉन्फ़िगरेशन तक सीमित करने के लिए, आप एक Conditionविशेषता का उपयोग कर सकते हैं :

<Target … Condition=" '$(Configuration)' == 'Release' ">

इस Conditionविशेषता को <Target>तत्व या कार्य तत्वों जैसे दोनों पर लागू किया जा सकता है <Copy>


मैं <संदर्भ> आइटम पर would डेस्टिनेशन फ़ॉल्डर ’कैसे लागू करूंगा, या क्या यह संभव है, डॉक्स में बहुत कुछ नहीं है जो मुझे मिल सकता है। मैं अपने सभी विधानसभाओं को रूट स्तर पर नहीं चाहता हूं और उन्हें अपने फ़ोल्डर में रखना पसंद करूंगा।
रेहेरिक

आप DestinationSubDirectory="subdir\"मेटाडेटा को Referenceसीधे आइटम पर सेट कर सकते हैं। हालांकि इसका मतलब है कि आपको विधानसभा के प्रस्ताव को स्वयं लागू करने की आवश्यकता है ( असेंबली का आयोजन )
मार्टिन उलरिच

मैं मूल फ़ोल्डर की प्रतिलिपि कैसे बना सकता हूं जिसमें संबंधित फ़ोल्डर में कुछ dll हैं। मैं उन्हें आउटपुट प्रकाशित पथ में उपलब्ध कराना चाहता हूं ताकि रन समय पर अपने आवेदन के लिए उपलब्ध इन फ़ोल्डरों का निर्माण करने के बाद, मैं इन डीएलएस को स्टार्टअप पर प्लग इन के रूप में लोड करूं। मैं पर सवार का उपयोग कर रहा हूँ MAC
kuldeep

93

हालांकि इससे मुझे अपने मुद्दे को हल करने में मदद मिली, यह सब-डायरेक्टरी की सभी फाइलों के लिए काम नहीं आया। मैंने भी इस्तेमाल कियाContent Include बजायContent Update ;

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="layouts\*.*">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>  
  </ItemGroup>

</Project>

3
अन्य सभी जवाबों / सुझावों में से हर एक क्रमपरिवर्तन मेरे लिए काम करने में विफल रहा। वर्बोज़ बिल्ड आउटपुट में फ़ाइल का उल्लेख भी नहीं है। लेकिन यहां आपके सुझाव ने काम किया।
user7817808 23

15
और अगर आप इंटरमीडिएट <Content Include="layouts\**\*.*">
सबफोल्डर्स का

3
वेब एसडीके ( <Project Sdk="Microsoft.NET.Sdk.Web">) का उपयोग करते समय यह आपको उपयोग करने की अनुमति नहीं देगा Include=क्योंकि यह पहले से ही एसडीके के भीतर निहित रूप से निर्दिष्ट करने के लिए लगता है। मुझे Update=इसे बनाने के लिए और अपनी अतिरिक्त फ़ाइलों को शामिल करने के लिए उपयोग करना था ।
9

अच्छा, धन्यवाद .. लेकिन आउटपुट निर्देशिका में फ़ोल्डर की केवल सामग्री की प्रतिलिपि कैसे करें फ़ोल्डर स्वयं नहीं। अभिव्यक्ति assets\*.*को इसे ग्रहण करना चाहिए। लेकिन यह पूर्ण संपत्ति फ़ोल्डर की प्रतिलिपि बनाता है। इसलिए मेरे पास है, bin/Debug/netcoreapp3.1/assets/...लेकिन मैं संपत्ति फ़ोल्डर की फ़ाइलों को आउटपुट की मूल निर्देशिका में चाहता हूं। bin/Debug/netcoreapp3.1/...
डोमिनिक

मुझे एक समाधान मिला: xml <Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <AssetsSourceFiles Include="assets/**/*.*"/> </ItemGroup> <Target Name="CopyCustomContent" AfterTargets="AfterBuild"> <Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" /> </Target> </Project> (बेहतर कोड प्रारूप के लिए मेरा जवाब देखें।)
डोमिनिक

15

वांछित फ़ाइलपथ के साथ nlog.config की जगह अपनी .csproj फ़ाइल में इसे रखें। तो बस इसे बचाने और अपनी परियोजना का निर्माण:

<ItemGroup>
  <Content Update="Nlog.config">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </Content>
</ItemGroup>

यह उपनिर्देशिका की नकल करने के लिए प्रकट नहीं होता है।
null

13

मान लें कि आपके पास ए assets आपके रूट डायरेक्टरी में फोल्डर है। जैसा चाहो वैसा नाम दे सकते हो। यह सिर्फ एक उदाहरण है:

अपने-project.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <AssetsSourceFiles Include="assets/**/*.*"/>
  </ItemGroup>

  <Target Name="CopyCustomContent" AfterTargets="AfterBuild">
    <Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
  </Target>
</Project>

यह assetsफ़ोल्डर की सामग्री को केवल फ़ोल्डर में लपेटे बिना आउटपुट रूट पर assetsकॉपी करता है। लेकिन अगर आप स्वयं फ़ोल्डर के साथ कॉपी करना चाहते हैं, तो आप निम्न कोड का उपयोग कर सकते हैं:

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <Content Include="assets\**\*.*">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
</Project>

3

मेरे पास क्लाइंट-साइड और सर्वर-साइड दोनों के लिए HTML टेम्पलेट के चयन की आवश्यकता थी (हैंडलबार js)

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Content Update="wwwroot\html-templates\**\*.*">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

</Project>

0

धन्यवाद, आप मेरा दिन बचाते हैं, अगर आपको एक विशिष्ट नगेट पैकेज की प्रतिलिपि को asp.net कोर प्रोजेक्ट (2.2) में डालने की आवश्यकता है, तो अपने csproj के अंत में जोड़ें:

<!-- Force copy MathNet because we need it in compilation -->
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="Build">
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll'))" />
</Target>

<ItemGroup>
    <ContentWithTargetPath Include="..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <TargetPath>MathNet.Numerics.dll</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>

0
<PropertyGroup>
    <PostBuildEvent>xcopy "$(ProjectDir)Xml" "$(ProjectDir)$(OutDir)Xml" /S /F /I /R /Y</PostBuildEvent>
</PropertyGroup>

या

<PropertyGroup>
    <PostBuildEvent>copy /Y "$(ProjectDir)MyXml.xml" "$(ProjectDir)$(OutDir)Xml"</PostBuildEvent>
</PropertyGroup>

1
इसे पार करने के लिए आदर्श रूप से <Copy> कार्य का उपयोग करें।
ब्रूनो गार्सिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.