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

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



답변

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

가장 쉬운 방법은 메타 데이터 ( 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>.


답변

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


답변

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

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


답변

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>


답변

클라이언트 측과 서버 측 모두에서 사용할 수있는 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>


답변

내 하루를 절약 해 주셔서 감사합니다. 특정 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>


답변

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