셸 완성
명령, 옵션 및 값에 대해 탭 완성을 사용하도록 설정합니다. 설치 지침은 셸 완성 가이드 를 참조하세요.
# Quick setup for PowerShell (permanent — add to profile)
winapp complete --setup powershell >> $PROFILE
# Or try it in the current session only
winapp complete --setup powershell | Out-String | Invoke-Expression
초기화 (init)
최신 Windows 개발을 위해 Windows SDK, Windows 앱 SDK 및 필수 자산을 사용하여 디렉터리를 초기화합니다.
winapp init [base-directory] [options]
인수:
-
base-directory- 앱/작업 영역의 기본/루트 디렉터리(기본값: 현재 디렉터리)
옵션:
-
--config-dir <path>- 읽기/저장 구성을 위한 디렉터리(기본값: 현재 디렉터리) -
--setup-sdks- SDK 설치 모드: 'stable'(기본값), '미리 보기', '실험적' 또는 '없음'(SDK 설치 건너뛰기) -
--ignore-config,--no-config- 버전 관리에 구성 파일을 사용하지 마세요. -
--no-gitignore- .gitignore 파일을 업데이트하지 않음 -
--use-defaults,--no-prompt- 프롬프트를 표시하지 않고 모든 프롬프트의 기본값을 사용합니다. -
--config-only- 구성 파일 작업만 처리하고 패키지 설치를 건너뜁니다. -
--exe <path>- 애플리케이션 실행 파일의 경로입니다.--sparse가 필요합니다. 전체 패키지/SDK 설정 대신 exe에 대한 ID 전용 스파스 매니페스트를 생성합니다. -
--sparse- 기존 데스크톱 exe에 대한 스파스 ID 매니페스트(appxmanifest.xml)를 생성합니다. SDK/패키지 설치를 건너뜁니다.--exe를 사용합니다. -
--name <name>- 패키지 이름 재정의(스파스만, 기본값: exe에서 유추됨) -
--publisher <CN>- 게시자 CN 재정의(스파스만 해당, 기본값: exe의 회사 이름에서 유추됨) -
--output-dir <path>- 스파스 매니페스트를 작성하는 디렉터리(Assets/스파스만 해당, 기본값:sparse/현재 디렉터리의 폴더) -
--force- 대상 디렉터리에 있는 기존appxmanifest.xml항목을 덮어씁니다(스파스만 해당). 이 항목이 없으면 기존 매니페스트/자산을 바꾸는 대신 init가 실패합니다. -
--add-js-bindings(npm에만 해당) - 메시지를 표시하지 않고 package.json 추가하고winapp.jsBindingsJS/TypeScript 바인딩을 생성합니다(호환되지 않음--setup-sdks none).
기능 설명:
- 구성 파일을 만듭니다
winapp.yaml(SDK 패키지가 관리되고 건너뛰는--setup-sdks none경우에만) - Windows SDK 및 Windows 앱 SDK 패키지 다운로드
- C++/WinRT 헤더 및 이진 파일을 생성합니다.
- Package.appxmanifest를 만듭니다.
- 빌드 도구 설정 및 개발자 모드 사용
- 생성된 파일을 제외하도록 .gitignore를 업데이트합니다.
- 공유 가능한 파일을 전역 캐시 디렉터리에 저장합니다.
- 사용하도록 설정된 경우 Windows 앱 SDK API에 대한 JS 바인딩을 생성합니다(npm만 해당).
자동 프로젝트 검색:
디렉터리 인수 없이 실행되는 경우 init 현재 디렉터리 트리의 폭 우선 검색을 수행하여 호환되는 프로젝트(최대 10개)를 찾습니다. 지원되는 프로젝트 유형:
-
Tauri —
tauri.conf.json디렉터리 아래의 한 수준 발견 -
전자 -
package.jsonelectron종속성 또는 devDependencies 사용 -
Flutter -
pubspec.yaml프로젝트 루트 -
.NET —
.csproj프로젝트 루트 -
Rust -
Cargo.toml프로젝트 루트 -
C++ -
CMakeLists.txt프로젝트 루트
검색은 일반적으로 무시되는 디렉터리(node_modules, bin, obj, .git 등)를 건너뜁니다. 호환되는 프로젝트가 발견되면 아래의 하위 디렉터리가 검색되지 않습니다.
- 디렉터리 인수가 제공된 경우(예:
winapp init .또는winapp init path/to/project) 검색을 건너뛰고init해당 디렉터리에서 호환되는 프로젝트만 확인합니다. - (또는
--use-defaults)가 디렉터리 인수--no-prompt없이 설정된 경우init검색을 건너뛰고 현재 디렉터리를 비대화형으로 초기화합니다. 알려진 프로젝트 형식이 검색되지 않은 경우 먼저 경고합니다(예:winapp init --use-defaults). - 비대화형 환경(파이프된 stdin, CI, 리디렉션된 입력)
init에서 자동으로 동작을 사용하고--use-defaults경고를 내보냅니다.Non-interactive environment detected. Using default values. - 현재 디렉터리가 호환되는 프로젝트
init인 경우 즉시 진행합니다. - 정확히 하나의 프로젝트가 다른 곳에서 발견되면 확인하라는 메시지가 표시됩니다.
- 여러 프로젝트가 발견되면 초기화할 프로젝트를 선택할 수 있습니다. 현재 디렉터리를 항상 대체 옵션으로 사용할 수 있습니다.
- 프로젝트를 찾을 수 없으면 경고를 받고 계속 진행할지 묻는 메시지가 표시됩니다.
- 검색이 10 프로젝트 제한에 도달하면 디렉터리 인수 제공을 제안하는 경고가 표시됩니다.
자동 .NET 프로젝트 흐름:
대상 디렉터리에 .csproj 파일이 있으면 init 간소화된 .NET 관련 흐름을 사용합니다.
-
TargetFramework유효성을 검사하고 Windows 호환되는 TFM(예:net10.0-windows10.0.26100.0)으로 업데이트합니다. -
Microsoft.WindowsAppSDK와Microsoft.Windows.SDK.BuildTools를PackageReference내에서 NuGet.csproj항목으로 직접 추가합니다. -
Package.appxmanifest, 자산 및 개발 인증서 생성 - C++ 프로젝션을 생성하지 않거나 다운로드
winapp.yaml않습니다 (NuGet 패키지에dotnet restore사용).
스파스 ID 모드(--exe + --sparse):
스파스 패키징 워크플로의 첫 번째 단계인 기존 데스크톱 실행 파일에 대한 ID 전용 스파스 패키지 매니페스트를 생성합니다. 전체 init 흐름과 달리 모든 SDK/패키지 설치 (스파스 ID 패키지에는 SDK 종속성이 없음)를 건너뛰고 매니페스트 및 자리 표시자 자산만 생성합니다.
- exe
FileVersionInfo에서 패키지 이름, 게시자, 설명 및 버전을 유추합니다(또는 대화형으로--name--publisher재정의). -
appxmanifest.xml현재 디렉터리의 폴더(또는--output-dir)에Executable폴더를 더한sparse/쓰기(exe 이름이 대체됨)Assets/ - 대화형 재정의 프롬프트를 건너뛰는 데 사용
--use-defaults/--no-prompt(CI 친화적) -
--exe오류가 없으면--sparse
자산은 외부에 있습니다. 스파스는
.msixID 전용입니다. 생성된Assets/내용은 런타임에 앱의 설치 디렉터리(외부 콘텐츠 위치)에서 확인되며 번들로 묶.msix이지 않습니다. 애플리케이션과 함께 배포합니다.
다음 단계: winapp init --exe <exe> --sparsewinapp pack <appxmanifest.xml> ID.msix를 빌드하려면 .winapp embed-identity <exe> 전체 연습 은 스파스 패키징 가이드 를 참조하세요.
예:
# Initialize current directory
winapp init
# Initialize with experimental packages
winapp init --setup-sdks experimental
# Initialize specific directory without prompts
winapp init ./my-project --use-defaults
# Initialize a .NET project (auto-detected from .csproj)
cd my-dotnet-app
winapp init
# Generate a sparse identity manifest for an existing exe (no SDK install)
winapp init --exe ./bin/Release/net8.0-windows/MyApp.exe --sparse --use-defaults
팁: 초기 설정 후 SDK 설치
SDK 설치를 건너 init--setup-sdks none 뛰고 나중에 SDK가 필요한 경우:
# Re-run init to install SDKs - preserves existing files (manifest, etc.)
winapp init . --use-defaults --setup-sdks stable
미리 보기/실험적 SDK 버전을 사용 --setup-sdks preview 하거나 --setup-sdks experimental 사용합니다.
새로운
공식 Windows 앱 SDK dotnet new 템플릿에서 새 WinUI 앱을 만듭니다. 기본적으로 대화형; 는 비대화형 환경에서 기본값을 자동으로 사용합니다.
winapp new [options]
옵션:
-
-t, --template <short-name>- 템플릿의 짧은 이름(예:winui, ,winui-navviewwinui-mvvm,winui-libwinui-unittest). 런타임에 설치된 팩에 대해 유효성을 검사합니다. 실행winapp new --list하면 모든 항목이 표시됩니다. 기본값:winui(빈 앱). -
-n, --name <name>- 새 앱/프로젝트의 이름(기본값: 파생됨--output, 기타WinUIApp) -
-o, --output <path>- 앱을 만드는 디렉터리(기본값:./<name>) -
--use-defaults,--no-prompt- 프롬프트를 표시하지 마세요. 기본값을 사용합니다(빈 템플릿, 이름 및--output/--name설치된 템플릿 팩을 업데이트하는 대신 유지) -
--force- 출력 디렉터리에 파일이 이미 포함된 경우에도 스캐폴드 -
--template-version <latest|installed|version>- WinUI 템플릿 팩 버전:latest최신 게시된 팩을 설치하거나,installed이미 다운로드한 항목(네트워크 없음)을 유지하거나, 명시적 버전(예:1.2.3.)을 고정합니다. 기본값: 팩이 없을 때 최신 버전을 설치합니다. 그렇지 않으면 부실 팩을 업데이트하라는 메시지가 표시됩니다(as-is 유지--use-defaults됨). -
--list- 사용 가능한 WinUI 템플릿을 나열하고 종료합니다(설치되지 않은 경우 먼저 최신 팩 설치) -
--json- 출력을 JSON으로 서식 지정
템플릿:
템플릿 목록은 설치된 팩에서 실시간으로 읽혀지므로 항상 사용 중인 버전을 반영합니다. 현재 집합을 보려면 실행 winapp new --list 합니다. 일반적인 템플릿:
| 짧은 이름 | 설명 |
|---|---|
winui |
빈 WinUI 3 앱 최소(MSIX 패키징) |
winui-navview |
NavigationView 시작 앱 |
winui-tabview |
TabView 시작 앱 |
winui-mvvm |
MVVM 앱(CommunityToolkit.Mvvm) |
winui-lib |
WinUI 3 클래스 라이브러리 |
winui-unittest |
패키지된 MSTest 앱; 테스트가 시작될 때 실행됨 |
각 템플릿의 정식 짧은 이름은 첫 번째 별칭 dotnet new 목록입니다. 나열된 별칭(예: winui3) wasdk-single도 허용됩니다. 기존 WinUI 프로젝트 내에서 실행하는 경우 새 프로젝트를 만드는 대신 현재 프로젝트에 dotnet new 추가되는 winapp new항목 템플릿(예: 빈 페이지)도 표시합니다.
템플릿 팩 버전 관리:
winapp new 더 이상 특정 템플릿 팩 버전을 고정하지 않습니다. 설치된 팩이 없으면 최신 팩을 설치합니다. 이전 팩이 이미 설치된 경우 피드를 확인하고, 최신 팩이 있는 경우 비대화형/--use-defaults실행을 제외하고 업데이트할지 여부를 묻는 메시지를 표시합니다. 이 팩은 설치된 팩을 유지합니다. 항상 프롬프트 없이 최신 항목을 사용하거나 --template-version installed 네트워크 검사 없이 다운로드한 팩을 항상 사용하는 데 사용합니다--template-version latest.
명시적 버전(예: --template-version 1.2.3)을 전달하면 항상 해당 버전이 정확하게 설치되므로 최신 팩이 이미 있는 경우에도 다시 설치되므로 머신 간에 스캐폴딩을 재현할 수 있습니다.
기능 설명:
- SDK가 설치된 .NET 확인합니다(누락된 경우 지침에 따라 빠르게 실패함 -
winapp도구 체인을 설치하지 않음) - 요청 시 공식 WinUI 템플릿 팩(
Microsoft.WindowsAppSDK.WinUI.CSharp.Templates)을 설치하거나 업데이트합니다. - 설치된 팩에서 사용 가능한 템플릿을 열거하고 스캐폴딩을 위임합니다.
dotnet new <short-name>
WinUI 앱 템플릿에는 이미 Windows 패키징 및 ID(Package.appxmanifest)가 포함되어 있으므로 별도의 winapp init 단계가 필요하지 않습니다. 앱 템플릿의 경우 앱을 빌드하고 시작하는 데 사용합니다 winapp run . 템플릿은 winui-lib 앱 프로젝트에서 참조할 클래스 라이브러리를 생성합니다(앱 매니페스트가 없음). 템플릿은 winui-unittest패키지된 MSTest 앱으로, 앱을 시작할 때 테스트가 실행됩니다 (winapp run을 통해 dotnet test서가 아님).
winapp new설치된 .NET SDK의 대상 프레임워크에 대해 스캐폴딩하고 선택한 템플릿에 적합한 다음 단계를 인쇄합니다.
템플릿 팩 또는 스캐폴딩 문제를 진단하는 dotnet 데 유용한 전체 출력과 함께 모든 기본 호출(팩 쿼리, 업데이트 검사, 설치, dotnet new list스캐폴드)을 에코하도록 전역 --verbose (-v) 플래그를 전달합니다.
예:
# Interactive: pick a template, then a name (output defaults to ./<name>)
winapp new
# List the available templates without scaffolding
winapp new --list
# One-shot with a specific template
winapp new --name MyApp --template winui-navview
# Always use the newest template pack, no prompts
winapp new --name MyApp --template-version latest --use-defaults
# Show the underlying dotnet commands and their output
winapp new --name MyApp --verbose
# Non-interactive (agent) with machine-readable output
winapp new --use-defaults --name MyApp --json
복원
패키지를 복원하고 기존 구성에 따라 파일을 다시 생성합니다 winapp.yaml .
winapp restore [options]
옵션:
-
--config-dir <path>- winapp.yaml을 포함하는 디렉터리(기본값: 현재 디렉터리)
기능 설명:
- 기존 구성을 읽습니다.
winapp.yaml - SDK 패키지를 지정된 버전으로 다운로드/업데이트
- C++/WinRT 헤더 및 이진 파일을 다시 생성합니다.
- 공유 가능한 파일을 전역 캐시 디렉터리에 저장합니다.
비고
winapp init 사용하여 초기화된 .NET 프로젝트의 경우 winapp.yaml 없습니다. 대신 NuGet 패키지를 복원하는 데 사용합니다 dotnet restore .
예:
# Restore from winapp.yaml in current directory
winapp restore
업데이트
패키지를 최신 버전으로 업데이트하고 구성 파일을 업데이트합니다.
winapp update [options]
옵션:
-
--setup-sdks <stable|preview|experimental|none>- SDK 설치 모드:stable(기본값),preview또는experimentalnone(SDK 설치 건너뛰기)
기능 설명:
- 현재 디렉터리에서 기존
winapp.yaml구성을 읽습니다. - 모든 패키지를 사용 가능한 최신 버전으로 업데이트합니다.
-
winapp.yaml파일을 새 버전 번호로 업데이트합니다. - C++/WinRT 헤더 및 이진 파일을 다시 생성합니다.
예:
# Update packages to latest versions
winapp update
# Update including experimental packages
winapp update --setup-sdks experimental
pack
준비된 애플리케이션 디렉터리에서 MSIX 패키지를 만듭니다. 매니페스트 파일(Package.appxmanifest 기본 설정, appxmanifest.xml 지원됨)이 대상 디렉터리, 현재 디렉터리 또는 옵션과 함께 --manifest 전달되어야 합니다. (매니페스트를 실행 init 하거나 manifest generate 만들려면)
여러 입력 폴더를 전달하여 다중 아키텍처 배포를 만듭니 .msixbundle 다(아래 다중 아키텍처 번들 참조).
winapp pack <input-folder> [input-folder...] [options]
인수:
-
input-folder- 패키지할 애플리케이션 파일을 포함하는 하나 이상의 디렉터리입니다. 여러 폴더(예:./publish/x64 ./publish/arm64)를 전달하여 MSIX 번들을 만듭니다. 스파스 ID 패키지의 경우 폴더 대신 스파스appxmanifest.xml파일을 직접 전달합니다(아래 스파스 ID 패키지 참조).
옵션:
-
--output <filename>- 출력 파일 이름입니다. 단일 패키지의 경우:<name>_<version>_<arch>.msix(또는 )로<name>_<version>.msix<name>_<arch>.msix<name>.msix대체합니다. 번들의 경우:<name>_<version>_<arch1>_<arch2>.msixbundle. -
--name <name>- 패키지 이름(기본값: 매니페스트에서) -
--manifest <path>- 매니페스트 파일 경로(Package.appxmanifest기본 설정,appxmanifest.xml지원됨, 기본값: 자동 검색) -
--cert <path>- 서명 인증서 경로(자동 서명 사용) -
--cert-password <password>- 인증서 암호(기본값: "암호") -
--generate-cert- 새 개발 인증서 생성 -
--install-cert- 컴퓨터에 인증서 설치 -
--publisher <name>- 인증서 생성을 위한 Publisher. 전체 X.500 고유 이름 또는 맨 이름(자동으로 로CN=<name>래핑됨)을 허용합니다. -
--self-contained- 번들 Windows 앱 SDK 런타임 -
--skip-pri- PRI 파일 생성 건너뛰기 -
--executable <path>- 입력 폴더(또한--exe)를 기준으로 실행 파일의 경로입니다. 매니페스트의 자리 표시자를 해결하는$targetnametoken$데 사용됩니다.
기능 설명:
- Package.appxmanifest 파일의 유효성을 검사하고 처리합니다.
- 매니페스트에서 토큰을 확인합니다
$placeholder$(아래 매니페스트 자리 표시자 참조). - 적절한 프레임워크 종속성을 보장합니다.
- 나란히 배치된 매니페스트를 등록과 함께 업데이트합니다.
- 매니페스트 디렉터리 또는 입력 폴더에서 매니페스트에서 참조되는 이미지가 아닌 파일(예: AppExtension
manifest.json, 구성 파일)을 스테이징에서 누락된 경우 자동으로 검색하고 번들로 묶습니다. - 타사 WinRT 구성 요소를 자동으로 검색하고 활성화 가능한 클래스를 등록합니다(아래 WinRT 구성 요소 검색 참조).
- 자체 포함된 WinAppSDK 배포 처리
- 인증서가 제공된 경우 패키지 서명
스파스 ID 패키지
입력이 폴더 winapp pack 가 아닌 스파스 appxmanifest.xml 파일(아래 <Properties>선언<uap10:AllowExternalContent>true</uap10:AllowExternalContent>)인 경우 ID 전용.msix을 빌드합니다. 애플리케이션 이진 파일이나 자산이 없는 매니페스트만 패키지합니다. 스파 스 패키징 워크플로의 2단계입니다.
# Build a signed identity package from a sparse manifest
winapp pack ./sparse/appxmanifest.xml --cert ./devcert.pfx
- 출력은
<PackageName>.identity.msix기본적으로 현재 디렉터리(재정의)--output로 설정됩니다. - 서명은 (또는
--generate-cert) 제공된 경우에만--cert발생합니다. - 대신 매니페스트가 선언
AllowExternalContent된 폴더를 전달하는 경우 기존 폴더 패키징 동작이 적용되지만winapp pack자산() 또는 이진 파일(///.so.jpg.png.exe.dll.ico/)을 찾으면 경고합니다. 스파스 패키지는 내부.msix가 아닌 외부 위치에 속합니다.
압축 후 설치 관리자Add-AppxPackage -Path <msix> -ExternalLocation <install-dir>에서 패키지를 실행하고 winapp embed-identity <exe> 등록합니다.
스파스 패키징 가이드를 참조하세요.
WinRT 구성 요소 검색
패키징할 winapp pack 때 타 winapp.yaml 사 WinRT 구성 요소(예: Win2D)에 정의된 *.csproj NuGet 패키지를 자동으로 검색합니다. 파일을 구문 분석 .winmd 하여 활성화 가능한 클래스 이름을 추출하고 구현 DLL을 찾습니다. 검색된 항목은 다음과 같이 등록됩니다.
-
프레임워크 종속 (기본값): 활성화 가능한 클래스는 에 항목으로
<InProcessServer>추가됩니다.Package.appxmanifest -
자체 포함 (
--self-contained): 활성화 가능한 클래스는 실행 파일 내의 SxS(Side-by-Side) 매니페스트에 포함됩니다.
패키징 중 자리 표시자 확인:
매니페스트가 특성에 $targetnametoken$ 포함된 Executable 경우:
- 제공된 경우
--executable(입력 폴더에 상대적인 경로) 자리 표시자가 지정된 값으로 대체됩니다. - 그렇지 않으면
winapp pack입력 폴더 루트에서.exe파일을 검색합니다. 정확히 하나가 발견되면 자동으로 사용됩니다. - 파일이 0개 또는 여러
.exe개 있으면 지정하라는 오류가 표시됩니다.--executable
예:
# Package directory with auto-detected manifest
winapp pack ./dist
# Package with custom output name and certificate
winapp pack ./dist --output MyApp.msix --cert ./cert.pfx
# Package with generated and installed certificate and self-contained WinAppSDK runtime
winapp pack ./dist --generate-cert --install-cert --self-contained
# Package with explicit executable (resolves $targetnametoken$ in manifest)
winapp pack ./dist --executable MyApp.exe
다중 아키텍처 번들
여러 입력 폴더가 전달되면 winapp pack 아키텍처당 하나의 .msixbundle 입력 폴더를 만듭니다.msix.
# Create unsigned bundle for Microsoft Store submission
winapp pack ./publish/x64 ./publish/arm64
# Create signed bundle for sideloading
winapp pack ./publish/x64 ./publish/arm64 --cert ./devcert.pfx
# Self-contained bundle
winapp pack ./publish/x64 ./publish/arm64 --self-contained --generate-cert
이 명령은 기본 실행 파일의 PE 헤더에서 각 폴더의 아키텍처를 자동으로 검색하고, 조각(ID, 기능, 종속성)에서 일관성의 유효성을 검사하고, 생성합니다 <Name>_<Version>_<arch1>_<arch2>.msixbundle.
번들에 대한 매니페스트 확인:
번들 내의 각 조각에는 매니페스트가 필요합니다. 이 명령은 다음 순서대로 매니페스트를 확인합니다.
--manifest <path>— 지정된 경우 이 단일 매니페스트는 모든 조각에 사용됩니다.ProcessorArchitecture검색된 아키텍처와 일치하도록 조각당 자동으로 업데이트됩니다.폴더별 매니페스트 - 각 입력 폴더에
Package.appxmanifestappxmanifest.xml해당 폴더의 매니페스트가 포함된 경우 해당 조각에 사용됩니다.현재 디렉터리 대체 — 폴더에 매니페스트가 없는 경우 명령은 현재 작업 디렉터리에서 검색
Package.appxmanifest하여 사용(아키텍처 자동 스탬프 사용)합니다.
모든 경우에 매니페스트는 자동으로 업데이트됩니다. 자리 표시자가 확인되고, 종속성이 주입되고 ProcessorArchitecture , 검색된 아키텍처에 강제 설정됩니다. 확인 후 교차 조각 유효성 검사를 통해 ID(이름, 버전, Publisher), 기능 및 종속성이 모든 조각 ProcessorArchitecture 에서 일관되도록 합니다.
조각에 정의된 패키지 버전은 MSIX 번들 버전(있는 경우 0.0.0.0제외)에 해당하며, 이 경우 타임스탬프 기반 버전이 자동으로 생성됩니다.
# Option 1: Single shared manifest (simplest for most projects)
# Place Package.appxmanifest in your project root and run from there
winapp pack ./publish/x64 ./publish/arm64
# Option 2: Explicit manifest path
winapp pack ./publish/x64 ./publish/arm64 --manifest ./src/Package.appxmanifest
# Option 3: Per-folder manifests (useful if slices have different app extensions)
# Each folder already contains its own Package.appxmanifest
winapp pack ./publish/x64 ./publish/arm64
디버그 아이덴티티 생성
스파스 패키징을 사용하여 디버깅을 위한 앱 ID를 만듭니다. exe는 원래 위치에 유지됩니다. Windows Add-AppxPackage -ExternalLocation 통해 ID를 연결합니다.
이 대
winapp run: exe가create-debug-identity(예: 있는 Electron 앱electron.exe)에서 분리된 경우 또는 특히 스파스 패키지 동작을 테스트할 때 사용합니다node_modules. exe가 빌드 출력 폴더winapp run에 있는 대부분의 프레임워크의 경우 대신 전체 느슨한 레이아웃 패키지를 등록하고 앱을 시작합니다. 전체 비교는 디버깅 가이드 를 참조하세요.
winapp create-debug-identity [entrypoint] [options]
인수:
-
entrypoint- 실행 파일 경로(.exe) 또는 ID가 필요한 스크립트
옵션:
-
--manifest <path>- 앱 매니페스트 파일의 경로(Package.appxmanifestappxmanifest.xml기본값: 자동 검색Package.appxmanifest또는appxmanifest.xml현재 디렉터리) -
--no-install- 만든 후 패키지를 설치하지 마세요. -
--keep-identity- 패키지 이름 및 애플리케이션 ID에 추가.debug하지 않고 매니페스트 ID as-is유지
기능 설명:
- 실행 파일의 병렬 매니페스트를 수정합니다.
- 정체성을 위한 스파스 패키지를 등록합니다.
- ID가 필요한 API의 디버깅을 사용하도록 설정
예:
# Add identity to executable using local manifest
winapp create-debug-identity ./bin/MyApp.exe
# Add identity with custom manifest location
winapp create-debug-identity ./dist/app.exe --manifest ./custom-manifest.xml
# Create identity for hosted app script
winapp create-debug-identity app.py
embed-identity
요소를 앱의 병렬(fusion) 매니페스트에 포함시켜 <msix> 데스크톱 애플리케이션을 스파스 ID 패키지에 연결합니다. 이는 스파스 패키징 워크플로의 3단계로, 실행 중인 exe가 속한 ID 패키지를 Windows 알려줍니다.
winapp embed-identity <target> [options]
인수:
-
target- 업데이트할 파일입니다. 확장별로 자동 검색됨:-
.exe(EXE 모드) - 을<msix>사용하여mt.exeexe의 side-by-side 매니페스트에 요소를 직접 포함합니다. -
.xml/.manifest(XML 모드) - 외부 SxS 매니페스트 파일의 요소를 삽입하거나 바꿉<msix>니다(없는 경우 생성됨). 업데이트된 매니페스트가 이진 파일에 포함되도록 나중에 앱을 다시 빌드합니다.
-
옵션:
-
--manifest <path>- ID(packageName, publisher, applicationId)를 읽을 스파스의appxmanifest.xml경로입니다. 생략하면 명령은 대상 옆에 있는sparse/폴더를 먼저 검색한 다음 현재 디렉터리, 대상의 디렉터리 및 현재 디렉터리에서 검색합니다appxmanifest.xml.
예:
# EXE mode — embed identity straight into the built exe
winapp embed-identity ./bin/Release/net8.0-windows/MyApp.exe
# XML mode — update a checked-in side-by-side manifest, then rebuild
winapp embed-identity ./app.manifest --manifest ./appxmanifest.xml
이 명령은 idempotent입니다. 다시 실행하면 기존 요소를 복제하지 않고 대체
<msix>합니다.
나타나다
Package.appxmanifest 파일을 생성하고 관리합니다.
매니페스트 생성
템플릿에서 Package.appxmanifest를 생성합니다.
winapp manifest generate [directory] [options]
인수:
-
directory- 매니페스트를 생성하는 디렉터리(기본값: 현재 디렉터리)
옵션:
-
--package-name <name>- 패키지 이름(기본값: 폴더 이름) -
--publisher-name <name>- 고유 이름 Publisher(기본값: CN=<현재 사용자>). 유효한 X.500 DN을 허용합니다. bare name은 CN=<name>으로 자동 래핑됩니다. -
--version <version>- 버전(기본값: "1.0.0.0") -
--description <text>- 설명(기본값: "내 애플리케이션") -
--entrypoint <path>- 진입점 실행 파일 또는 스크립트 -
--template <type>- 템플릿 유형:packaged(기본값) 또는sparse -
--logo-path <path>- 로고 이미지 파일 경로 -
--if-exists <Error|Overwrite|Skip>- 매니페스트 파일이 대상 경로에 이미 있는 경우의 동작(기본값:Error)
템플릿:
-
packaged- 표준 패키지 앱 매니페스트 -
sparse- 스파스/외부 위치 패키징을 사용하는 앱 매니페스트
매니페스트 자리 표시자
생성된 매니페스트는 패키징 시 자동으로 해결되는 토큰(달러 기호로 구분된)을 사용합니다. $placeholder$
| Placeholder | 해결됨 | 예시 |
|---|---|---|
$targetnametoken$ |
확장명 없는 실행 파일 이름 |
Executable="$targetnametoken$.exe" → Executable="MyApp.exe" |
$targetentrypoint$ |
Windows.FullTrustApplication |
항상 자동으로 해결됨 |
이는 Visual Studio 프로젝트 템플릿에서 사용하는 것과 동일한 규칙을 따르므로 매니페스트는 도구 전체에서 이식 가능합니다.
자리 표시자를 해결하는 방법:
-
winapp pack- 패키징하는$targetnametoken$동안 옵션을 사용--executable하거나 입력 폴더에서 단일.exe을 자동으로 검색하여 확인합니다. 여러 파일(또는 0).exe을 찾아--executable지정하지 않으면 오류가 표시됩니다. -
winapp create-debug-identity— 진입점 인수가 제공되면$targetnametoken$해당 인수에서 확인됩니다. 진입점이 없으면 매니페스트에서 실행 가능한 자리 표시자를 이미 확인해야 합니다. -
winapp manifest generate --executable--executable— 제공되면 매니페스트 메타데이터(버전, 설명) 및 아이콘이 실행 파일에서 추출되지만 생성된 매니페스트는 여전히 사용합니다$targetnametoken$.exe. 이 자리 표시자는 나중에 확인됩니다(예:winapp pack또는winapp create-debug-identity).
PS: 체크 인 매니페스트에서
$targetnametoken$유지하면 실행 파일 이름이 하드 코딩되는 것을 방지하고winapp pack및 Visual Studio 빌드 모두에서 작동합니다.
예:
# Generate standard manifest interactively
winapp manifest generate
# Generate with all options specified
winapp manifest generate ./src --package-name MyApp --publisher-name "CN=My Company" --if-exists overwrite
매니페스트 추가 별칭
Package.appxmanifest에 실행 별칭(uap5:AppExecutionAlias)을 추가합니다. 이렇게 하면 별칭 이름을 입력하여 명령줄에서 패키지된 앱을 시작할 수 있습니다.
winapp manifest add-alias [options]
옵션:
-
--name <alias>- 별칭 이름(예:myapp.exe). 기본값: 매니페스트의Executable특성에서 유추됩니다. -
--manifest <path>- Package.appxmanifest 경로(기본값: 현재 디렉터리 검색) -
--app-id <id>- 별칭을 추가할 애플리케이션 ID(기본값: 첫 번째 Application 요소)
기능 설명:
- 매니페스트를 읽고 특성에서
Executable별칭을 유추합니다(예:$targetnametoken$.exe자리 표시자 유지). -
uap5아직 없는 경우 네임스페이스 선언을 추가합니다. -
<Extensions>대상 Application 요소 내부에 블록을<uap5:AppExecutionAlias>추가합니다. - 별칭이 이미 있는 경우 별칭을 보고하고 성공적으로 종료합니다.
예:
# Add alias inferred from Executable attribute (e.g. $targetnametoken$.exe)
winapp manifest add-alias
# Add alias with explicit name
winapp manifest add-alias --name myapp.exe
# Add alias to specific manifest
winapp manifest add-alias --manifest ./dist/Package.appxmanifest
매니페스트 자산 업데이트
단일 원본 이미지에서 필요한 모든 MSIX 이미지 자산을 생성합니다.
winapp manifest update-assets <image-path> [options]
인수:
-
image-path- 원본 이미지 파일 경로(PNG, JPG, SVG, ICO, GIF, BMP 등)
옵션:
-
--manifest <path>- Package.appxmanifest 파일의 경로(기본값: 현재 디렉터리 검색) -
--light-image <path>- 밝은 테마 변형에 대한 별도의 원본 이미지 경로
설명:
단일 원본 이미지를 사용하고 매니페스트의 자산 참조에 따라 포괄적인 MSIX 이미지 자산 집합을 생성합니다.
매니페스트에서 참조되는 각 자산에 대해 다음을 수행합니다.
-
5 배율 변형 - base(접미사 없음),
.scale-125,.scale-150,.scale-200.scale-400
앱 아이콘의 경우(Square44x44Logo / AppList, 44×44 base):
-
14개의 도금된 대상 크기 조정 변형 —
.targetsize-{16,20,24,30,32,36,40,48,60,64,72,80,96,256} -
14개의 분리된 대상 크기 조정 변형 —
.targetsize-{size}_altform-unplated
추가적으로:
-
app.ico — 셸 통합을 위한 다중 해상도 ICO 파일(16, 24, 32, 48, 256)입니다.
.ico기존 파일이 자산 디렉터리(예:AppIcon.ico프로젝트 템플릿)에 있는 경우 중복 파일을 만드는 대신 현재 위치로 바뀝니다.
--light-image 사용함:
-
밝은 테마 대상 변형 —
.targetsize-{size}_altform-lightunplated(앱 아이콘) -
밝은 테마 배율 변형 -
.scale-{factor}_altform-colorful_theme-light(타일, 스토어 로고)
SVG 지원: SVG 파일은 원본 이미지로 완전히 지원됩니다. 각 대상 크기에서 직접 벡터로 렌더링되어 모든 해상도에서 픽셀에 완벽한 결과를 생성합니다.
이 명령은 가로 세로 비율을 유지하면서 이미지를 비례적으로 조정하여 필요할 때 투명한 배경으로 가운데에 배치합니다. 자산은 매니페스트 위치를 기준으로 디렉터리에 저장 Assets 됩니다.
예:
# Generate assets with auto-detected manifest
winapp manifest update-assets mylogo.png
# Use an SVG source for best quality at all sizes
winapp manifest update-assets mylogo.svg
# Specify manifest location explicitly
winapp manifest update-assets mylogo.png --manifest ./dist/Package.appxmanifest
# Generate light theme variants from a separate image
winapp manifest update-assets mylogo.png --light-image mylogo-light.png
# Use the same image for both (generates all MRT light theme qualifiers)
winapp manifest update-assets mylogo.png --light-image mylogo.png
# With verbose output
winapp manifest update-assets mylogo.png --verbose
run
빌드 출력 폴더에서 느슨한 레이아웃 패키지를 만들고, Windows.Management.Deployment.PackageManager API를 사용하여 Windows 등록하고, 애플리케이션을 시작합니다. 디버깅을 위해 전체 MSIX 설치를 시뮬레이션합니다. 디버거 첨부 파일의 프로세스 ID를 반환합니다.
winapp run 는 입력에서 자동으로 선택된 두 가지 모드 중 하나로 작동합니다.
-
폴더 모드 - 입력은 빌드 출력 폴더(포함)
Package.appxmanifest/AppxManifest.xml입니다. -
Project 모드 - 입력은 하나의 솔루션 또는 하나를 포함하는 디렉터리입니다
.csproj/.sln.slnx.winapp run는 프로젝트를 빌드하고 실행하여 패키지된 WinUI 앱과 패키지되지 않은 WinUI 앱을 모두 지원합니다. 아래 Project 모드를 참조하세요.
Tip
모드 선택은 기본적으로 자동입니다. 디렉터리가 프로젝트로 빌드될 것으로 예상할 때 빌드 출력 폴더로 처리된 경우 폴더 모드를 사용하여 다시 실행 --verbose 하면 디렉터리가 선택된 이유를 보고합니다(No .csproj/.sln/.slnx with a runnable app found in '<path>' — running it as a build-output folder.). 디렉터리는 실행 가능한 앱이 최상위 수준에 있을 때만.slnx.csproj/.sln/프로젝트로 빌드되며 재귀적으로 검색되지 않습니다.
이 명령은 대부분의 프레임워크(.NET, C++, Rust, Flutter, Tauri)에 대해 패키지 ID를 사용하여 디버깅하기 위한 기본 명령입니다. 단일 exe
create-debug-identity에 대해 스파스 패키지를 등록하는 것과 달리winapp run실제 MSIX 설치와 마찬가지로 전체 폴더를 느슨한 레이아웃 패키지로 등록합니다. 일반적인 디버깅 워크플로는 디버깅 가이드 를 참조하세요.
winapp run [<input>] [options]
인수:
-
input- 실행할 앱: 빌드 출력 폴더(폴더 모드),.csproj프로젝트,.sln/.slnx솔루션 또는 최상위 수준(프로젝트 모드, 디렉터리가 재귀적으로 검색되지 않음) 중 하나가 포함된 디렉터리입니다. 현재 디렉터리에서 프로젝트를 빌드/실행하는 데 사용합니다.. 선택 사항 - 생략할 때 현재 디렉터리 (일치)로 기본값이 지정dotnet run됩니다.
옵션:
-
--manifest <path>- Package.appxmanifest 경로(기본값: 입력 폴더 또는 현재 디렉터리에서 자동 검색) -
--output-appx-directory <path>- 느슨한 레이아웃 패키지의 출력 디렉터리(기본값:AppX입력 폴더 디렉터리 내부) -
--args <string>- 애플리케이션에 전달할 명령줄 인수입니다. 또는 인수 뒤에 인수를 사용하여--이스케이프를 방지합니다(예:winapp run . -- --flag value). -
--no-launch- 애플리케이션을 시작하지 않고 디버그 ID만 만들고 패키지를 등록합니다. -
--with-alias- AUMID 활성화 대신 실행 별칭을 사용하여 앱을 시작합니다. 앱은 상속된 stdin/stdout/stderr를 사용하여 현재 터미널에서 실행됩니다. 매니페스트에 있어야uap5:ExecutionAlias합니다(매니페스트를 추가하는 데 사용winapp manifest add-alias). 와 함께--no-launch사용할 수 없습니다. 와 함께--json사용할 수 없습니다. -
--debug-output- 시작된 애플리케이션에서 메시지 및 첫 번째 예외를 캡처OutputDebugString합니다. 프레임워크 노이즈(WinUI, COM, DirectX)는 콘솔 출력에서 필터링됩니다. 전체 로그 파일은 모든 것을 캡처합니다. 앱이 충돌하는 경우 자동으로 미니덤프를 캡처하고 분석하여 소스 파일:줄 번호(빌드 출력 폴더의 PDB에서 확인됨)를 사용하여 예외 유형, 메시지 및 스택 추적을 표시합니다. 관리되는(.NET) 크래시는 외부 도구 없이 즉시 분석됩니다. 네이티브(C++/WinRT) 크래시가 모듈 이름 및 오프셋을 표시합니다. 충돌된 앱이 WinUI 3 앱(Microsoft.UI.Xaml.dll로드됨)인 경우 추가 저장 예외 심사 패스가 자동으로 실행되어 원래 HRESULT, ErrorContext 체인 및 전체 네이티브 XAML 디스패치 스택을 표시합니다. 필요한 디버거 구성 요소는 처음 사용할 때 다운로드됩니다(디 버깅 참조, 환경 변수를 통해WINAPP_DBGTOOLS_DIR재정의 가능). 한 번에 하나의 디버거만 프로세스에 연결할 수 있으므로 다른 디버거(Visual Studio, VS Code)를 동시에 사용할 수 없습니다. 다른 디버거를 연결해야 하는 경우 대신 사용합니다--no-launch. 와 함께--no-launch사용할 수 없습니다. 와 함께--json사용할 수 없습니다. -
--symbols- 확인된 함수 이름으로 보다 풍부한 네이티브 크래시 분석을 위해 Microsoft 기호 서버에서 PDB 기호를 다운로드합니다. 와 함께--debug-output만 사용됩니다. 생략하고 네이티브 크래시가 발생하면 출력에서 이 플래그를 추가하는 것이 좋습니다. 이 플래그는 WinUI 3 앱에 대한 WinUI 수납 예외 심사 스택도 향상시킵니다. 먼저 실행은 기호를 다운로드하고 로컬로 캐시합니다. 후속 실행에서는 캐시를 사용합니다. -
--unregister-on-exit- 애플리케이션이 종료된 후 개발 패키지의 등록을 취소합니다. 개발 모드에 등록된 패키지만 제거합니다. 와 함께--no-launch사용할 수 없습니다. -
--detach- 애플리케이션을 시작하고 종료할 때까지 기다리지 않고 즉시 반환합니다. 시작 후 앱과 상호 작용해야 하는 CI/자동화에 유용합니다. PID를 stdout(또는 JSON 포함)으로--json인쇄합니다. ,--no-launch또는--debug-output--with-alias.와 함께--unregister-on-exit사용할 수 없습니다. -
--clean- 다시 배포하기 전에 기존 패키지의 애플리케이션 데이터(LocalState, 설정 등)를 제거합니다. 기본적으로 애플리케이션 데이터는 다시 배포에서 유지됩니다. -
--json- 프로그래밍 방식 사용을 위해 출력을 JSON으로 서식 지정합니다(예: CI/자동화).--detachPID를 캡처하는 데 유용합니다. 또는--with-alias.와 함께--debug-output사용할 수 없습니다.
애플리케이션 데이터 지속성:
기본적으로 winapp run 다시 배포할 때 애플리케이션의 데이터(LocalState, RoamingState등 Settings)를 유지합니다. 앱이 패키지 컨텍스트에 ApplicationData.Current.LocalFolder 또는 Environment.GetFolderPath(SpecialFolder.LocalApplicationData) 패키지 컨텍스트 내에서 데이터를 쓰는 경우 해당 데이터는 호출에서 winapp run 유지됩니다.
새 시작이 필요한 경우(예: 손상된 상태를 다시 설정하거나 첫 실행 동작을 테스트하는 경우) 사용합니다 --clean .
기능 설명:
- Package.appxmanifest를 찾거나 생성합니다.
- 느슨한 레이아웃 패키지를 사용하여 디버그 ID를 만들고 등록합니다.
- AUMID(애플리케이션 사용자 모델 ID)를 계산합니다.
- 등록된 ID를 사용하여 애플리케이션을 시작합니다(지정되지 않은 경우
--no-launch). - 디버거 첨부 파일의 프로세스 ID(PID)를 인쇄합니다.
예:
# Register debug identity and launch app from build output
winapp run ./bin/Debug
# Launch with custom manifest and arguments
winapp run ./dist --manifest ./out/Package.appxmanifest --args "--my-flag value"
# Pass arguments after -- to avoid escaping (equivalent to --args)
winapp run ./bin/Debug -- --my-flag value
# Specify output directory for loose layout package
winapp run ./bin/Release --output-appx-directory ./AppXDebug
# Register identity without launching
winapp run ./bin/Debug --no-launch
# Launch via execution alias (console apps run in current terminal)
winapp run ./bin/Debug --with-alias
# Launch and capture OutputDebugString messages and crash diagnostics
winapp run ./bin/Debug --debug-output
# Download native symbols for richer crash analysis (C++/WinRT crashes)
winapp run ./bin/Debug --debug-output --symbols
# Combine with execution alias to debug console apps inline
winapp run ./bin/Debug --with-alias --debug-output
# Run and automatically clean up registration on exit
winapp run ./bin/Debug --with-alias --unregister-on-exit
# Launch and detach immediately (useful for CI/automation)
winapp run ./bin/Debug --detach
# Detach with JSON output (returns PID for scripting)
winapp run ./bin/Debug --detach --json
# Wipe application data (LocalState, settings) and start fresh
winapp run ./bin/Debug --clean
Project 모드(.NET SDK 프로젝트)
입력이 .csproj하나(포함.) winapp run 를 포함하는 디렉터리, .sln.slnx/솔루션 또는 디렉터리인 경우 프로젝트를dotnet build 빌드한 다음 시작합니다. 패키지된 WinUI 앱과 패키지되지 않은 WinUI 앱을 모두 지원하고, 앱이 시작하기 전에 필요한 런타임에 일치하는 아키텍처 Windows 앱 설치합니다.
솔루션 입력: (또는 하나의 디렉터리를 포함하는 디렉터리를 가리키 winapp run.sln.slnx/고, 솔루션은 느슨한 .csproj 파일보다 선호됨) 실행 가능한 앱 프로젝트를 확인한 다음, 정의된 형제 Solution* 속성을 사용하여 빌드 $(SolutionDir) 하므로 종속된 프로젝트는 Visual Studio 빌드됩니다. 해결 규칙:
-
테스트 프로젝트는 자동 선택 시 건너뛰므로 앱과 해당 테스트를 포함하는 솔루션이 필요 없이
--project앱으로 확인됩니다. (WinUI 테스트 프로젝트 자체는 패키지된 앱이므로 출력 형식만으로는 구별할 수 없습니다.) - 실행 가능한 유일한 프로젝트가 테스트 프로젝트인 경우 실행됩니다.
-
실행 가능한 앱 프로젝트가 두 개 이상 있는 경우 시작 프로젝트를 추측하지 않습니다. 즉,
winapp run후보를 나열하는 데 오류가 발생합니다. 테스트 프로젝트를 선택하는 것을 포함하여 항상 적용되는 옵션을 선택하는 데 사용합니다--project <name>.
패키지된 항목과 패키지되지 않은 항목은 프로젝트의 유효 WindowsPackageType MSBuild 속성에서 자동으로 검색됩니다(매니페스트가 없음).
-
패키지됨 (
WindowsPackageType=MSIXWinUI 패키지 기본값) - 빌드한 다음 빌드 출력을 느슨한 레이아웃 패키지로 등록하고 AUMID(폴더 모드와 동일한 파이프라인)를 통해 시작합니다. -
패키지 해제(
WindowsPackageType=None) - 빌드하고, 프레임워크 종속 Windows 앱 런타임이 설치되었는지 확인하고, 빌드.exe를 직접 시작합니다. 를 사용하여 패키지된 프로젝트에 대해 이 작업을 강제 적용-p WindowsPackageType=None합니다.
Project 모드에는 .NET SDK 8.0.100 이상(MSBuild--getProperty의 경우)이 필요합니다.
Project 모드 옵션(폴더 모드에서는 무시됨):
-
-c, --configuration <name>- 빌드 구성. 기본값:Debug. -
--arch <x64|arm64|x86>- 대상 아키텍처입니다. 기본값: 현재 프로세스 아키텍처입니다. 빌드 RID와 설치되는 Windows 앱 런타임의 아키텍처를 모두 결정합니다. -
-r, --runtime <rid>- 대상 .NET 런타임 식별자(예:win-x64). Project 모드는 RID의 아키텍처만 사용하고 항상 정식win-<arch>모드를 빌드하며 Windows 없는 RID(예:linux-x64)를 거부합니다. 아키텍처가 재정의합니다.--arch -
-f, --framework <tfm>- 다중 대상 프로젝트(예:net10.0-windows10.0.26100.0)에 대한 대상 프레임워크 모니커입니다. -
--project <name-or-path>- 입력이 솔루션(.sln/.slnx) 또는 실행 가능한 앱 프로젝트가 여러 개 있는 디렉터리인 경우 프로젝트 이름 또는 경로별로 실행할 프로젝트를 선택합니다. -
--no-build- 빌드를 건너뛰고 기존 빌드 출력을 실행합니다(출력 속성은 계속 평가됨). -
--no-restore- 빌드하기 전에 프로젝트 복원을 건너뜁니다. -
-p, --property <Name=Value>- 빌드 및 속성 평가 모두에 전달되는 MSBuild 속성입니다. 반복 가능(예:-p WindowsPackageType=None).
빌드 출력 및 세부 정보: 프로젝트는 두 단계로 dotnet build 빌드됩니다. 즉, 출력 스트림이 콘솔에 상주 하고 빠른 속성 평가 패스가 붙습니다. winapp은 출력 전에 정확한 dotnet build … 호출을 출력하고 성공적인 빌드에서도 경고를 스트리밍합니다. 세부 정보 표시:
| Flag | dotnet 세부 정보 표시 | 추가 |
|---|---|---|
| (기본값) | minimal |
— |
--verbose |
minimal |
winapp의 빌드 결정 추적 |
--quiet |
quiet |
— |
아래 --json 또는 --quiet 호출 및 빌드 출력이 stderr로 이동하므로 stdout은 순수 JSON/클린 상태를 유지합니다.
옵션 적용 가능성: ID/느슨한 레이아웃 옵션(--manifest, , --output-appx-directory, --no-launch--with-alias, --unregister-on-exit, --clean--executable)은 패키지된 앱에만 적용됩니다. 패키지되지 않은 앱(MSIX 패키지가 없음)에 대한 명확한 오류와 함께 거부됩니다. 시작/디버그 옵션(--args/--, , --debug-output--detach, --symbols--json)은 둘 다에서 작동합니다.
Project 모드 예제:
# Build and run the project in the current directory (input defaults to ".")
winapp run
# Run a specific project
winapp run ./src/MyApp/MyApp.csproj
# Build and run from a solution (resolves the runnable app project, defines $(SolutionDir))
winapp run ./MyApp.sln
# Pick a startup project when the solution has more than one runnable app
winapp run ./MyApp.sln --project MyApp
# Release build for arm64
winapp run . -c Release --arch arm64
# Force an unpackaged run of a packaged project
winapp run . -p WindowsPackageType=None
# Run the existing build output without rebuilding, and capture crash diagnostics
winapp run . --no-build --debug-output
# Show winapp's build decision traces (dotnet build stays at minimal verbosity)
winapp run . --verbose
# Launch and detach (prints PID), forwarding args to the app
winapp run . --detach -- --my-flag value
MSBuild 속성(NuGet 패키지):
Microsoft.Windows.SDK.BuildTools.WinApp NuGet 패키지를 사용하는 경우 dotnet run 자동으로 winapp run 호출합니다. 다음 MSBuild 속성을 컨트롤 동작에 .csproj 설정할 수 있습니다.
| 재산 | Default | 설명 |
|---|---|---|
EnableWinAppRunSupport |
true |
실행 지원 기능 사용/사용 안 함 |
WinAppLaunchArgs |
(비어 있음) | 시작할 때 앱에 전달할 인수 |
WinAppRunUseExecutionAlias |
false |
AUMID 활성화 대신 실행 별칭을 통해 시작 |
WinAppRunNoLaunch |
false |
시작하지 않고 ID만 등록 |
WinAppRunDebugOutput |
false |
메시지 및 첫 번째 예외를 캡처 OutputDebugString 합니다. 한 번에 하나의 디버거만 연결할 수 있습니다(VS/VS Code 방지). 대신 다른 디버거를 연결하는 데 사용합니다 WinAppRunNoLaunch . |
WinAppRunDetach |
false |
앱이 종료되는 것을 기다리지 않고 실행 후 즉시 반환합니다. PID를 인쇄합니다. |
WinAppRunUnregisterOnExit |
false |
앱이 종료된 후 개발 패키지 등록 취소 |
WinAppRunClean |
false |
다시 배포하기 전에 기존 패키지의 애플리케이션 데이터(LocalState, 설정)를 제거합니다. |
WinAppRunSymbols |
false |
더 풍부한 네이티브 크래시 분석을 위해 Microsoft 기호 서버에서 기호를 다운로드합니다. 에만 효과가 있습니다 WinAppRunDebugOutput. |
WinAppRunExecutable |
(비어 있음) | 빌드 출력 폴더를 기준으로 하는 실행 경로입니다. 매니페스트에 포함 $targetnametoken$ 되고 출력 폴더에 둘 .exe이상이 있는 경우 사용합니다. |
WinAppRunArgs |
(비어 있음) | 전용 속성이 없는 옵션(예--verbose: )의 경우 명령줄에 원시 인수가 추가 winapp run 되었습니다. 위의 모든 속성에 추가됩니다. |
상호 배타적인 설정입니다.
WinAppRunNoLaunch 각각 WinAppRunDetach 다른 시작 동작을 설명하므로 다른 시작 속성과 서로 충돌합니다. 충돌하는 쌍을 설정하면 다음을 사용하여 실행 --X and --Y cannot be used together이 실패합니다.
| 재산 | 와 함께 사용할 수 없습니다. |
|---|---|
WinAppRunNoLaunch |
WinAppRunDetach, WinAppRunUseExecutionAlias, , WinAppRunDebugOutput, WinAppRunUnregisterOnExit |
WinAppRunDetach |
WinAppRunNoLaunch, WinAppRunUseExecutionAlias, , WinAppRunDebugOutput, WinAppRunUnregisterOnExit |
WinAppRunUseExecutionAlias를 사용하여 WinAppRunDebugOutputWinAppRunUnregisterOnExit 서로 결합할 수 있습니다.
WinAppRunClean, WinAppRunSymbols, WinAppRunExecutable및 WinAppLaunchArgs 제한 사항이 없습니다.
WinAppRunArgs 는 자체 제한 사항을 추가하지 않지만 통과된 스위치는 다른 스위치와 같이 확인되므로 WinAppRunArgs="--detach" 여전히 충돌합니다 WinAppRunNoLaunch.
<PropertyGroup>
<WinAppRunUseExecutionAlias>true</WinAppRunUseExecutionAlias>
<WinAppRunDebugOutput>true</WinAppRunDebugOutput>
</PropertyGroup>
등록
테스트용으로 로드된 개발 패키지의 등록을 취소합니다. 개발 모드(예: 통해 winapp run 또는 create-debug-identity)에 등록된 패키지만 제거합니다. 스토어 설치 또는 MSIX 설치 패키지는 제거되지 않습니다.
winapp unregister [options]
옵션:
-
--manifest <path>- Package.appxmanifest 경로(기본값: 현재 디렉터리에서 자동 검색) -
--force- 다른 프로젝트 트리에서 패키지를 등록한 경우에도 설치 위치 디렉터리 검사를 건너뛰고 등록을 취소합니다. -
--json- 출력을 JSON으로 서식 지정
기능 설명:
- 매니페스트에서 패키지 이름을 읽습니다.
- 패키지와
{name}패키지를 모두{name}.debug검색합니다(디버그 변형은 에 의해create-debug-identity생성됨). - 각 패키지가 개발 모드로 등록되었는지 확인합니다(
IsDevelopmentMode == true) - 패키지의 설치 위치가 현재 디렉터리 트리 아래에 있는지 확인합니다(다음이 아닌 경우
--force). - 일치하는 패키지 등록 취소
예:
# Unregister from current directory (auto-detects manifest)
winapp unregister
# Unregister with explicit manifest
winapp unregister --manifest ./Package.appxmanifest
# Force unregister even if registered from a different project tree
winapp unregister --force
# JSON output for scripting
winapp unregister --json
cert
개발 인증서를 생성, 검사 및 설치합니다.
인증서 생성
패키지 서명에 대한 개발 인증서를 생성합니다.
winapp cert generate [options]
옵션:
-
--manifest <Package.appxmanifest>- Package.appxmanifest에서 게시자 정보 추출 -
--publisher <name>- 인증서에 대한 Publisher. 전체 X.500 고유 이름(예:CN=Contoso, O=Contoso Ltd, C=US)을 허용하거나 자동으로 로 래핑되는 베어 이름을 허용합니다.CN=<name> -
--output <path>- 출력 인증서 파일 경로(절대 및 상대 경로 지원) -
--password <password>- 인증서 암호(기본값: "암호") -
--valid-days <valid-days>- 인증서가 유효한 일 수(기본값: 365) -
--install- 생성 후 로컬 컴퓨터 저장소에 인증서 설치 -
--if-exists <Error|Overwrite|Skip>- 인증서 파일이 이미 있는 경우 동작 설정(기본값: 오류) -
--export-cer- 파일(공개 키만 해당)을 함께 내.cer보냅니다.pfx. 신뢰 설치를 위해 공용 인증서를 별도로 배포하는 데 유용합니다. -
--json- 프로그래밍 방식으로 사용할 수 있는 JSON으로 출력 형식을 지정합니다. 오류도 JSON({"error": "..."})으로 반환됩니다.
인증서 정보
PFX 파일의 인증서 세부 정보를 표시합니다. 서명하기 전에 인증서가 매니페스트와 일치하는지 확인하는 데 유용합니다.
winapp cert info <cert-path> [options]
인수:
-
cert-path- 인증서 파일 경로(PFX)
옵션:
-
--password <password>- PFX 파일의 암호(기본값: "암호") -
--json- 출력을 JSON으로 서식 지정
인증서 설치
컴퓨터 인증서 저장소에 인증서를 설치합니다.
winapp cert install <cert-path> [options]
인수:
-
cert-path- 설치할 인증서 파일 경로
예:
# Generate certificate for specific publisher
winapp cert generate --publisher "CN=My Company" --output ./mycert.pfx
# Generate certificate and export public key .cer file
winapp cert generate --publisher "CN=My Company" --export-cer
# Generate certificate with JSON output (for scripting)
winapp cert generate --publisher "CN=My Company" --json
# View certificate details
winapp cert info ./mycert.pfx
# View certificate details as JSON
winapp cert info ./mycert.pfx --json
# Install certificate to machine
winapp cert install ./mycert.pfx
서명
인증서를 사용하여 MSIX 패키지 및 실행 파일에 서명합니다.
winapp sign <file-path> [options]
인수:
-
file-path- 서명할 MSIX 패키지 또는 실행 파일의 경로
옵션:
-
--cert <path>- 서명 인증서 경로 -
--cert-password <password>- 인증서 암호(기본값: "암호")
예:
# Sign MSIX package
winapp sign MyApp.msix --cert ./mycert.pfx
# Sign executable
winapp sign ./bin/MyApp.exe --cert ./mycert.pfx --cert-password mypassword
az-sign
클라우드 관리 서명 ID인 Azure 신뢰할 수 있는 서명 사용하여 파일(exe, MSIX 또는 MSIX 번들)을 코드 서명하므로 PFX(프라이빗 키)가 로컬 컴퓨터에 존재하지 않습니다.
winapp az-sign <file-path> [options]
인수:
-
file-path- 서명할 파일의 경로(exe, msix 또는 msixbundle)
옵션:
-
--subscription,-s- 사용할 구독 ID를 Azure. 제공되지 않고 여러 구독이 있는 경우 메시지가 표시됩니다. -
--resource-group,-r- 로그인 계정의 범위를 좁히는 리소스 그룹 -
--account- 서명 계정 이름입니다. 다음을 사용해야 합니다.--resource-group -
--profile,-p- 인증서 프로필 이름입니다. 다음을 사용해야 합니다.--account -
--metadata-file,-m- 기존metadata.json경로입니다. 리소스 검색 및 계정/프로필 선택 프롬프트를 건너뛰고 직접 서명합니다. 비대화형 Azure 자격 증명을 이미 사용할 수 있어야 합니다. CLI는 대화형 테넌트 프롬프트로 대체하거나az loginnpm 프로그래밍 방식 API는 항상 비대화형이며 프롬프트 대신 실패합니다.
인증:
az-sign는 Azure 표준 자격 증명 체인(DefaultAzureCredential)을 사용합니다. CI/CD의 경우, 설정 AZURE_TENANT_IDAZURE_CLIENT_ID및 AZURE_CLIENT_SECRET (또는 GitHub Actions OIDC/관리 ID 사용). 기존 Azure CLI 세션(az loginGitHub 작업 포함 azure/login )도 모든 환경에서 적용됩니다. 자격 증명을 찾을 수 없고 세션이 대화형인 경우에만 시작 az login 됩니다az-sign.
사전 요구 사항:
- Azure 코드 서명 계정 및 인증서 프로필(ID 유효성 검사 후 Azure 포털에서 생성됨) 및 ID에 할당된 코드 서명 인증서 프로필 서명자 역할. 자세한 지침은 Azure 아티팩트 서명 빠른 시작 문서를 참조하세요.
- 컴퓨터 전체 x64 .NET 8 이상 런타임이 설치되었습니다. Azure 서명 클라이언트 라이브러리는 별도의 프로세스에서 로드되는
signtool.exe관리되는 어셈블리입니다. winapp의 자체 포함 런타임은 이를 충족하지 않습니다. 런타임 로드 오류로 서명이 실패하는 경우 설치 https://dotnet.microsoft.com/download 합니다. -
Microsoft Visual C++ 재배포 가능 패키지(x64)입니다. Azure 서명 클라이언트 라이브러리는 VC++ 런타임에 따라 달라지고 winapp은 공식 클라이언트 도구 설치 관리자가 아닌 원시 NuGet 패키지를 다운로드하므로 이 종속성이 자동으로 설치되지 않습니다. 클린 머신은 .NET SignTool이 있는 경우에도 로드 실패할 수 있습니다. "애플리케이션을 올바르게 시작할 수 없습니다." 또는 dlib에서 누락된 DLL 오류로
0xc000007b서명이 실패하는 경우부터 https://aka.ms/vs/17/release/vc_redist.x64.exe 최신 x64 재배포 가능 파일을 설치합니다.
최소 권한 CI: 자동 검색(구독, 리소스 그룹, 계정 및 프로필 나열)에는 부모 범위에서 읽기 권한이 필요합니다. 모든 컬렉션 목록 호출을 방지하려면 부모 컬렉션을 열거하는 대신 직접 리소스 읽기(각 명명된 리소스의 GET)를 사용하여 계정 및 프로필의 유효성을 검사
--subscription--profile--resource-group--accountaz-sign하므로 해당 계정 및 프로필로 범위가 지정된 보안 주체로 충분합니다. 그 중 하나를 생략하면 목록 호출이 다시 도입됩니다. 예를 들어--subscription, 제외하면 ID가 액세스할 수 있는 구독 목록이 만들어지며az-sign, 범위가 좁은 보안 주체는 이를 허용하지 않을 수 있습니다. 단일 인증서 프로필로만 범위가 지정된 보안 주체는 미리 생성된--metadata-file(계정 엔드포인트 및 프로필을 직접 지정)을 전달하여 유효성 검사를 완전히 건너뛸 수 있습니다.
예:
# Interactive — discover/select subscription, account, and profile
winapp az-sign ./app.msix
# Fully specified — no prompting (ideal for CI/CD)
winapp az-sign ./app.msix --subscription <sub-id> --resource-group <rg> --account <account> --profile <profile>
# Reuse an existing metadata.json (skips resource discovery and selection; authentication may still prompt)
winapp az-sign ./app.msix --metadata-file ./metadata.json
create-external-catalog
CodeIntegrityExternal.cat 지정된 디렉터리에서 실행 파일의 해시가 포함된 카탈로그 파일을 생성합니다. 이 카탈로그는 패키지 자체에 포함되지 않은 외부 파일의 실행을 허용하기 위해 MSIX 스파스 패키지 매니페스트(AllowExternalContent)의 TrustedLaunch 플래그와 함께 사용됩니다.
이는 MSIX 패키지에 서명할 때 만드는 signtool.exe 방법과 AppxMetadata\CodeIntegrity.cat 비슷하지만 스파스/외부 위치 패키징에 사용할 외부 카탈로그를 생성합니다.
winapp create-external-catalog <input-folder> [options]
인수:
-
input-folder- 처리할 실행 파일이 포함된 하나 이상의 디렉터리입니다. 여러 디렉터리를 세미콜론으로 구분(예:"dir1;dir2")
옵션:
-
--recursive,-r- 하위 디렉터리의 파일 포함 -
--use-page-hashes- 카탈로그를 생성할 때 페이지 해시 포함(페이지별 해시 데이터를 사용하여 더 큰 카탈로그 생성) -
--compute-flat-hashes- 카탈로그를 생성할 때 플랫 파일 해시 포함 -
--if-exists <Error|Overwrite|Skip>- 출력 파일이 이미 있는 경우의 동작(기본값:Error) -
--output,-o- 출력 카탈로그 파일 경로입니다. 지정CodeIntegrityExternal.cat하지 않으면 현재 디렉터리에 만들어집니다. 디렉터리를 지정하면 기본 파일 이름이 추가됩니다.
기능 설명:
- 지정된 디렉터리에서 실행 파일(코드 섹션이 있는 PE 이진 파일)을 검색합니다.
- 찾은 모든 실행 파일의 해시를 사용하여 CDF(카탈로그 정의 파일)를 생성합니다.
- Windows CryptoCAT API를 사용하여
.cat카탈로그 파일을 생성합니다. - 실행 불가능한 파일(예:
.txt.dll코드 섹션 없음)은 자동으로 건너뜁니다.
예:
# Generate catalog for all executables in a directory
winapp create-external-catalog ./bin
# Include files in subdirectories
winapp create-external-catalog ./bin --recursive
# Specify a custom output path
winapp create-external-catalog ./bin --output ./dist/CodeIntegrityExternal.cat
# Overwrite existing catalog
winapp create-external-catalog ./bin --if-exists Overwrite
# Skip generation if catalog already exists
winapp create-external-catalog ./bin --if-exists Skip
# Include page hashes (for stricter code integrity validation)
winapp create-external-catalog ./bin --use-page-hashes
# Process multiple directories
winapp create-external-catalog "./bin;./lib" --recursive
# Combine multiple options
winapp create-external-catalog ./bin --recursive --use-page-hashes --compute-flat-hashes --output ./dist/CodeIntegrityExternal.cat --if-exists Overwrite
사용 시기:
TrustedLaunch를 사용하여 외부 실행 파일을 확인하는 스파스 MSIX 패키지를 빌드할 때 이 명령을 사용합니다. 일반적인 워크플로는 다음과 같습니다.
-
winapp manifest generate --template sparse— 다음을 사용하여 스파스 매니페스트 만들기AllowExternalContent -
winapp create-external-catalog ./bin— 앱의 실행 파일에 대한 코드 무결성 카탈로그 생성 -
winapp pack— 매니페스트, 자산 및 카탈로그를 MSIX에 패키지
도구
Windows SDK 도구에 직접 액세스하세요. Microsoft.Windows 사용할 수 있는 도구를 사용합니다. Sdk. BuildTools
winapp tool <tool-name> [tool-arguments]
사용 가능한 도구:
-
makeappx- 앱 패키지 만들기 및 조작 -
signtool- 파일 서명 및 서명 확인 -
mt- 병렬 어셈블리에 대한 매니페스트 도구 - Microsoft.Windows 기타 Windows SDK 도구도 있습니다. Sdk. BuildTools
예:
# Use signtool to verify signature
winapp tool signtool verify /pa MyApp.msix
store
Microsoft Store 개발자 CLI 명령을 실행합니다. 이 명령은 아직 다운로드하지 않은 경우 Microsoft Store Developer CLI를 다운로드합니다. Microsoft Store 개발자 CLI 대해 자세히 알아봅니다.
winapp store [args...]
인수:
-
args...– CLI에 직접 전달할 인수입니다msstore. 사용 가능한 명령 및 옵션은 MSStore CLI 설명서를 참조하세요.
기능 설명:
- Microsoft Store 개발자 CLI(
msstore)가 다운로드되어 시스템에서 사용할 수 있는지 확인합니다. - 모든 인수를 CLI에
msstore전달합니다. - 터미널에서 직접 출력을 보여 주는 명령을 실행합니다.
예:
# List all apps in your Microsoft Partner Center account
winapp store app list
# Publish a package to the Microsoft Store
winapp store publish ./myapp.msix --appId <your-app-id>
get-winapp-path
설치된 Windows SDK 구성 요소에 대한 경로를 가져옵니다.
winapp get-winapp-path [options]
반환되는 내용:
-
.winapp작업 영역 디렉터리의 경로 - 패키지 설치 디렉터리
- 생성된 헤더 위치
find-ui
WinUI 컨트롤 및 샘플에서 작업 코드 예제를 검색합니다. WinUI 전용: 코퍼스는 WinUI 3 갤러리 및 Windows 커뮤니티 도구 키트(및 몇 가지 큐레이팅된 핵심 패턴)이며 WPF, WinForms 또는 기타 UI 프레임워크를 다루지 않습니다. 세 번째 소스인 microsoft-ui-reactor ReactorGallery는 옵트인입니다. 일반 검색에서 제외되고 전달 --source reactor 될 때만 검색됩니다(C#전용 선언적 샘플은 표준 XAML 앱에 붙여넣지 않으므로 Reactor/MVU 프로젝트를 빌드할 때만 도달함).
winapp find-ui "<query>" [options]
코퍼스는 처음 사용할 때 GitHub 가져와 사용자<global .winapp>/cache/find-ui별로 캐시되므로 첫 번째 실행에는 네트워크 액세스가 필요합니다. 후속 실행은 로컬 캐시에서 제공됩니다(최대 7일마다 또는 요청 시 --refresh새로 고침됨).
옵션:
-
--id <id>- 코드를 가져옵니다(Gallery/Toolkit은 XAML 및/또는 C#을 반환합니다. Reactor는 C#전용이며 이전 검색에서 하나 이상의 시나리오 ID(예:gallery-tabview-1)에 대한 필수 구성 요소 노트를 추가합니다. 반복. ID는 대/소문자를 구분GALLERY-TABVIEW-1하지 않습니다.gallery-tabview-1 -
--list- 검색하는 대신 검색 가능한 모든 컨트롤/샘플 ID를 나열합니다(갤러리 + 도구 키트 + 코어, 옵트인 Reactor 원본은 제외됨). -
--source <gallery|toolkit|reactor|core>- 검색 결과를 단일 원본으로 제한합니다. (검색 전용 - .으로--list/--id는 유효하지 않음) Reactor는 옵트인(opt-in )이며 일반 검색에서 제외되므로--source reactor검색하는 유일한 방법입니다. -
--max <N>- 반환할 일치 컨트롤의 최대 수(기본값: 3). 검색에만 적용됩니다. 을 사용하여 무시됩니다--list/--id. -
--refresh- 로컬 캐시를 우회하고 GitHub WinUI 모음을 다시 가져옵니다. -
--json- 구조화된 JSON(에이전트 친화적)을 내보냅니다. 검색의 경우 각 일치 항목은sourcescoredescriptioncontrol시나리오idheader별 및 전체 코드에 대해 ;를 포함하는 배열, , 및scenarios배열을--id전달합니다.--json정수가 아닌 오류와 같은 인수/파서 오류를 비롯한 모든 오류에서--max0이 아닌 종료 코드가 있는 stdout의 플랫{"error": "..."}개체로 내보내지므로 출력은 컴퓨터에서 읽을 수 있게 유지됩니다.
워크플로: 압축적으로 검색하여 올바른 컨트롤과 해당 시나리오 ID를 찾은 다음, 가장 일치하는 --id전체 코드를 가져옵니다.
예:
# Find a control by intent (compact results with scenario ids)
winapp find-ui "tabbed layout"
# Restrict to the Windows Community Toolkit
winapp find-ui "settings card" --source toolkit
# Restrict to Reactor (opt-in; C#-only declarative WinUI — Reactor projects only)
winapp find-ui "flex layout" --source reactor
# Fetch the full XAML + C# for a specific scenario
winapp find-ui --id gallery-tabview-1
# Agent-friendly structured output
winapp find-ui "color picker" --json
# Browse everything, or force a corpus refresh
winapp find-ui --list
winapp find-ui "navigation view" --refresh
node generate-bindings
(NPM 패키지에서만 사용 가능) Windows 앱 SDK API에 대한 JS 바인딩을 생성합니다. 바인딩은 네임스페이스에 "winapp": { "jsBindings": {...} } 의해 package.json 선언되고 에 기록.winapp/bindings/됩니다.
npx winapp node generate-bindings [options]
옵션:
-
--verbose,-v- 파일별 자세한 코드 생성 출력 사용 -
--quiet,-q- 진행률 및 정보 출력 표시 안 함
기능 설명:
- 마지막에
의해 작성된 블록 과 블록을 읽은 다음 형식화된 바인딩을 - 수정
package.json않습니다. 수동 다시 생성자입니다.winapp.jsBindings블록 추가 및@microsoft/dynwinrt런타임 종속성은 JS 바인딩을 사용하는 동안winapp init발생합니다. 블록이 없으면 이 명령이 빠르게 실패합니다. - 종속성에서 누락된 경우
@microsoft/dynwinrt경고(하지만 작성하지 않음) - 추가한 후npm install실행init
비고
바인딩은 npm 전용이며(npm 패키지)npx winapp를 통해 @microsoft/winappcli 호출해야 합니다. 독립 실행형 winget CLI는 이를 표시하지 않습니다. 이 명령을 사용하여 바인딩을 다시 생성하기 전에 대화형으로 실행하고 winapp init 옵트인하거나 사용합니다 winapp init . --use-defaults --add-js-bindings. 편집winapp.yaml하는 경우 다시 생성하기 전에 Windows 종속성을 새로 고치려면 실행 npx winapp restore 합니다.
예:
# Regenerate JS bindings in the current project
npx winapp node generate-bindings
# Regenerate after editing winapp.jsBindings, with verbose output
npx winapp node generate-bindings --verbose
엔드 투 엔드 워크플로 및 구성 옵션에 대한 JS 바인딩 가이드 를
winapp.jsBindings참조하세요.
node create-addon (노드 추가 기능 생성)
(NPM 패키지에서만 사용 가능) Windows SDK 및 Windows 앱 SDK 통합을 사용하여 네이티브 C++ 또는 C# 추가 기능 템플릿을 생성합니다.
npx winapp node create-addon [options]
옵션:
-
--name <name>- Addon 이름(기본값: "nativeWindowsAddon") -
--template- 추가 기능 유형을 선택합니다. 옵션은 다음과cs같습니다cpp(기본값:cpp). -
--verbose- 자세한 정보 표시 출력 사용
기능 설명:
- 템플릿 파일을 사용하여 추가 기능 디렉터리를 만듭니다.
- Windows SDK 예제를 사용하여 binding.gyp 및 addon.cc 생성합니다.
- 필요한 npm 종속성(nan, node-addon-api, node-gyp)을 설치합니다.
- package.json 빌드 스크립트 추가
예:
# Generate addon with default name
npx winapp node create-addon
# Generate custom named addon
npx winapp node create-addon --name myWindowsAddon
노드 add-electron-debug-identity 명령어 실행
(NPM 패키지에서만 사용 가능) 스파스 패키징을 사용하여 Electron 개발 프로세스에 앱 ID를 추가합니다. Package.appxmanifest가 필요합니다(패키지가 있거나 winapp init 없는 경우 만들기winapp manifest generate).
중요합니다
웹 콘텐츠를 렌더링할 때 앱이 충돌하거나 렌더링되지 않는 스파스 패키징 Electron 애플리케이션에 알려진 문제가 있습니다. 이 문제는 Windows 해결되었지만 아직 외부 Windows 디바이스로 전파되지 않았습니다. 호출 add-electron-debug-identity후 이 문제가 표시되는 경우 플래그를 사용하여 디버그 목적으로 Electron 앱에서 샌드박싱 을 --no-sandbox 사용하지 않도록 설정할 수 있습니다. 이 문제는 전체 MSIX 패키징에 영향을 주지 않습니다.
Electron 디버그 정체성을 실행 취소하려면 winapp node clear-electron-debug-identity를 사용합니다.
npx winapp node add-electron-debug-identity [options]
옵션:
| Option | 설명 |
|---|---|
--manifest <path> |
사용자 지정 Package.appxmanifest에 대한 경로(기본값: 현재 디렉터리의 Package.appxmanifest) |
--no-install |
종속성을 설치하거나 수정하지 마세요. Electron 디버그 ID만 구성 |
--keep-identity |
매니페스트 ID를 그대로 유지하고, 패키지 이름 및 애플리케이션 ID에 .debug를 추가하지 마십시오. |
--verbose |
자세한 정보 출력 사용 |
기능 설명:
- electron.exe 프로세스에 대한 디버그 ID를 등록합니다.
- Electron 개발에서 ID가 필요한 API 테스트 사용
- ID 구성에 기존 Package.appxmanifest 사용
예:
# Add identity to Electron development process
npx winapp node add-electron-debug-identity
# Use a custom manifest file
npx winapp node add-electron-debug-identity --manifest ./custom/Package.appxmanifest
node clear-electron-debug-identity
(NPM 패키지에서만 사용 가능) 백업에서 원래 electron.exe 복원하여 Electron 디버그 프로세스에서 패키지 ID를 제거합니다.
npx winapp node clear-electron-debug-identity [options]
옵션:
| Option | 설명 |
|---|---|
--verbose |
자세한 정보 출력 사용 |
기능 설명:
- 에서 만든 백업에서 electron.exe 복원합니다.
add-electron-debug-identity - 복원 후 백업 파일을 제거합니다.
- 패키지 ID 없이 Electron을 원래 상태로 반환합니다.
예:
# Remove identity from Electron development process
npx winapp node clear-electron-debug-identity
전역 옵션
모든 명령은 다음과 같은 전역 옵션을 지원합니다.
-
--verbose,-v- 자세한 로깅에 자세한 정보 표시 출력 사용 -
--quiet,-q- 진행률 메시지 표시 안 함 -
--help,-h- 명령 도움말 표시
전역 캐시 디렉터리
Winapp은 여러 프로젝트 간에 공유할 수 있는 파일을 캐시하는 디렉터리를 만듭니다.
기본적으로 winapp은 전역 캐시 디렉터리 $UserProfile/.winapp 로 디렉터리를 만듭니다.
다른 위치를 사용하려면 환경 변수를 WINAPP_CLI_CACHE_DIRECTORY 설정합니다.
cmd:
REM Set a custom location for winapp's global cache
set WINAPP_CLI_CACHE_DIRECTORY=d:\temp\.winapp
PowerShell 및 pwsh에서:
# Set a custom location for winapp's global cache
$env:WINAPP_CLI_CACHE_DIRECTORY=d:\temp\.winapp
Winapp은 같은 init 명령을 restore실행할 때 자동으로 이 디렉터리를 만듭니다.
업데이트 검사
winapp CLI는 주기적으로 새 버전을 확인하고 업데이트를 사용할 수 있는 경우 한 줄로 알림을 표시합니다. 이 검사는 백그라운드에서 실행되며 명령에 대기 시간을 추가하지 않습니다.
업데이트 검사는 CI 환경(GitHub Actions, Azure Pipelines 등)에서 자동으로 비활성화됩니다.
업데이트 검사를 수동으로 사용하지 않도록 설정하려면 환경 변수를 WINAPP_CLI_UPDATE_CHECK .로 0설정합니다.
cmd:
set WINAPP_CLI_UPDATE_CHECK=0
PowerShell 및 pwsh에서:
$env:WINAPP_CLI_UPDATE_CHECK = "0"
이 영구를 만들려면 다음을 수행합니다.
[System.Environment]::SetEnvironmentVariable('WINAPP_CLI_UPDATE_CHECK', '0', 'User')
ui
UIA(UI 자동화)를 사용하여 실행 중인 Windows 앱 UI를 검사하고 상호 작용합니다.
winapp ui [command] [options]
명령을:
-
status- 앱에 연결하고 정보 표시 -
inspect- 요소 트리 보기 -
search- 선택기로 요소 찾기 -
get-property- 요소 속성 읽기 -
get-text/get-value- 요소(TextPattern, ValuePattern 또는 Name)에서 값/텍스트를 읽습니다. -
screenshot- PNG로 창/요소 캡처(대화 자동 캡처 별도로) -
record- H.264 MP4 비디오에 창/요소 영역 녹화(그래픽 캡처 + 미디어 파운데이션 Windows) -
invoke- 요소 활성화(클릭, 토글, 확장) -
click- 마우스 시뮬레이션을 통해 요소 클릭(호출을 지원하지 않는 컨트롤의 경우) -
hover- 마우스를 요소로 이동하여 도구 설명, 플라이아웃 및 호버 상태 트리거(기본 연산: 800ms) -
drag- 요소 선택기 또는 화면x,y좌표(순서 변경, 크기 조정, 슬라이더, 끌어서 놓기)를 사용하여 마우스를 한 지점에서 다른 지점으로 끕니다. -
touch- 요소 중심 또는 화면x,y좌표에 가상 터치 제스처 삽입(탭, 두 번 탭, 긴 누름, 살짝 밀기, 손가락 모으기, 스트레치) -
pen- 가상 펜/스타일러스 입력 삽입 - 구성 가능한 압력, 기울기 및 지우개 모드로 탭 및 잉크 스트로크 -
send-keys- 가상 키보드 입력(명명된 키, 콤보, 원시 vk=0xNN 또는 리터럴 텍스트)을 창으로 보내기 -
set-value- 편집 가능한 요소(텍스트, 숫자)에 값을 설정합니다. 는 TextPattern 전용 리치 편집 컨트롤에 대한 LegacyIAccessibleput_accValue로 대체됩니다. -
focus- 키보드 포커스 이동 -
scroll-into-view- 스크롤 요소 표시 -
wait-for- 요소 상태 대기 -
list-windows- 앱의 모든 창 나열 -
get-focused- 현재 포커스가 있는 요소 보고
옵션:
-
-a, --app <app>- 대상 앱(이름, 제목 또는 PID) -
-w, --window <hwnd>- HWND별 대상 창(안정)
ui 레코드
H.264 MP4에 창 또는 요소 영역을 기록합니다.
# Record a window for 10 seconds at 15 fps
winapp ui record -a Calculator --duration-sec 10 --fps 15 -o demo.mp4
# Record until Ctrl+C, downscaled so the longest edge is 1280px
winapp ui record -a "My App" --duration-sec 0 --max-edge 1280 -o capture.mp4
# Record just one element's region
winapp ui record -a "My App" btn-save-1234 -o button.mp4
# Keep an agent-readable timeline alongside the MP4
winapp ui record -a Calculator --frames --duration-sec 10 --fps 10 -o demo.mp4
레코드 옵션:
-
--duration-sec <n>- 기록 길이(초)입니다.0는 Ctrl+C(기본값0)까지 레코드를 기록합니다. -
--fps <n>- 캡처할 초당 프레임(기본값15)입니다. -
--max-edge <px>- 다운스케일이므로 가장 긴 가장자리는 대부분의 픽셀(0= 다운스케일 없음)입니다. -
--capture-screen- 오버레이/팝업이 포함되도록 화면에서 캡처합니다(폐색 창을 캡처할 수 있음). -
-o, --output <path>- 출력.mp4경로(기본값:recording-<timestamp>-<guid>.mp4). -
--frames- 타임스탬프가 지정된 JPEGframes.ndjsonmanifest.json<output-name>.frames를 작성하고 1GiB 프레임 데이터 한도를 사용하여 1-30fps 및--max-edge64-4096(기본값 1280)을 지원합니다.
최종 --json결과에는 출력 경로, 차원, 코덱, 캡처 모드, 주기, 중지 이유, 선택 사항 frameArtifacts및 경고가 포함됩니다.
알려진 제한 사항: 자체 최상위 창(WinUI/XAML 플라이아웃, 교육 팁, 도구 설명)에서 렌더링되는 팝업 내에 특정 요소를 기록하면 대신 기본 주 창을 캡처할 수 있습니다. 전체 창을 기록하거나 팝업 스틸에 사용합니다
ui screenshot --capture-screen. #646에서 추적됩니다.
전체 설명서는 docs/ui-automation.md를 참조하세요.
Windows developer