csproj dotnetcore를 사용하여 출력 디렉터리에 파일 복사


104

그래서 제 문제는 매우 간단합니다. 디버그 빌드 또는 릴리스 게시 여부에 관계없이 빌드 출력 디렉터리에 복사하려는 파일이 있습니다. 내가 찾을 수있는 모든 정보는 이전 json 구성 접근 방식에 관한 것입니다. 누구나 dotnetcore와 함께 csproj를 사용하는 예가 있습니까?

답변:


144

귀하의 요구 사항에 따라 목표를 달성하는 데는 몇 가지 방법이 있습니다.

가장 쉬운 방법은 메타 데이터 ( CopyToOutputDirectory/ CopyToPublishDirectory) 항목을 조건부 로 설정하는 것입니다 ( 대신 항목 이라고 가정 .txt하고 작동하지 않으면 대신 시도하십시오 ).NoneContent<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>.


<Reference> 항목에 'DestinationFolder'를 어떻게 적용합니까? 아니면 이벤트가 가능한지, 찾을 수있는 문서가 많지 않습니다. 모든 어셈블리가 루트 수준에있는 것을 원하지 않으며 자체 폴더에있는 것을 선호합니다.
Reahreic

항목 DestinationSubDirectory="subdir\"에 대한 메타 데이터를 Reference직접 설정할 수 있습니다 . 그러나 이것은 어셈블리 해결을 직접 구현해야 함을 의미합니다 ( AssemblyResolve 이벤트 )
Martin Ullrich

각 폴더에 일부 dll이 포함 된 상위 폴더를 복사하려면 어떻게해야합니까? 이 폴더를 빌드 한 후 런타임에 내 응용 프로그램에 사용할 수 있도록 출력 게시 경로에서 사용할 수 있도록 만들고 싶습니다. 시작할 때 이러한 dll을 플러그인으로로드합니다. 나는 맥에서 라이더를 사용하고 있습니다
kuldeep

94

이것은 내 문제를 분류하는 데 도움이되었지만 하위 디렉토리의 모든 파일에서 작동하지 않았습니다. 나는 또한 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

15
중간 하위 폴더를 포함하려면 다음을 사용하십시오.<Content Include="layouts\**\*.*">
JSancho

3
Web SDK ( <Project Sdk="Microsoft.NET.Sdk.Web">)를 사용 Include=하는 경우 이미 SDK 내에서 암시 적으로 지정하는 것처럼 보이기 때문에 사용할 수 없습니다 . Update=추가 파일을 빌드하고 포함하는 데 사용해야 했습니다.
notracs

좋습니다. 감사합니다. 그러나 폴더 자체가 아닌 출력 디렉토리에 폴더의 내용 만 복사하는 방법. 표현 assets\*.*은 그것을 가정해야합니다. 그러나 전체 자산 폴더를 복사합니다. 그래서 나는 있지만 bin/Debug/netcoreapp3.1/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

이 파일을 .csproj 파일에 넣어 nlog.config를 원하는 파일 경로로 바꿉니다. 그런 다음 저장하고 프로젝트를 빌드하십시오.

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

이것은 하위 디렉토리를 복사하지 않는 것 같습니다.
null '

13

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>

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

내 하루를 절약 해 주셔서 감사합니다. 특정 nuget 패키지를 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> 작업을 사용하여 교차 플랫폼으로 만드십시오.
브루노 가르시아
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.