131 lines
6.5 KiB
Markdown
131 lines
6.5 KiB
Markdown
# Visual Studio 2026 개발 Tornado Live 실행
|
|
|
|
## 목적과 안전 기본
|
|
|
|
이 문서는 개발 PC의 Visual Studio 2026에서 `MBN_STOCK_WEBVIEW.LegacyParityApp`을
|
|
명확한 시작 대상으로 실행하고, 개발 Tornado2에 연결하는 방법을 설명한다.
|
|
|
|
저장소의 송출 기본값과 Release 동작은 계속 `DryRun`이다. 개발 Live는 다음 세 조건이
|
|
동시에 맞는 **Debug 프로세스 한 회차**에서만 기존 Live 게이트를 설정한다.
|
|
|
|
1. 시작 인자가 정확히 `--development-live` 하나이다.
|
|
2. 컴파일된 앱이 Debug 빌드이다.
|
|
3. 아래 Git 제외 로컬 승인 파일이 존재하며 엄격한 스키마 검사를 통과한다.
|
|
|
|
조건이 하나라도 다르면 환경 변수를 설정하지 않는다. 로컬 파일이 없거나 읽기 권한이
|
|
없고, JSON 또는 해시 형식이 잘못된 경우에도 시작은 fail-closed로 진행되어 기존
|
|
`playout.local.json`의 안전 기본인 `DryRun`을 사용한다.
|
|
|
|
## Visual Studio 시작 대상과 프로필
|
|
|
|
공유 솔루션 실행 프로필은 저장소 루트의
|
|
`MBN_STOCK_WEBVIEW.slnLaunch`에 있으며 다음 프로젝트만 시작한다.
|
|
|
|
```text
|
|
src\MBN_STOCK_WEBVIEW.LegacyParityApp\MBN_STOCK_WEBVIEW.LegacyParityApp.csproj
|
|
```
|
|
|
|
`Debug|x64`와 `Release|x64`의 MSIX Deploy 대상도 루트 프로토타입이 아니라 이 프로젝트이다. Visual
|
|
Studio의 시작 드롭다운에는 다음 두 프로필이 표시된다.
|
|
|
|
| 순서 | 프로필 | 동작 |
|
|
|---:|---|---|
|
|
| 1 | `MBN_STOCK_WEBVIEW.LegacyParityApp - Development Live (Package)` | `--development-live`를 전달한다. 유효한 로컬 승인 파일이 있을 때만 Live를 구성한다. |
|
|
| 2 | `MBN_STOCK_WEBVIEW.LegacyParityApp - Explicit DryRun (Package)` | 개발 Live 인자를 전달하지 않는다. |
|
|
|
|
개발 PC에서 Live를 사용할 때는 공유 실행 프로필 `Legacy Parity App (VS F5)`, 구성
|
|
`Debug`, 플랫폼 `x64`, 첫 번째 Development Live 패키지 프로필을 선택하고 F5를 누른다.
|
|
DryRun 확인은 두 번째 프로필을 선택한다. 앱은 단일 인스턴스이므로 프로필을 바꿀 때
|
|
기존 인스턴스를 정상 종료한 뒤 다시 실행해야 한다.
|
|
|
|
패키지된 WinUI 3 full-trust 실행에서는 Visual Studio가 프로세스 명령줄에 인자를 전달해도
|
|
`LaunchActivatedEventArgs.Arguments`가 빈 문자열일 수 있다. 부트스트랩은 activation 인자가
|
|
비어 있을 때에만 `Environment.GetCommandLineArgs()`가 정확히 `exe + 인자 1개`인 경우 그
|
|
하나를 사용한다. 인자가 없거나 둘 이상이면 합치거나 일부를 무시하지 않고 Live 요청을
|
|
거부한다. Release 빌드는 이 fallback으로 정확한 인자를 얻더라도 Debug-only gate에서
|
|
승인 파일을 읽지 않고 기존 `DryRun` 설정을 유지한다.
|
|
|
|
## 로컬 승인 파일
|
|
|
|
실제 파일 경로는 다음과 같다.
|
|
|
|
```text
|
|
%LOCALAPPDATA%\MBN_STOCK_WEBVIEW\Config\playout.development-live.local.json
|
|
```
|
|
|
|
실제 파일명은 `.gitignore`에 포함되어 있다. 저장소의
|
|
`Config\playout.development-live.example.json`을 구조 참고용으로 사용하되, 예제의
|
|
해시 placeholder는 실행 가능한 값이 아니다. 실제 승인 파일은 정확히 다음 다섯 속성만
|
|
가진다.
|
|
|
|
```json
|
|
{
|
|
"schemaVersion": 1,
|
|
"mode": "Live",
|
|
"authorization": "I_AUTHORIZE_LIVE_PROGRAM_OUTPUT_FOR_THIS_LAUNCH",
|
|
"nativeSha256": "<독립적으로 승인한 x64 K3D native DLL의 64자리 SHA-256>",
|
|
"interopSha256": "<독립적으로 승인한 x64 K3D Interop DLL의 64자리 SHA-256>"
|
|
}
|
|
```
|
|
|
|
검사 규칙은 다음과 같다.
|
|
|
|
- 파일 크기는 1~4096바이트이다.
|
|
- 파일과 `%LOCALAPPDATA%` 아래의 중간 디렉터리는 reparse point가 아니다.
|
|
- JSON 주석, trailing comma, 중복 속성, 알 수 없는 속성, 대소문자가 다른 속성을
|
|
허용하지 않는다.
|
|
- `schemaVersion`은 숫자 `1`, `mode`는 정확히 `Live`, `authorization`은 위 문자열과
|
|
정확히 일치해야 한다.
|
|
- 두 해시는 공백 없는 64자리 16진수여야 한다. 경로나 DLL은 Git에 기록하지 않는다.
|
|
- 파일 없음, 잘못된 경로, 공유 위반, I/O 또는 읽기 권한 오류는 모두 같은 제한된
|
|
`authorization-unavailable` 결과로 처리하며 경로와 값은 로그에 표시하지 않는다.
|
|
|
|
현재 설치 파일의 해시를 그 자리에서 계산했다는 이유만으로 승인 값으로 사용해서는 안
|
|
된다. 벤더 배포본 또는 기존에 독립 검수된 증적과 대조한 값을 사용한다. 파일 ACL은 현재
|
|
개발 사용자와 관리자만 수정할 수 있도록 유지한다.
|
|
|
|
## 기존 playout.local.json
|
|
|
|
기존 설정 파일 경로는 그대로이다.
|
|
|
|
```text
|
|
%LOCALAPPDATA%\MBN_STOCK_WEBVIEW\Config\playout.local.json
|
|
```
|
|
|
|
이 파일의 `mode`는 `DryRun`으로 유지한다. Development Live 부트스트랩이 성공한 해당
|
|
Debug 프로세스에서만 `MBN_STOCK_PLAYOUT_MODE=Live`를 process scope로 덮어쓴다.
|
|
기존 이중 게이트를 유지하기 위해 로컬 설정에는 `trustedLiveOutputEnabled: true`가
|
|
명시되어야 한다.
|
|
|
|
실제 cue의 `PlayoutCue.SceneName`은 builder의 대표 SceneCode가 아니라 활성 cut alias다.
|
|
전체 이관 UI를 개발 PGM에서 검증할 때 `testSceneAllowlist`에는
|
|
`LegacySceneRuntimeCoverage.ExpectedCutCodes`와 동일한 다음 45개 alias를 사용한다.
|
|
|
|
```text
|
|
5001, 5006, 5011, 5016, 50160, 5023, 5024, 5025, 5026, 5029,
|
|
5032, 5037, 5068, 5070, 5072, 5074, 5076, 5077, 5078, 5079,
|
|
5080, 5081, 5082, 5083, 5084, 5085, 5086, 50860, 5087, 5088,
|
|
6001, 6067, 8001, 8002, 8003, 8018, 8032, 8035, 8040, 8046,
|
|
8051, 8056, 8061, 8067, N5001
|
|
```
|
|
|
|
`8010`과 `8086`은 활성 cue alias가 아니므로 넣지 않는다. 승인 Cuts에 종속 asset이 없는
|
|
장면은 allowlist에 있더라도 기존 asset 검증에서 계속 차단된다.
|
|
|
|
## 프로세스 범위 적용 순서
|
|
|
|
엄격한 파일 검사가 끝난 뒤 다음 값을 process scope에만 적용한다.
|
|
|
|
1. 승인된 native SHA-256 pin
|
|
2. 승인된 Interop SHA-256 pin
|
|
3. `MBN_STOCK_PLAYOUT_MODE=Live`
|
|
4. Live authorization — 항상 마지막에 설정
|
|
|
|
중간 환경 쓰기가 실패하면 기존 값을 복구하고 Live authorization을 새로 설정하지 않는다.
|
|
`EnvironmentLiveAuthorization`은 `MainWindow`와 `IPlayoutEngine`을 만들 때 값을 한 번만
|
|
캡처하므로, 부트스트랩은 반드시 `new MainWindow()`보다 먼저 실행된다.
|
|
|
|
Release 빌드에서는 `--development-live`가 전달되어도 로컬 승인 파일을 읽지 않고 환경을
|
|
변경하지 않는다. 이 개발 편의 경로는 기존 운영 Live 승인 경로나 안전 게이트를 대체하지
|
|
않는다.
|