20-build-domain
Status: ACTIVE
AppliesTo: v10
0. 목적
- •특정 게임이 아니라 도메인/프로토콜이 동적으로 바뀌는 빌드를 표준화한다.
- •
DomainKey와ProtocolGroup이 추가될 때마다 빌드 산출물이 자동으로 늘어나는 구조를 정의한다. - •빌드 입력/설정/산출물 원칙을 명확히 하여 빌더 구현과의 불일치를 제거한다.
1. 적용 범위
적용 대상
- •
framework-ts/tools/builder/build.js기반 빌드 전반 - •입력:
{buildInputJson}(예:input/input_common.json) - •설정:
{configJson}(예:input/config.json)
비대상
- •런타임 실행 로직
- •에러/로그 표준 (→
skills/devian-tools/21-build-error-reporting/SKILL.md)
2. 용어
| 용어 | 정의 |
|---|---|
| DomainKey | 도메인 식별자 (예: Game, Common) |
| ProtocolGroup | 프로토콜 그룹 식별자 (예: Game) |
| buildInputJsonDir | buildInputJson 파일이 위치한 디렉토리. 상대경로 해석의 기준 |
| {tempDir} | 빌드 중간 산출물이 생성되는 staging 디렉토리 |
| {configJson} | 빌드 설정 파일 (출력 경로 등 정의) |
3. 빌드 실행
스크립트 실행
bash
bash input/build.sh <buildInputJson>
직접 실행
bash
node framework-ts/tools/builder/build.js <buildInputJson>
- •
<buildInputJson>은 빌드 입력 JSON 파일 경로 (예:input/input_common.json) - •빌더는
buildInputJson을 읽고, 그 안의configPath로 설정 파일을 로드한다.
4. 입력 파일 스펙 (build json)
최상위 필드
| 필드 | 타입 | 설명 |
|---|---|---|
version | string | 빌드 스펙 버전 |
configPath | string | 설정 파일 경로 (buildInputJsonDir 기준 상대경로) |
tempDir | string | staging 디렉토리 경로 |
domains | object | 도메인 정의 (map 형태) |
protocols | array | 프로토콜 정의 (배열 형태) |
domains (map)
json
{
"DomainKey": {
"contractDir": "Domains/Game/contracts",
"contractFiles": ["*.json"],
"tableDir": "Domains/Game/tables",
"tableFiles": ["*.xlsx"]
}
}
- •key는
DomainKey(예:"Game","Common") - •
contractDir,tableDir는 buildInputJsonDir 기준 상대경로
protocols (array)
json
[
{
"group": "Game",
"protocolDir": "Protocols/Game",
"protocolFiles": ["C2Game.json", "Game2C.json"]
}
]
- •
group은ProtocolGroup식별자
5. 설정 파일 스펙 (config.json)
csConfig (C# 출력)
| 필드 | 필수 | 설명 |
|---|---|---|
moduleDir | ✓ | C# 모듈 출력 디렉토리 |
generateDir | 옵션 | C# 생성 코드 디렉토리 (미지정 시 moduleDir 사용) |
tsConfig (TypeScript 출력)
| 필드 | 필수 | 설명 |
|---|---|---|
moduleDir | ✓ | TS 모듈 출력 디렉토리 |
generateDir | 옵션 | TS 생성 코드 디렉토리 (미지정 시 moduleDir 사용) |
upmConfig (UPM 패키지)
| 필드 | 필수 | 설명 |
|---|---|---|
sourceDir | ✓ | UPM 소스 디렉토리 |
packageDir | ✓ | UPM 패키지 출력 디렉토리 |
tableConfig (데이터 출력)
| 필드 | 필수 | 설명 |
|---|---|---|
tableDirs | ✓ | 테이블 출력 디렉토리 배열 |
stringDirs | ✓ | String 테이블 출력 디렉토리 배열 |
soundDirs | ✓ | 사운드 데이터 출력 디렉토리 배열 |
CRITICAL: config.json에
dataConfig키가 존재하면 빌드가 즉시 FAIL한다 (deprecated). tableConfig의 각 Dir 배열에 대해 해당 데이터 유형이 출력된다.
samplePackages
| 필드 | 타입 | 설명 |
|---|---|---|
samplePackages | string[] | 샘플 패키지 목록 (com.devian.samples만 허용) |
Hard Rule: samplePackages cannot contain libraries/domains
- •
samplePackages에는com.devian.samples만 포함할 수 있다. - •
com.devian.foundation또는com.devian.domain.*가 들어가면 FAIL (Generated 덮어쓰기/삭제 위험). - •
staticUpmPackages키는 금지이며 존재 시 FAIL.
6. 산출물 규칙
원칙
- •도메인/프로토콜 추가에 따라 출력이 늘어남 (동적)
- •개별 도메인 고정표 대신 템플릿 기반으로 산출물 경로가 결정됨
- •정확한 디렉토리/파일 배치는 빌더 구현이 SSOT
C# Domain 템플릿
code
{csConfig.generateDir}/Devian.Domain.{DomainKey}/
TypeScript Domain 템플릿
code
{tsConfig.generateDir}/devian-domain-{domainKeyLower}/
UPM Domain 템플릿
code
{upmConfig.sourceDir}/com.devian.domain.{domainKeyLower}/
Protocol 템플릿 (동일 원칙)
code
C#: {csConfig.generateDir}/Devian.Protocol.{ProtocolGroup}/
TS: {tsConfig.generateDir}/devian-protocol-{protocolGroupLower}/
UPM: {upmConfig.sourceDir}/com.devian.protocol.{protocolGroupLower}/
데이터 산출물
일반 테이블 (tableConfig.tableDirs):
code
{tableDir}/ndjson/{TableName}.json
{tableDir}/pb64/{TableName}.asset
String Table (tableConfig.stringDirs):
code
{stringDir}/ndjson/{Language}/{TableName}.json
{stringDir}/pb64/{Language}/{TableName}.asset
Sound 데이터 (tableConfig.soundDirs):
code
{soundDir}/ndjson/{TableName}.json
{soundDir}/pb64/{TableName}.asset
- •복수 타겟 가능 (각 Dir 배열의 모든 경로에 복사)
- •도메인 폴더 미사용: 최종 경로에
{DomainKey}폴더 없음 - •동일 파일명 충돌 시 빌드 FAIL (조용한 덮어쓰기 금지)
7. Hard Rules
Staging 규칙
- •
{tempDir}는 staging 전용이며 커밋 금지 - •빌드 완료 후 staging에서 최종 위치로 복사됨
필수 필드 FAIL
| 조건 | 결과 |
|---|---|
tableConfig.tableDirs 누락 | 즉시 FAIL |
tableConfig.stringDirs 누락 | 즉시 FAIL |
tableConfig.soundDirs 누락 | 즉시 FAIL |
Forbidden 필드 FAIL
아래 필드가 존재하면 즉시 FAIL 처리됨:
| 위치 | Forbidden 필드 |
|---|---|
config.json | dataConfig (deprecated) |
domains[*] | csTargetDir |
domains[*] | tsTargetDir |
domains[*] | dataTargetDirs |
protocols[*] | csTargetDir |
protocols[*] | tsTargetDir |
protocols[*] | upmName |
protocols[*] | upmTargetDir |
총 8개 금지 필드. 하나라도 발견되면 빌드가 중단된다.
8. 예시
Game 도메인/프로토콜 예제의 상세 설명은 별도 스킬 문서를 참조한다:
예제 정책:
skills/devian-examples/01-policy/SKILL.md
예제 입력 위치:
- •
devian/input/Domains/Game/contracts/** - •
devian/input/Domains/Game/tables/** - •
devian/input/Protocols/Game/**
Verification Checklist
- •
input/config.json에samplePackages: ["com.devian.samples"]만 존재한다. - •
input/config.json에staticUpmPackages키가 존재하지 않는다 (금지 필드). - •빌드 후
framework-cs/upm/com.devian.domain.sound/Runtime/Generated/Sound.g.cs가 존재한다. - •빌드 후
framework-cs/apps/UnityExample/Packages/com.devian.domain.sound/Runtime/Generated/Sound.g.cs가 존재한다. - •samplePackages 처리 이후에도 (3), (4)가 삭제되지 않는다.
- •Unity 컴파일 에러
CS0246 (SOUND/VOICE not found)가 발생하지 않는다.
Verification Checklist (Dependencies)
- •
framework-cs/upm/**/package.json에서com.devian.core,com.devian.unitydependency가 0개여야 한다. - •
framework-cs/apps/UnityExample/Packages/**/package.json에서도 위 dependency가 0개여야 한다.
9. Reference
빌더 (SSOT)
- •
framework-ts/tools/builder/build.js
입력/설정 예시
- •
input/input_common.json— 빌드 입력 예시 - •
input/config.json— 설정 파일 예시
관련 스킬
| 스킬 | 설명 |
|---|---|
skills/devian-core/03-ssot/SKILL.md | 전체 SSOT 정책 |
skills/devian-tools/21-build-error-reporting/SKILL.md | 빌드 에러/로그 표준 |
skills/devian-examples/01-policy/SKILL.md | Game 예제 정책 |
skills/devian-unity/02-unity-bundles/SKILL.md | UPM 번들/복사 흐름 |