4.3 KiB
4.3 KiB
command
목적 / 책임
외부 시스템(Git, Jenkins, FTP, Slack, iOS 빌드 등)과의 실제 연동을 구현하는 커맨드 계층과, 커맨드 파라미터 데이터 모델을 담당한다. 파이프라인은 커맨드를 호출만 하며, 실제 I/O·프로세스 실행·외부 API 호출은 이 도메인에 둔다.
포함 경로
lib/oto/commands/— 커맨드 구현체 (카테고리별 하위 폴더)lib/oto/data/— 커맨드 파라미터 데이터 모델 (*_data.dart,*.g.dart)
제외 경로
lib/oto/pipeline/— 실행 흐름 제어 (커맨드 dispatch 이전)lib/oto/core/— 태그 치환, 데이터 합성 (커맨드 실행 이전)
주요 구성 요소
Command(command.dart) — 커맨드 베이스 클래스,CommandTypeenumCommandSpec(command.dart) — CommandType → category/dataModel/samplePath 메타데이터CommandRegistry(command_registry.dart) — CommandType → Command 매핑 등록소DataParam(base_data.dart) — 모든 커맨드 파라미터의 베이스DataCommand(command_data.dart) — 모든 커맨드에 전달되는 통합 컨테이너
커맨드 카테고리와 우선 참조 파일:
| 범주 | 구현 경로 | 데이터 모델 |
|---|---|---|
| build | lib/oto/commands/build/ |
lib/oto/data/build_data.dart |
| file | lib/oto/commands/file/ |
lib/oto/data/file_data.dart |
| git / GitHub | lib/oto/commands/git/ |
lib/oto/data/git_data.dart |
| ftp / web | lib/oto/commands/ftp/, lib/oto/commands/web/ |
lib/oto/data/network_data.dart |
| notification | lib/oto/commands/notification/, lib/oto/utils/mattermost/ |
lib/oto/data/notification_data.dart |
| jira / jenkins | lib/oto/commands/jira/, lib/oto/commands/jenkins/ |
lib/oto/data/integration_data.dart, lib/oto/data/jira_data.dart |
| infra / external tool | lib/oto/commands/aws/, docker/, gradle/, infra/, proto/ |
lib/oto/data/infra_data.dart, lib/oto/data/util_data.dart |
| shell / process / util | lib/oto/commands/shell/, process/, util/ |
lib/oto/data/util_data.dart |
유지할 패턴
- 새 커맨드는 반드시
Command상속 후CommandRegistry에 등록 Command.register()에는CommandSpec을 함께 전달해 category, dataModel, samplePath를 기록- 파라미터 모델은
DataParam상속 +@JsonSerializable *.g.dart는dart run build_runner build로 생성한다. 생성 파일 직접 수정은 생성 불가한 긴급 상황에서만 한다getWorkspace(): workspace 필드 →property['workspace']→commonData.workspace순으로 resolve- 커맨드 파라미터는
getParam(command)를 통해 태그 치환과 workspace resolve를 거친 뒤Data*모델로 파싱한다 - 결과 저장은
<@property.key>형태의 쓰기 태그와setProperty()/complete()의setResult,setExitCode흐름을 우선 사용한다 - 외부 프로세스 실행은 기존 패턴인
ProcessExecutor.start()또는ProcessExecutor.run()을 우선 사용한다 - 커맨드 추가/파라미터 변경 시 관련
assets/yaml/sample/**와 README 커맨드 목록 갱신 필요 여부를 확인한다 - 데이터 모델 변경 후
dart run build_runner build와dart analyze를 실행한다
다른 도메인과의 경계
- pipeline:
Command.execute(DataCommand)를 호출하는 시점이 경계. 커맨드는 흐름을 모른다 - core: 태그 치환은 core가 완료한 후 DataCommand가 커맨드에 전달됨
- sample: YAML 사용 예시는 sample 도메인이 담당한다. 커맨드 파라미터 변경 시 sample 도메인과 동기화한다
- framework:
dart_framework의ProcessExecutor, path/system 유틸은 외부 런타임 의존성으로 사용한다. OTO 비즈니스 로직을 framework 의존성 쪽으로 옮기지 않는다
금지 사항
- 커맨드에서 다른 커맨드를 직접 인스턴스화하거나 호출하지 않는다
- 흐름 제어(if/loop) 로직을 커맨드 내부에 넣지 않는다
CommandRegistry외 장소에서 CommandType 매핑을 추가하지 않는다- 커맨드 구현 중
Application.instance.dataCommandMap을 직접 순회하거나 파이프라인 구조를 해석하지 않는다 - 샘플 YAML에 실제 토큰, 비밀번호, API 키를 넣지 않는다