Velopack을 사용한 C# 데스크탑 앱 빠르게 배포 및 업데이트
다양한 플랫폼에서 데스크톱 애플리케이션을 배포하고 업데이트하는 것은 전통적으로 개발 과정에서 가장 골치 아픈 부분 중 하나였습니다. 하지만 Tim Corey가 그의 비디오 " Velopack을 사용하여 C# 데스크톱 앱을 빠르게 배포 및 업데이트하기 "에서 설명하는 것처럼, 이제 이 과정은 매우 쉬워졌습니다.
Velopack은 패키지 빌드부터 업데이트 적용까지 모든 것을 처리하도록 설계된 훌륭한 도구입니다. 이제 개발자는 복잡한 빌드 파이프라인이나 끝없는 설정 파일 없이 단 하나의 명령 으로 애플리케이션을 생성, 배포 및 유지 관리할 수 있습니다.
이 글에서는 Tim의 32분짜리 튜토리얼 전체를 자세히 살펴보면서 Velopack을 사용하여 표준 C# WPF 앱을 자체 업데이트되는 휴대용 패키지로 만드는 방법을 알아보겠습니다. 또한 네이티브 성능을 유지하면서 자동 마이그레이션, 코드 서명 및 여러 플랫폼에 대한 제로 구성 설정을 어떻게 지원하는지 살펴보겠습니다.
소개: 벨로팩을 선택하는 이유?
Tim은 데스크톱 애플리케이션 배포 및 업데이트가 어렵지 않으며, 오히려 "매우 쉬울 수 있다"고 설명하며 영상을 시작합니다. 이 영상에서 그의 목표는 Velopack을 사용하여 WPF 애플리케이션을 패키징하고, 설치 프로그램을 생성하고, 최소한의 설정으로 자동 업데이트를 활성화함으로써 프로세스를 간소화하는 방법을 보여주는 것입니다.
그는 이것이 WPF에만 국한된 것이 아니며, 동일한 프로세스가 WinForms, 콘솔 앱, 심지어 Java, Rust 또는 C++와 같은 .NET 이외의 소프트웨어에도 적용된다고 강조합니다. Velopack은 거의 모든 언어 또는 프레임워크용 패키지 빌드를 지원하므로 현재 사용 가능한 크로스 플랫폼 애플리케이션용 최고의 설치 프레임워크 중 하나입니다.
WPF 프로젝트 생성
Tim은 Visual Studio 2022에서 DeployDemo라는 이름의 간단한 WPF 프로젝트를 생성하는 것으로 작업을 시작합니다. 이 프로젝트는 .NET 9를 대상으로 하지만, 그가 지적했듯이 .NET 10과 같은 최신 버전에서도 완벽하게 작동합니다.
이번 초기 빌드는 전체 배포 및 업데이트 프로세스를 시연하기 위한 간단한 애플리케이션입니다. 그는 WPF를 사용하지만, Velopack이 크로스 플랫폼 데스크톱 애플리케이션에도 똑같이 잘 작동하므로 모든 유형의 .NET 프로젝트는 물론 비.NET 프로젝트에도 적용할 수 있는 단일 솔루션이라고 강조합니다.
Velopack을 글로벌 도구로 설치하기
다음으로 Tim은 터미널을 열고 다음과 같이 입력합니다.
dotnet tool install -g vpk이 단일 명령으로 Velopack이 시스템에 전역적으로 설치되므로 개발자는 어디에서든 Velopack 명령을 실행할 수 있습니다.
팀은 이 과정을 "비밀 병기"라고 부르는데, 그 이유는 Velopack이 프로젝트의 컴파일러 출력물을 가져와 자체 업데이트되는 이식 가능한 패키지로 변환하기 때문입니다. 이 단계를 통해 앱에 전문적인 설치 프로그램과 자동 업데이트 프레임워크가 하나로 통합됩니다.
그는 명령줄이 설정 과정을 간소화할 뿐만 아니라 CI/CD 파이프라인에 쉽게 통합되어 개발자가 추가 스크립트 없이 패키징, 릴리스 생성 및 배포를 자동화할 수 있다고 설명합니다. 단 하나의 명령으로 자동화할 수 있다는 것은 개발자가 일관된 빌드를 유지하면서 귀중한 시간을 절약할 수 있음을 의미합니다.
Velopack NuGet Install-Package
Tim은 Visual Studio 내부에서 NuGet 패키지 관리를 열고 Velopack 패키지를 설치합니다.
그는 Velopack이 이전에 인기 있었던 설치 프레임워크인 Squirrel의 후속 제품이라고 설명합니다. Squirrel을 사용해 본 경험이 있다면 Velopack을 통해 기존 설정을 자동으로 마이그레이션할 수 있습니다. 이를 통해 안정성이 향상되고 빌드 속도가 크게 빨라지며 플랫폼 간 호환성이 개선됩니다.
Velopack은 Windows, Linux 및 macOS용 데스크톱 설치 프로그램을 제작할 수 있으며 C#, Rust, C++ 및 JavaScript 와 같은 다양한 프로그래밍 언어를 지원합니다. 이는 다양한 플랫폼에서 앱을 배포하기 위한 프레임워크로, 여러 시스템에서 훌륭하게 작동합니다.
팀은 벨로팩이 완전히 무료로 사용할 수 있다는 점을 강조합니다. 구독료나 라이선스 비용이 전혀 없으면서도 상용 솔루션과 견줄 만한 전문적인 설치 프레임워크를 제공합니다.
코드에서 Velopack 초기화하기
App.xaml.cs 파일에서 Tim은 생성자를 추가하고 단 몇 줄의 코드로 Velopack을 초기화합니다.
new VelopackApp()
.Build()
.Run();new VelopackApp()
.Build()
.Run();이 간편한 설정으로 앱은 Velopack의 자동 업데이트 프레임워크에 즉시 연결됩니다. 이 기능은 아직 업데이트를 확인하지는 않지만, 이후 업데이트 및 설치 관리를 시작할 때 Velopack의 성능을 향상시키는 데 필수적인 요소입니다.
팀은 이러한 설정이 간단하지만, 앱이 자동으로 업데이트되어 사용자가 항상 최신 버전을 실행할 수 있도록 보장할 만큼 강력하다고 설명합니다.
사용자 인터페이스 디자인
업데이트에 대해 더 자세히 알아보기 전에 Tim은 기본적인 WPF 인터페이스를 구축합니다. 그는 그리드 레이아웃을 만들고 오른쪽 상단에 업데이트 버튼을 배치합니다.
처음에 잘못된 요소 배치로 인해 오류가 발생하지만, Tim은 이를 통해 시청자들에게 WPF에서 레이아웃 계층 구조가 얼마나 중요한지 상기시킵니다. 수정이 완료되면 설치 가능한 애플리케이션의 인터페이스는 깔끔하고 크기 조절이 가능해지며, Velopack이 WPF와 같은 인기 프레임워크와 얼마나 잘 호환되는지 보여줍니다.
그는 텍스트 상자(mainTextBox)와 제출 버튼(submitButton)이 포함된 StackPanel을 추가합니다. 앱이 실행되면 최소한의 기능만 갖춘 사용자 인터페이스가 표시됩니다. 이 소규모 프로젝트는 나중에 업데이트가 자동으로 적용되는 것을 시연하는 데 사용될 것입니다.
업데이트 버튼 구현하기
이제 팀은 기능적인 측면으로 넘어갑니다. 그는 업데이트 버튼을 두 번 클릭하여 클릭 이벤트를 발생시킵니다. 이것이 자동 업데이트 프레임워크의 핵심이 될 것입니다.
그는 업데이트 확인, 다운로드, 적용의 세 단계로 과정을 나눌 수 있지만, 이번 데모에서는 간소화를 위해 세 단계를 하나로 통합했다고 설명합니다.
업데이트 로직 작성
MainWindow.xaml.cs 파일에서 Tim은 새로운 UpdateManager를 생성하고 업데이트 소스로 사용할 로컬 경로를 지정합니다.
var mgr = new UpdateManager(@"C:\temp\DeployDemoServer");var mgr = new UpdateManager(@"C:\temp\DeployDemoServer");실제 사용 환경에서 이 경로는 외부용 애플리케이션의 HTTPS URL일 수도 있고, 내부 배포를 위한 로컬 파일 공유 경로일 수도 있습니다. Velopack은 복잡한 설정이 필요하지 않으며, 어떤 환경에서도 원활하게 작동합니다.
그런 다음 Tim은 버전 확인 및 업데이트를 처리하기 위해 비동기 코드를 추가합니다.
var newVersion = await mgr.CheckForUpdatesAsync();
if (newVersion == null)
{
MessageBox.Show("You are on the latest version.");
return;
}
await mgr.DownloadUpdatesAsync(newVersion);
await mgr.ApplyUpdatesAndRestartAsync(newVersion);var newVersion = await mgr.CheckForUpdatesAsync();
if (newVersion == null)
{
MessageBox.Show("You are on the latest version.");
return;
}
await mgr.DownloadUpdatesAsync(newVersion);
await mgr.ApplyUpdatesAndRestartAsync(newVersion);이 코드는 최신 버전을 확인하고, 델타 패키지를 다운로드한 후 즉시 적용합니다. Velopack이 모든 것을 처리해 줍니다. 업데이트가 완료되면 앱이 자동으로 다시 시작됩니다.
그는 이 데모에서는 버튼 클릭을 사용하지만, 개발자는 전문 소프트웨어처럼 시작 시 자동으로 또는 조용히 이러한 업데이트를 실행할 수도 있다고 설명합니다.
애플리케이션 게시
다음으로 Tim은 첫 번째 버전을 게시하는 방법을 보여줍니다. 그는 프로젝트 폴더 안의 터미널을 사용하여 다음 명령어를 실행합니다.
dotnet publish --self-contained -r win-x64 -o ./publish이렇게 하면 .NET 런타임이 포함된 자체 포함 빌드가 생성됩니다. 즉, 최종 사용자의 컴퓨터에서 .NET 별도로 설치할 필요 없이 애플리케이션이 실행됩니다.
팀은 컴파일된 결과물인 DeployDemo.exe 파일을 게시 디렉터리에 보여주며 정상적으로 실행됨을 확인시켜 줍니다. 현재로서는 단순히 컴파일된 결과물일 뿐이며, 아직 설치 가능한 패키지 버전은 아닙니다.
설치 패키지 생성
Tim은 게시된 파일을 배포 가능한 설치 프로그램으로 변환하기 위해 Velopack의 pack 명령어를 사용합니다.
vpk pack --pack-id DeployDemo --pack-version 1.0.0 --pack-directory ./publish이렇게 하면 설치 실행 파일을 포함하여 필요한 모든 파일이 들어 있는 Releases 폴더가 생성됩니다.
팀은 릴리스 파일을 로컬 "서버" 폴더에 복사합니다. 생성된 설치 파일을 실행하면 앱이 완전히 설치됩니다. 바로가기가 생성되고, 프로그램 및 기능 목록에 항목이 추가되며, 추가 권한이나 UAC 프롬프트 없이 네이티브 설치 환경을 제공합니다.
이제 이 앱은 Velopack에서 제공하는 공식 설치형 애플리케이션입니다.
애플리케이션 업데이트
업데이트를 시뮬레이션하기 위해 Tim은 제출 버튼의 코드를 수정합니다.
MessageBox.Show($"Hello {mainTextBox.Text}");MessageBox.Show($"Hello {mainTextBox.Text}");그는 동일한 게시 및 패키징 명령을 반복하되 버전 번호를 업데이트하여 앱을 다시 패키징합니다.
vpk pack --pack-id DeployDemo --pack-version 1.0.1 --pack-directory ./publishVelopack은 기존 사용자를 위한 델타 패키지(작은 차이점 파일)와 신규 설치를 위한 전체 패키지를 자동으로 생성합니다. Tim은 전체 패키지 크기가 약 63MB인 반면, 델타 패키지는 132KB에 불과하다는 점을 지적하며, 이는 Velopack이 다른 도구나 설치 프레임워크보다 훨씬 빠르고 효율적이라는 증거라고 말합니다.
그는 새 릴리스를 서버 폴더에 복사하여 사실상 버전 1.0.1의 릴리스를 생성합니다.
업데이트 적용
팀은 설치된 애플리케이션을 다시 열고 업데이트 버튼을 클릭합니다. Velopack은 몇 초 만에 1.0.1 업데이트를 다운로드하고 적용한 후 앱을 자동으로 다시 시작합니다.
그가 자신의 이름을 입력하고 제출 버튼을 누르면 이제 "안녕하세요, 팀"이라고 표시됩니다. 업데이트 프레임워크는 놀라울 정도로 빠르게 작동했으며, 이는 Velopack이 쉽게 통합되고 전체 업데이트 주기를 완벽하게 처리한다는 것을 입증합니다.
그는 개발자들이 이러한 릴리스를 Azure, 파일 저장소 또는 웹 저장소에 호스팅할 수 있으며, 동일한 자동 업데이트 로직이 Windows, Linux 또는 macOS에서 계속 작동할 것이라고 지적합니다.
간편한 유지보수 및 유연성
팀은 이 과정을 통해 데스크톱 앱 유지 관리가 매우 쉬워진다는 점을 강조합니다. 개발자는 최소한의 설정과 외부 종속성 없이 완전한 자동 업데이트 기능을 갖춘 내부 도구 또는 공개 소프트웨어를 배포할 수 있습니다.
Velopack은 .NET 개발자에게 친숙한 API를 제공하며 모든 단계를 처리합니다.
빌드 게시
패키지 구성
릴리스 생성
업데이트 적용
- 깔끔하게 제거하기
이 모든 것은 복잡한 빌드 파이프라인이나 심층적인 설정 파일 없이 이루어집니다.
팀은 벨로팩을 개발자들이 귀중한 시간을 절약하면서 세련되고 전문적인 소프트웨어를 제공하는 데 도움이 되는 훌륭한 도구라고 평가합니다. 이는 "그냥 작동하는" 크로스 플랫폼 업데이트 프레임워크입니다.
제거 및 버전 추적
Tim은 설치된 앱이 Windows의 "프로그램 제거 또는 변경" 목록에 버전 1.0.1로 표시되는 것을 보여줍니다. 제거 과정은 매우 간단합니다. Velopack은 해당 폴더를 삭제하기만 하면 되므로 아무런 흔적도 남기지 않습니다.
그는 Velopack이 WPF뿐만 아니라 WinForms, UNO 플랫폼, 심지어 구형 .NET Framework 4.6.2 프로젝트에서도 훌륭하게 작동한다고 덧붙였습니다. 또한 Rust나 JavaScript 와 같은 다른 인기 있는 프레임워크 및 언어와도 호환되므로 크로스 플랫폼 설치 프로그램에 적합한 범용 솔루션입니다.
결론
마지막으로 팀은 벨로팩의 성과에 매우 깊은 인상을 받았다고 밝혔습니다. 개발자는 도구를 설치하고, 코드 한 줄을 추가하고, 두 개의 명령을 실행하는 몇 단계만으로 일반 .NET 프로젝트를 완벽하게 설치 가능하고 자체 업데이트되는 크로스 플랫폼 애플리케이션으로 전환할 수 있습니다.
그는 벨로팩 개발자들이 이처럼 훌륭한 엔지니어링 결과물을 만들어낸 것에 대해 진심으로 감사를 표하며, 벨로팩을 오늘날 사용 가능한 크로스 플랫폼 데스크톱 애플리케이션용 최고의 설치 및 업데이트 프레임워크라고 칭했습니다.
팀은 마지막으로 모든 세부 정보, 명령어 및 소스 코드가 영상 설명란에 있다는 점을 시청자들에게 다시 한번 상기시킵니다. 그는 개발자들이 공개 저장소를 통해 아이디어를 논의하고, 기능을 요청하고, 프로젝트의 미래에 기여하도록 장려합니다.

