그래서 제 문제는 매우 간단합니다. 디버그 빌드 또는 릴리스 게시 여부에 관계없이 빌드 출력 디렉터리에 복사하려는 파일이 있습니다. 내가 찾을 수있는 모든 정보는 이전 json 구성 접근 방식에 관한 것입니다. 누구나 dotnetcore와 함께 csproj를 사용하는 예가 있습니까?
그래서 제 문제는 매우 간단합니다. 디버그 빌드 또는 릴리스 게시 여부에 관계없이 빌드 출력 디렉터리에 복사하려는 파일이 있습니다. 내가 찾을 수있는 모든 정보는 이전 json 구성 접근 방식에 관한 것입니다. 누구나 dotnetcore와 함께 csproj를 사용하는 예가 있습니까?
답변:
귀하의 요구 사항에 따라 목표를 달성하는 데는 몇 가지 방법이 있습니다.
가장 쉬운 방법은 메타 데이터 ( 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>
.
DestinationSubDirectory="subdir\"
에 대한 메타 데이터를 Reference
직접 설정할 수 있습니다 . 그러나 이것은 어셈블리 해결을 직접 구현해야 함을 의미합니다 ( AssemblyResolve 이벤트 )
이것은 내 문제를 분류하는 데 도움이되었지만 하위 디렉토리의 모든 파일에서 작동하지 않았습니다. 나는 또한 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>
<Content Include="layouts\**\*.*">
<Project Sdk="Microsoft.NET.Sdk.Web">
)를 사용 Include=
하는 경우 이미 SDK 내에서 암시 적으로 지정하는 것처럼 보이기 때문에 사용할 수 없습니다 . Update=
추가 파일을 빌드하고 포함하는 데 사용해야 했습니다.
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>
(더 나은 코드 형식은 내 답변 참조)
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>