0Pricing
Learn Rust Coding · 강의

데스크톱 앱 패키징하기

실행 가능한 바이너리를 배포해 보세요.

데스크톱 앱 패키징하기은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.

디버그에서 릴리스로

개발할 때는 최적화되지 않은 디버그 바이너리를 빌드하는 cargo run을 사용합니다. 배포할 때는 릴리스 빌드인 cargo build --release를 사용합니다.

릴리스 빌드는 최적화를 활성화하고 디버그 오버헤드를 제거하므로 훨씬 작고 빠른 바이너리를 생성합니다. 결과물은 target/release/ 아래에 저장됩니다.

cargo build --release
# binary at target/release/my_app

바이너리 크기 줄이기

egui 애플리케이션은 GPU 백엔드를 정적으로 연결하기 때문에 클 수 있습니다. Cargo.toml에서 릴리스 프로필을 설정해 크기를 줄이세요.

링크 시간 최적화, 단일 코드 생성 단위, 패닉 중단, 기호 제거를 활성화하면 최종 실행 파일의 크기를 수 메가바이트까지 줄일 수 있습니다.

[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = true

Windows에서 콘솔 숨기기

Windows에서는 GUI 앱이 콘솔 창을 생성하지 않아야 합니다. 크레이트 루트에 windows_subsystem 특성을 추가하고 릴리스 빌드에서만 활성화하면, 개발 중에는 로그를 계속 확인할 수 있습니다.

이렇게 하지 않으면 실행 파일을 두 번 클릭할 때 창과 함께 검은색 터미널이 잠시 나타납니다.

#![cfg_attr(
    not(debug_assertions),
    windows_subsystem = "windows"
)]

fn main() -> eframe::Result<()> { /* ... */ }

창 아이콘 설정하기

완성도 높은 앱은 자체 창 아이콘을 설정합니다. 시작할 때 PNG 바이트를 로드하고 RGBA로 디코딩한 다음, IconData를 NativeOptions를 통해 전달합니다.

include_bytes!로 이미지를 포함하면 아이콘이 별도의 파일이 아니라 바이너리 내부에 함께 배포됩니다.

let icon = eframe::icon_data::from_png_bytes(
    include_bytes!("../assets/icon.png")
).unwrap();
let opts = eframe::NativeOptions {
    viewport: egui::ViewportBuilder::default().with_icon(icon),
    ..Default::default()
};

Viewport 구성하기

ViewportBuilder는 기본 창의 초기 크기, 최소 크기, 제목, 크기 조절 가능 여부, 장식을 제어합니다.

처음 실행할 때 앱이 너무 작거나 크게 열린 대신 사용하기 적절한 크기로 열리도록 합리적인 기본값을 설정하십시오.

let viewport = egui::ViewportBuilder::default()
    .with_inner_size([900.0, 600.0])
    .with_min_inner_size([400.0, 300.0])
    .with_title("My App");
let opts = eframe::NativeOptions { viewport, ..Default::default() };

리소스 포함하기

단일 파일로 배포하려면 include_bytes!와 include_str!을 사용하여 글꼴, 이미지, 설정을 바이너리에 직접 포함하십시오.

이렇게 하면 리소스 폴더를 별도로 배포하지 않아도 되고, 작업 디렉터리가 달라져도 앱이 중단되지 않습니다.

let font = egui::FontData::from_static(
    include_bytes!("../assets/Inter.ttf")
);
// register font in ctx.set_fonts(...)

macOS 앱 번들

macOS에서는 단순한 바이너리만으로는 클릭해서 실행할 수 있는 앱이 되지 않습니다. Info.plist와 .icns 아이콘이 포함된 .app 번들이 필요합니다.

cargo-bundle 도구를 사용하면 이 과정을 자동화할 수 있습니다. 이 도구는 Cargo.toml의 [package.metadata.bundle] 섹션에서 메타데이터를 읽습니다.

[package.metadata.bundle]
name = "My App"
identifier = "com.example.myapp"
icon = ["assets/icon.icns"]
# then: cargo bundle --release

코드 서명과 공증

macOS에서 다른 컴퓨터로 배포하려면 Developer ID 인증서로 서명하고 Apple의 공증을 받아야 합니다. 그렇지 않으면 Gatekeeper가 앱을 차단합니다.

codesign으로 번들에 서명한 다음 notarytool로 제출하고 티켓을 스테이플링하십시오. Windows에서도 Authenticode 서명을 사용하면 SmartScreen 경고를 피하는 데 도움이 됩니다.

codesign --deep --force --options runtime \
  --sign "Developer ID Application: Name (TEAMID)" \
  MyApp.app

여러 플랫폼용 빌드

eframe은 플랫폼별 GPU 및 창 관리 라이브러리에 연결되므로 각 OS에 맞는 네이티브 빌드가 필요합니다. 가장 안정적인 방법은 각 대상 OS에서 빌드하는 것이며, 대개 CI 실행기를 사용합니다.

cross 같은 도구는 Linux 대상을 빌드하는 데 도움이 되지만, Linux에서 macOS나 Windows용 GUI 바이너리를 완전히 교차 컴파일하는 작업은 불안정합니다. 대신 행렬 CI 빌드를 사용하십시오.

# GitHub Actions matrix
# runs-on: [ubuntu-latest, macos-latest, windows-latest]
cargo build --release

웹 대상

egui는 WebAssembly로도 컴파일할 수 있습니다. wasm32-unknown-unknown 대상을 사용하여 빌드하고 trunk로 번들링하면, 정적으로 호스팅할 수 있는 HTML/JS/WASM 묶음이 생성됩니다.

동일한 App 코드는 브라우저에서 eframe::WebRunner를 통해 캔버스 요소에 마운트되어 실행됩니다.

rustup target add wasm32-unknown-unknown
trunk build --release
# outputs dist/ ready to host

배포 점검 목록

배포하기 전에 릴리스 프로필을 조정하여 크기를 줄이고, Windows 콘솔을 숨기며, 아이콘과 리소스를 포함하고, macOS용으로 번들링한 뒤 macOS와 Windows 모두에 서명하십시오.

최종 산출물은 개발 컴퓨터가 아닌 깨끗한 컴퓨터에서 테스트하십시오. 그래야 실제 사용자가 겪을 수 있는 누락된 시스템 라이브러리나 서명되지 않은 바이너리 경고를 발견할 수 있습니다.

빠른 확인

windows_subsystem 특성을 추가하는 이유는 무엇인가요?

복습

cargo build --release로 배포용 빌드를 만든 다음, 릴리스 프로필을 최적화하여 크기를 줄이고 Windows 콘솔을 숨기십시오. 창 아이콘과 viewport를 설정하고 include_bytes!로 리소스를 포함하여 자체 완결형 바이너리를 만드십시오.

macOS에서는 cargo-bundle로 번들링하고 서명 및 공증을 진행하십시오. 여러 플랫폼을 지원하려면 CI에서 OS별로 빌드하고, WebAssembly 대상은 trunk를 사용하십시오. 최종 산출물은 항상 깨끗한 컴퓨터에서 테스트하십시오. 이것으로 egui 과정이 끝났습니다.

자주 묻는 질문

“데스크톱 앱 패키징하기” 강의는 무료인가요?

네 — “데스크톱 앱 패키징하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.

“데스크톱 앱 패키징하기”에서 뭘 배우나요?

실행 가능한 바이너리를 배포해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“데스크톱 앱 패키징하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 즉시 모드 UI 기초
  2. 위젯과 레이아웃
  3. 앱 상태 관리하기
  4. 데스크톱 앱 패키징하기
← Learn Rust Coding(으)로 돌아가기