winapp CLI
[!IMPORTANT]
:warning: 상태: Public Preview — Windows App 개발 CLI (winapp CLI)는 실험적이며 활발하게 개발 중입니다. 여러분의 피드백을 환영합니다! issue를 생성하여 의견을 공유해 주세요.
[!NOTE]
main 브랜치에는 활발히 개발 중인 작업 내용이 포함되어 있습니다. 여기에 있는 문서, 기능 및 동작은 공개적으로 출시된 것과 다를 수 있습니다. 최신 안정 버전은 latest release를 참조하세요. 가장 새로운 진행 중인 빌드를 사용하려면 아래의 Install from latest build를 참고하세요.
<p align="center">
<picture>
<img src="https://raw.githubusercontent.com/microsoft/winappCli/HEAD/docs/images/winapp-terminal.png">
</picture>
</p>
<br/>
<p align="center">
<img src="https://img.shields.io/winget/v/Microsoft.WinAppCli?style=for-the-badge&logo=windows&color=357EC7" alt="WinGet">
<a href="https://www.npmjs.com/package/@microsoft/winappcli">
<img src="https://img.shields.io/npm/v/%40microsoft%2Fwinappcli?style=for-the-badge&logo=npm" alt="NPM">
</a>
<a href="https://www.nuget.org/packages/Microsoft.Windows.SDK.BuildTools.WinApp">
<img src="https://img.shields.io/nuget/v/Microsoft.Windows.SDK.BuildTools.WinApp?style=for-the-badge&logo=nuget&label=NuGet&color=004880" alt="NuGet">
</a>
<a href="https://github.com/microsoft/WinAppCli/releases/latest">
<img src="https://img.shields.io/github/v/release/microsoft/WinAppCli?style=for-the-badge&logo=github&label=Latest%20Release&color=8ab4f8" alt="Latest Release">
</a>
<br />
<a href="https://github.com/microsoft/WinAppCli/issues">
<img src="https://img.shields.io/github/issues/microsoft/WinAppCli?style=for-the-badge&logo=github&color=81c995" alt="Issues">
</a>
<a href="https://github.com/microsoft/WinAppCli/blob/main/LICENSE">
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
<img alt="GitHub License" src="https://img.shields.io/github/license/microsoft/winappcli?style=for-the-badge">
</a>
<br />
<a href="https://github.com/microsoft/WinAppCli/actions/workflows/build-package.yml?query=branch%3Amain">
<img src="https://img.shields.io/github/actions/workflow/status/microsoft/WinAppCli/build-package.yml?branch=main&style=for-the-badge&logo=githubactions&logoColor=white&label=Build%20(main)" alt="Build Status">
</a>
</p>
<h3 align="center">
<a href="#-\-why-package-identity">왜 필요한가요?</a>
<span> • </span>
<a href="#%EF%B8%8F-get-started">시작하기</a>
<span> • </span>
<a href="#-\-installation">설치</a>
<span> • </span>
<a href="#-\-usage">사용법</a>
<span> • </span>
<a href="./docs/usage.md">문서</a>
<span> • </span>
<a href="#-\-feedback-and-support">피드백</a>
</h3>
<br/>
Windows App Development CLI (winapp CLI)는 Windows SDK 관리, 패키징, 앱 Identity 생성, 매니페스트(manifest), 인증서(certificate) 생성 및 모든 앱 프레임워크에서 빌드 도구 사용을 위한 단일 명령줄 인터페이스입니다. 이 도구는 크로스 플랫폼 개발과 Windows 네이티브 기능 간의 격차를 해소합니다.
<br/><br/>
.NET/Win32, CMake, Electron 또는 Rust로 구축하든 상관없이, 이 CLI를 통해 다음 기능을 사용할 수 있습니다:
- 최신 Windows API - 자동 설정 및 코드 생성을 지원하는 Windows App SDK 및 Windows SDK
- 패키지 Identity - 스냅(snap) 내에서 전체 패키징 없이 디버깅하고 테스트할 수 있습니다.
- MSIX 패키징 - 서명 및 Store 배포 준비가 된 앱 패키징 기능
- 개발자 도구 - 매니페스트, 인증서, 에셋(assets), 빌드 통합 기능
다음과 같은 경우에 완벽합니다:
- Qt나 Electron 같은 프레임워크를 사용하는 크로스 플랫폼 개발자가 네이티브 Windows 기능을 사용하거나 Windows를 목표로 하는 경우
- 현재 사용하는 도구를 사랑하며 VS Code 또는 다른 편집기에서 Windows 앱을 빌드하고 싶은 개발자
- Windows용 앱 빌드를 자동화하는 CI/CD 파이프라인을 구축하는 개발자
🤔 왜 필요한가?
많은 Windows API는 앱에 패키지 식별자(package identity)를 요구합니다. 이를 통해 여러분은 그렇지 않았다면 접근할 수 없었을 OS 구성 요소 일부를 활용할 수 있게 됩니다. 이 식별자를 사용하면 알림, OS 통합, 온디바이스 AI와 같은 사용자 중심 기능에 접근할 수 있습니다.
우리의 목표는 개발자가 어디에 있든 그들이 이미 사용하는 도구와 프레임워크로 지원하는 것입니다. Windows에서 크로스 플랫폼 앱을 배포한 개발자들의 피드백을 바탕으로, 우리는 이 CLI를 구축하여 Windows 개발 플랫폼과의 통합 과정을 간소화했습니다. SDK 설정, 헤더 생성, 매니페스트(manifest), 인증서, 패키징 등을 단 몇 개의 명령어로 처리할 수 있습니다:
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./docs/images/before-after-winapp-dark.png">
<source media="(prefers-color-scheme: light)" srcset="./docs/images/before-after-winapp.png">
<img src="https://raw.githubusercontent.com/microsoft/winappCli/HEAD/docs/images/before-after-winapp.png" alt="이전: Windows API에 접근하기 위한 12단계 수동 작업. 이후: 4개의 winapp 명령어 (init, create-addon, add-electron-debug-identity, pack)">
</picture>
</p>
<p align="center"><i>winapp CLI가 없으면 프로젝트 설정에 SDK 다운로드, 헤더 생성, 매니페스트 생성 등 12단계의 수동 작업이 필요합니다. 하지만 CLI를 사용하면 단 4개의 명령어로 충분합니다.</i></p>
패키지 식별자와 MSIX 패키징을 통해 얻을 수 있는 몇 가지 예시:
- 인터랙티브 네이티브 알림 및 알림 관리
- Windows Explorer, Taskbar, Share sheet 등 다른 쉘 서피스(shell surfaces)와의 통합
- 프로토콜 핸들러 (
yourapp:// URI)
- 웹-앱 연결(Web-to-app linking):
yoursite.com이 앱을 실행
- 온디바이스 AI (On-device AI): 로컬 LLM, 텍스트 및 이미지 AI API
- AppExecutionAlias를 통한 사용자 지정 CLI 명령어
- 카메라, 마이크, 위치 등 장치에 대한 통제된 접근(사용자 동의 필요)
- 백그라운드 작업(Background tasks): 앱이 종료되었을 때 실행
- 파일 형식 연관 설정(File type associations):
.xyz 파일을 앱으로 열기
- 시작 시 작업(Startup tasks): 사용자가 Windows에 로그인할 때 실행
- 앱 서비스(App services): 다른 앱에 API 노출
- 클린 설치/제거 및 자동 업데이트(Clean install/uninstall & auto-updates): MSIX를 통한 관리
✏️ 시작하기
환경 설정, 매니페스트(manifest) 및 에셋(assets), 인증서 생성 방법, 패키지 식별자(package identity)가 필요한 API 디버깅 방법, 그리고 앱을 MSIX로 패키징하는 방법에 대한 단계별 지침은 '시작하기 가이드'를 확인하세요.
<p>
<a href="./docs/guides/dotnet.md">
<img src="https://img.shields.io/badge/.NET/WPF/WinForms-Get%20Started-512BD4?style=for-the-badge&logo=dotnet&logoColor=white" alt="Get Started with .NET">
</a>
<br />
<a href="./docs/guides/cpp.md">
<img src="https://img.shields.io/badge/C++-Get%20Started-00599C?style=for-the-badge&logo=cplusplus&logoColor=white" alt="Get Started with C++">
</a>
<br />
<a href="/docs/guides/electron/index.md">
<img src="https://img.shields.io/badge/Electron-Get%20Started-47848F?style=for-the-badge&logo=electron&logoColor=white" alt="Get Started with Electron">
</a>
<br />
<a href="./docs/guides/rust.md">
<img src="https://img.shields.io/badge/Rust-Get%20Started-000000?style=for-the-badge&logo=rust&logoColor=white" alt="Get Started with Rust">
</a>
<br />
<a href="/docs/guides/tauri.md">
<img src="https://img.shields.io/badge/Tauri-Get%20Started-FFC131?style=for-the-badge&logo=tauri&logoColor=black" alt="Get Started with Tauri">
</a>
<br />
<a href="./docs/guides/flutter.md">
<img src="https://img.shields.io/badge/Flutter-Get%20Started-02569B?style=for-the-badge&logo=flutter&logoColor=white" alt="Get Started with Flutter">
</a>
<br />
<a href="./docs/guides/maui.md">
<img src="https://img.shields.io/badge/.NET%20MAUI-Get%20Started-512BD4?style=for-the-badge&logo=dotnet&logoColor=white" alt="Get Started with .NET MAUI">
</a>
</p>
추가 가이드:
- EXE/CLI 패키징: 기존 exe/cli를 MSIX로 패키징하는 단계별 가이드
- .NET 파일 기반 앱: 프로젝트 파일이나 매니페스트 없이 단일
.cs 파일을 패키지 식별자로 실행
- MAUI (Windows): 생성된 resizetizer 매니페스트를 사용하여 .NET MAUI Windows 출력을 패키징하고 서명
- Electron JS/TypeScript 바인딩 (npm 전용):
winapp init --add-js-bindings를 통해 자동 생성된 WinRT 바인딩을 활성화합니다. 작업별 가이드를 참조하세요:
📦 설치
WinGet <img src="https://img.shields.io/winget/v/Microsoft.WinAppCli?style=for-the-badge&logo=windows&color=357EC7" alt="WinGet" height="24">
CLI를 사용하는 가장 쉬운 방법은 WinGet (Windows Package Manager)을 이용하는 것입니다. 터미널에서 간단히 다음 명령어를 실행하세요:
winget install Microsoft.winappcli --source winget
또는 PowerShell 터미널을 선호한다면, WinGet PowerShell cmdlet ( Microsoft.WinGet.Client 모듈에서 제공)을 사용할 수 있습니다:
Install-WinGetPackage Microsoft.winappcli
NPM <a href="https://www.npmjs.com/package/@microsoft/winappcli"> <img src="https://img.shields.io/npm/v/%40microsoft%2Fwinappcli?style=for-the-badge&logo=npm" alt="NPM" height="24"></a>
NPM을 통해 Electron 프로젝트용 CLI를 설치할 수 있습니다:
npm install @microsoft/winappcli --save-dev
GitHub Actions / Azure DevOps
GitHub Actions 또는 Azure DevOps의 CI/CD 파이프라인에서는 setup-WinAppCli 액션을 사용하여 CLI를 러너(runners)/에이전트(agents)에 자동으로 설치할 수 있습니다.
릴리스를 수동으로 다운로드하기
GitHub Releases에서 최신 빌드를 다운로드하세요
최신 빌드(main 브랜치)에서 설치하기
[!CAUTION]
이 빌드는 main 브랜치에서 가져온 것이므로, 아직 출시되지 않은 기능, 호환성 문제(breaking changes), 또는 실험적인 기능을 포함할 수 있습니다. 사용은 본인의 책임 하에 진행하십시오.
최신 CI 빌드 아티팩트를 직접 다운로드하세요 (GitHub 로그인 불필요):
| 아티팩트 | 설명 |
|---|
| CLI 바이너리 | 네이티브 CLI 실행 파일 (win-x64, win-arm64) |
| ... | |
<details>
<summary>다운로드 링크가 작동하지 않나요?</summary>
위의 직접 링크는 타사 서비스인 nightly.link에서 제공합니다. 만약 이 링크들이 작동을 멈춘다면, GitHub Actions에서 동일한 아티팩트를 직접 다운로드할 수 있습니다:
- **빌드 및 패키지 워크플로우 실행(Build and Package workflow runs)**로 이동합니다 (
main 브랜치에서 성공한 빌드로 필터링).
- 가장 최근의 워크플로우 실행을 클릭합니다.
- Artifacts 섹션으로 스크롤하여 필요한 것을 다운로드합니다.
참고: GitHub Actions에서 아티팩트를 다운로드하려면 GitHub에 로그인해야 합니다.
</details>
풀 리퀘스트 빌드 시도하기