คัดลอกไฟล์ไปยังไดเร็กทอรีเอาต์พุตโดยใช้ csproj dotnetcore


109

ดังนั้นปัญหาของฉันค่อนข้างง่าย ฉันมีไฟล์บางไฟล์ที่ต้องการคัดลอกไปยังไดเร็กทอรีเอาต์พุตของบิลด์ไม่ว่าจะเป็นเวอร์ชันดีบักหรือรีลีสเผยแพร่ ข้อมูลทั้งหมดที่ฉันสามารถหาได้เกี่ยวกับแนวทางการกำหนดค่า json แบบเก่า ใครมีตัวอย่างใช้ csproj กับ dotnetcore บ้างครับ?

คำตอบ:


148

มีหลายวิธีในการบรรลุเป้าหมายขึ้นอยู่กับความต้องการของคุณ

วิธีที่ง่ายที่สุดคือการตั้งค่าข้อมูลเมตา ( 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แอตทริบิวต์:

<TargetCondition=" '$(Configuration)' == 'Release' ">

นี้Conditionแอตทริบิวต์สามารถนำมาใช้ทั้งในองค์ประกอบหรือจากองค์ประกอบงานเช่น<Target><Copy>


ฉันจะใช้ 'DestinationFolder' กับรายการ <Reference> ได้อย่างไรหรือเป็นไปได้ไหมมีเอกสารไม่มากที่ฉันจะพบ ฉันไม่ต้องการให้แอสเซมบลีทั้งหมดของฉันอยู่ในระดับรูทและต้องการให้มันอยู่ในโฟลเดอร์ของพวกเขาเอง
Reahreic

คุณสามารถตั้งค่าDestinationSubDirectory="subdir\"ข้อมูลเมตาของReferenceรายการได้โดยตรง อย่างไรก็ตามนี่หมายความว่าคุณต้องใช้ความละเอียดในการประกอบด้วยตัวเอง ( เหตุการณ์ AssemblyResolve )
Martin Ullrich

ฉันจะคัดลอกโฟลเดอร์หลักที่มี dll ในโฟลเดอร์ที่เกี่ยวข้องได้อย่างไร ฉันต้องการทำให้พร้อมใช้งานในพา ธ ที่เผยแพร่เอาต์พุตเพื่อที่หลังจากสร้างโฟลเดอร์เหล่านี้ r พร้อมใช้งานสำหรับแอปพลิเคชันของฉันในขณะทำงานขณะที่ฉันโหลด dll เหล่านี้เป็นปลั๊กอินเมื่อเริ่มต้น ฉันใช้ rider บน mac
kuldeep

97

แม้ว่าสิ่งนี้จะช่วยให้ฉันได้รับการจัดเรียงปัญหา แต่ก็ใช้ไม่ได้กับทุกไฟล์ในไดเรกทอรีย่อย ฉันยังใช้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
การเปลี่ยนแปลงอื่น ๆ ของคำตอบ / คำแนะนำอื่น ๆ ทั้งหมดไม่สามารถใช้งานได้สำหรับฉัน ไม่ได้กล่าวถึงไฟล์ในเอาต์พุตการสร้างแบบ verbose แต่ข้อเสนอแนะของคุณได้ผล
user7817808

16
และถ้าคุณต้องการรวมโฟลเดอร์ย่อยระดับกลางให้ใช้<Content Include="layouts\**\*.*">
JSancho

3
เมื่อใช้ Web SDK ( <Project Sdk="Microsoft.NET.Sdk.Web">) จะไม่อนุญาตให้คุณใช้Include=เนื่องจากดูเหมือนว่าจะระบุไว้โดยปริยายแล้วว่าภายใน SDK ฉันต้องใช้Update=เพื่อสร้างและรวมไฟล์เพิ่มเติมของฉัน
notracs

ดีขอบคุณ .. แต่วิธีการคัดลอกเฉพาะเนื้อหาของโฟลเดอร์ไปยังไดเร็กทอรีเอาต์พุตไม่ใช่โฟลเดอร์นั้นเอง การแสดงออกassets\*.*ควรถือว่ามัน แต่จะคัดลอกโฟลเดอร์เนื้อหาทั้งหมด ดังนั้นฉันมีbin/Debug/netcoreapp3.1/assets/...แต่ฉันต้องการไฟล์ของโฟลเดอร์ assets ไปยังไดเรกทอรีรากของผลลัพธ์ bin/Debug/netcoreapp3.1/....
Dominik

ฉันพบวิธีแก้ไข: 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> (ดูคำตอบของฉันสำหรับรูปแบบรหัสที่ดีกว่า)
Dominik

15

สมมติว่าคุณมีassetsโฟลเดอร์ในไดเรกทอรีรากของคุณ คุณสามารถตั้งชื่อได้ตามที่คุณต้องการ นี่เป็นเพียงตัวอย่าง:

your-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>

15

วางสิ่งนี้ในไฟล์. csproj ของคุณแทนที่ nlog.config ด้วยพา ธ ไฟล์ที่ต้องการ จากนั้นบันทึกและสร้างโครงการของคุณ:

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

ดูเหมือนว่าจะไม่คัดลอกไดเรกทอรีย่อย
null

3

ฉันมีข้อกำหนดสำหรับการเลือกเทมเพลต HTML ที่จะใช้งานได้ทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์ (Handlebars 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
<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> เพื่อทำให้ข้ามแพลตฟอร์ม
Bruno Garcia

0

หากคุณต้องการบังคับให้คัดลอกแพ็คเกจ NuGet เฉพาะลงในโปรเจ็กต์ ASP.NET Core (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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.