Sao chép tệp vào thư mục đầu ra bằng csproj dotnetcore


103

Vì vậy, vấn đề của tôi là khá đơn giản. Tôi có một số tệp mà tôi muốn được sao chép vào thư mục đầu ra của bản dựng cho dù đó là bản dựng gỡ lỗi hay bản xuất bản phát hành. Tất cả thông tin tôi có thể tìm thấy là về cách tiếp cận cấu hình json cũ. Bất cứ ai có một ví dụ sử dụng csproj với dotnetcore?

Câu trả lời:


143

Có khá nhiều cách để đạt được mục tiêu của bạn, tùy thuộc vào nhu cầu của bạn.

Cách tiếp cận dễ nhất là đặt các mục siêu dữ liệu ( CopyToOutputDirectory/ CopyToPublishDirectory) có điều kiện (giả sử .txtlà một Nonemục thay vì Content, nếu nó không hoạt động, hãy thử <Content>thay thế):

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

Nếu cần kiểm soát nhiều hơn, cách tiếp cận linh hoạt nhất là thêm các mục tiêu tùy chỉnh gắn vào quá trình xây dựng trong tệp 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>

Điều này sao chép một tệp vào các thư mục tương ứng. Để biết thêm tùy chọn cho <Copy>nhiệm vụ, hãy xem tài liệu của nó . Để giới hạn điều này ở một số cấu hình nhất định, bạn có thể sử dụng Conditionthuộc tính:

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

ConditionThuộc tính này có thể được áp dụng cả trên <Target>phần tử hoặc trên các phần tử nhiệm vụ như <Copy>.


Tôi sẽ áp dụng 'DestinationFolder' cho các mục <Reference> như thế nào, hoặc trường hợp có thể xảy ra, không có nhiều tài liệu mà tôi có thể tìm thấy. Tôi không muốn tất cả các tập hợp của mình ở cấp cơ sở và muốn chúng nằm trong thư mục riêng của chúng.
Reahreic

Bạn có thể đặt DestinationSubDirectory="subdir\"siêu dữ liệu Referencetrực tiếp trên các mục. Tuy nhiên, điều này có nghĩa là bạn cần phải tự mình thực hiện giải pháp lắp ráp ( sự kiện AssemblyResolve )
Martin Ullrich

Làm cách nào tôi có thể sao chép thư mục mẹ có chứa một số dlls trong các thư mục tương ứng. Tôi muốn cung cấp chúng trong đường dẫn xuất bản đầu ra để sau khi xây dựng các thư mục này sẽ có sẵn cho ứng dụng của tôi lúc chạy, khi tôi tải các dll này dưới dạng plugin khi khởi động. Tôi đang sử dụng rider trên Mac
kuldeep

93

Mặc dù điều này đã giúp tôi sắp xếp vấn đề của mình, nhưng nó không hoạt động với tất cả các tệp trong thư mục con. Tôi cũng đã sử dụng Content Includehơn là 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
Mọi hoán vị khác của tất cả các câu trả lời / đề xuất khác đều không hiệu quả với tôi. Thậm chí không đề cập đến tệp trong đầu ra xây dựng dài dòng. Nhưng đề xuất của bạn ở đây đã hiệu quả.
user7817808

15
Và nếu bạn muốn bao gồm sử dụng các thư mục con trung gian<Content Include="layouts\**\*.*">
JSancho

3
Khi sử dụng Web SDK ( <Project Sdk="Microsoft.NET.Sdk.Web">), nó sẽ không cho phép bạn sử dụng Include=vì dường như nó đã chỉ định ngầm điều đó trong SDK. Tôi đã phải sử dụng Update=nó để xây dựng và bao gồm các tệp bổ sung của mình.
notracs

Đẹp, cảm ơn .. Nhưng làm thế nào để chỉ sao chép nội dung của thư mục vào thư mục đầu ra chứ không phải chính thư mục. Biểu thức assets\*.*nên giả sử nó. Nhưng nó sao chép toàn bộ thư mục nội dung. Vì vậy, tôi có bin/Debug/netcoreapp3.1/assets/...Nhưng tôi muốn các tệp của thư mục tài sản vào thư mục gốc của đầu ra. bin/Debug/netcoreapp3.1/....
Dominik

Tôi đã tìm thấy giải pháp: 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> (xem câu trả lời của tôi để có định dạng mã tốt hơn.)
Dominik

15

Đặt tệp này vào tệp .csproj của bạn thay thế nlog.config bằng đường dẫn tệp mong muốn. Sau đó, chỉ cần lưu nó và xây dựng dự án của bạn:

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

Điều này dường như không sao chép các thư mục con.
null

13

Giả sử bạn có một assetsthư mục trong thư mục gốc của mình. Bạn có thể đặt tên nó như bạn muốn. Đây chỉ là một ví dụ:

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>

điều này chỉ sao chép nội dung của assetsthư mục vào thư mục gốc mà không gói nó vào assetsthư mục. Nhưng nếu bạn muốn sao chép bằng chính thư mục đó, bạn có thể sử dụng mã sau:

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

3

Tôi có yêu cầu về việc lựa chọn các mẫu HTML để có thể sử dụng được ở cả phía máy khách và phía máy chủ (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

Cảm ơn bạn đã lưu ngày của tôi, nếu bạn cần buộc sao chép của một gói nuget cụ thể vào một dự án lõi asp.net (2.2), hãy thêm vào cuối csproj của bạn:

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

hoặc là

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

1
Lý tưởng nhất là sử dụng tác vụ <Sao chép> để làm cho nó đa nền tảng.
Bruno Garcia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.