MSBuild - CopyToOutputDirectory가 "dotnet publish" 시에는 적용되지 않는 문제
지난 글에서, 다른 디렉터리의 파일을 CopyToOutputDirectory 속성을 이용해 빌드 시 Output 디렉터리에 넣는 방법을 사용했는데요,
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Include="..\ClassLibrary2\bin\$(Configuration)\net7.0\win-x64\publish\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
반면 저 프로젝트를 "dotnet publish"로 배포하면 "publish" 디렉터리에 해당 파일들이 존재하지 않습니다. 검색해 보면, CopyToPublishDirectory 속성이 있지만,
CopyToPublishDirectory
; https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#copytopublishdirectory
그래도 동작하지 않습니다. 이상하군요. ^^; 왜 안 될까요?
다행히 우회 방법이 있긴 합니다. 디렉터리를 지정하는 대신, 개별 파일 단위로 Link 속성과 함께 지정하면,
<ItemGroup>
<!-- Visual Studio에서 "Add as Link"로도 추가 가능 -->
<None Include="..\ClassLibrary2\bin\Debug\net7.0\win-x64\publish\ClassLibrary2.dll" Link="ClassLibrary2.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="..\ClassLibrary2\bin\Debug\net7.0\win-x64\publish\ClassLibrary2.pdb" Link="ClassLibrary2.pdb">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
"dotnet publish" 시에도 복사가 됩니다. 혹시 Link의 효과인가 싶어 디렉터리에 대해서도 지정했더니,
<ItemGroup>
<None Include="..\ClassLibrary2\bin\$(Configuration)\net7.0\win-x64\publish\*"
Link="%(Filename)%(Extension)">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
역시나 빌드 시에는 출력 디렉터리에 복사가 되지만, publish 시에는 안 됩니다. 어쩔 수 없군요. ^^; 파일이 몇 개 없을 때는 개별 Include로 지정하고, 많을 때는 Task로 해결하는 것이 그나마 낫겠습니다.
<Target Name="PostDeploy" AfterTargets="Publish">
<ItemGroup>
<MySourceFiles Include="..\ClassLibrary2\bin\Debug\net7.0\win-x64\publish\*" />
</ItemGroup>
<Copy SourceFiles="@(MySourceFiles)"
DestinationFolder="$(ProjectDir)$(PublishDir)" />
</Target>
혹은, Copy 대신 robocopy를 이용하는 것도 가능합니다.
<Exec Command="robocopy "$(ProjectDir)..\ClassLibrary2\bin\Debug\net7.0\win-x64\publish" "$(ProjectDir)$(PublishDir)." *.*" IgnoreExitCode="true" />
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]