일체형 빌드도구

소프트웨어 프로젝트에서 여러 DLL 파일이나 종속성을 관리하고 단일 파일로 병합하는 것은 배포와 유지보수를 간소화하는 데 중요한 역할을 합니다. 이를 돕기 위해 다양한 패키지 병합 도구들이 개발되어 있습니다. 이 글에서는 패키지 병합 도구를 추천 순서대로 소개하며, 각 도구의 장단점과 사용 상황에 대해 설명합니다.

요약

단일 파일 배포 및 패키지 병합 도구는 프로젝트 특성, 플랫폼, 종속성 구조에 따라 선택되어야 합니다. 다음과 같이 추천할 수 있습니다:

  • dotnet single-file publish
    • 추가 도구 없이 단일 파일 배포를 원할 경우 최선의 선택입니다.
  • ILRepack
    • .NET Core 및 .NET 5+ 플랫폼에서 단일 파일로 DLL을 병합하고자 할 때, 오픈 소스이면서 기능적으로 강력한 도구입니다.
  • Costura.Fody
    • 여러 종속성 DLL을 내장하고, 최신 .NET 플랫폼에서 단일 파일 배포를 원할 때 적합한 도구입니다.
  • ILMerge
    • 주로 .NET Framework 프로젝트에서 DLL 파일 병합이 필요할 때 사용됩니다.
  • Fusion
    • 간단한 단일 파일 배포를 원할 때 사용할 수 있는 도구로, 최신 .NET 플랫폼에서도 사용할 수 있습니다. 이 도구들은 각각의 특징을 잘 이해한 후 프로젝트에 맞는 것을 선택하여 사용하는 것이 좋습니다.

dotnet single-file publish

dotnet single-file publish는 .NET SDK에서 기본적으로 제공하는 단일 파일 배포 기능입니다. 이 기능은 .NET Core 3.0 이후부터 도입되었으며, .NET 5+에서 더욱 강화되었습니다. 애플리케이션과 모든 종속성을 하나의 실행 파일로 패키징하여, self-contained 애플리케이션을 쉽게 배포할 수 있습니다.

사용 방식

dotnet publish 명령을 사용하여 애플리케이션을 단일 파일로 배포할 수 있습니다. self-contained와 framework-dependent 방식을 모두 지원합니다.

dotnet publish -r win-x64 --self-contained -p:PublishSingleFile=true

장점

  • 추가 도구 없이 사용 가능하며, .NET SDK에서 기본적으로 제공되므로 별도의 도구 설치가 필요 없습니다.
  • 최신 .NET 플랫폼을 지원합니다.
  • self-contained 배포가 가능하여 런타임 설치 없이 애플리케이션을 실행할 수 있습니다.

단점

  • 복잡한 커스터마이징이 제한될 수 있으며, 특정 DLL 제외 작업은 지원되지 않을 수 있습니다.

ILRepack

ILRepack은 ILMerge의 오픈 소스 대안으로, 여러 어셈블리(DLL)를 하나의 단일 어셈블리로 병합하는 기능을 제공합니다. .NET Core 및 .NET 5+도 지원하며, .NET Framework에서도 사용 가능합니다. ILMerge보다 더 광범위한 플랫폼에서 사용 가능하다는 점에서 많은 개발자들에게 선호됩니다.

사용 방식

ILRepack을 사용하여 여러 DLL 파일을 하나의 단일 파일로 병합할 수 있습니다.

ILRepack.exe /out:OutputAssembly.dll InputAssembly1.dll InputAssembly2.dll

장점

  • 오픈 소스로 지속적인 업데이트와 개선이 이루어지고 있습니다.
  • .NET Framework, .NET Core, .NET 5+에서 모두 사용 가능합니다.
  • 여러 종속성 DLL을 하나의 단일 DLL로 병합하여 배포 파일 수를 줄일 수 있습니다.

단점

  • 복잡한 어셈블리 구조에서 예상치 못한 오류가 발생할 수 있습니다.
  • 병합 후 디버그 정보(PDB 파일)나 리소스 처리에 제한이 있을 수 있습니다.

Costura.Fody

Costura.Fody는 Fody의 플러그인으로, 종속성 DLL을 실행 파일(EXE 또는 DLL)에 리소스 형태로 포함시켜 단일 파일 배포를 가능하게 합니다. 이 방식은 DLL을 물리적으로 병합하지 않고 리소스로 포함시켜 런타임에 메모리로 로드하는 방법을 사용합니다. .NET Framework, .NET Core, .NET 5+ 모두에서 사용할 수 있습니다.

사용 방식

Costura.Fody는 NuGet 패키지로 설치되며, 프로젝트에 추가하면 종속성 DLL이 리소스로 포함됩니다.

<PackageReference Include="Costura.Fody" Version="5.0.0" />

장점

  • 여러 종속성 DLL을 내장하여 단일 파일로 배포할 수 있습니다.
  • 종속성 파일이 외부에 노출되지 않고 애플리케이션 내부에 포함됩니다.
  • 최신 .NET 플랫폼에서도 사용 가능합니다.

단점

  • 네이티브 DLL을 포함하지 못할 수 있으며, 이 경우 추가적인 처리가 필요할 수 있습니다.
  • 복잡한 종속성 구조에서는 런타임에 종속성 로딩과 관련된 문제가 발생할 수 있습니다.

ILMerge

ILMerge는 주로 .NET Framework에서 사용되는 도구로, 여러 어셈블리(DLL 파일)를 하나의 단일 DLL로 병합하는 기능을 제공합니다. 이 방식은 배포 시 여러 종속성을 단일 파일로 묶어 간소화할 수 있으며, 배포 파일 수를 줄이는 데 효과적입니다.

사용 방식

ILMerge를 사용하여 여러 DLL 파일을 하나의 단일 DLL 파일로 병합할 수 있습니다.

ILMerge /out:OutputAssembly.dll InputAssembly1.dll InputAssembly2.dll

장점

  • 여러 DLL 파일을 하나로 병합하여 단일 DLL로 배포할 수 있습니다.
  • 명령어로 쉽게 병합 작업을 수행할 수 있습니다.

단점

  • 주로 .NET Framework에서 사용되며, 최신 .NET 플랫폼에서는 공식적으로 지원되지 않습니다.
  • 병합 후 디버깅 정보나 리소스 처리가 어려울 수 있습니다.

Fusion

Fusion은 Costura.Fody와 유사한 방식으로, 여러 종속성 DLL을 단일 실행 파일로 병합하는 오픈 소스 도구입니다. 최신 .NET 플랫폼에서 간편하게 단일 파일 배포를 구현할 수 있도록 설계되었습니다.

사용 방식

Fusion은 프로젝트의 DLL 파일을 리소스로 포함하고, 런타임에 메모리로 로드하는 방식으로 단일 파일 배포를 지원합니다.

장점

  • 종속성 파일을 포함한 단일 파일 배포가 가능합니다.
  • 단순한 설정으로 쉽게 사용할 수 있습니다.
  • 최신 .NET 플랫폼에서 문제없이 동작합니다.

단점

  • 트랜지티브 종속성이 많을 경우 문제를 일으킬 수 있습니다.
  • 다른 고급 병합 도구에 비해 기능이 제한적일 수 있습니다.