Visual Studio 프로젝트에서 구현하는 기능에 따라 패키지를 참조해서 사용하는데
공통 모듈로 사용되는 프로젝트의 경우 메인 솔루션에 따라 특정 기능을 활성화 하거나 비활성화 할 필요가 생겼습니다.
저의 경우 프로젝트 속성에서 상수를 추가한 다음에 소스 코드에서 컴파일 상수로 분기 처리하는 방법을 주로 사용했습니다.
#if HangFire
using Hangfire;
#endif
#if HangFire
readonly IMyHangfireService _myHangfireService;
#else
#endif
근데 문득 사용하지 않는 기능을 위해 참조된 패키지까지 비활성화 하고 싶은 욕심이 생겼습니다.
그래서 다음과 같이 조건을 추가해서 해봤는데 생각처럼 적용되지 않습니다.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DefineConstants>$(DefineConstants);HangFire;SocialLogin</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DefineConstants>$(DefineConstants);HangFire;SocialLogin</DefineConstants>
</PropertyGroup>
<ItemGroup Condition="'$(DefineConstants)'=='HangFire'">
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.3" />
<PackageReference Include="Hangfire.SqlServer" Version="1.8.3" />
</ItemGroup>
그래서 MSDN 을 찾아보니 정규식으로 처리가 가능한 방법이 있어 정리하고자 합니다.
다음 링크(MSBuild 조건부 구문)에서 확인이 가능합니다.
HangFire 상수가 적용된 경우 다음과 같이 정규식으로 처리가 가능합니다.
<ItemGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(DefineConstants), '^(.*;)*HangFire(;.*)*$'))">
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.3" />
<PackageReference Include="Hangfire.SqlServer" Version="1.8.3" />
</ItemGroup>
해당 기능을 소스 코드 단에서 분기 처리만 해줘도 런타임에 실행되지 않는 한 메모리를 소모할 일은 없지만
사용자에게 배포되는 시점에 해당 패키지가 제외되므로 배포되는 용량을 줄일 수 있다는 점에서 메리트가 있는 것 같습니다.
0 Comments