CLI 애플리케이션
입력을 읽고, 출력을 쓰고, 사용자와 상호작용하는 커맨드라인 도구를 빌드합니다.
만들 것
사용자에게 인사하는 간단한 CLI:
$ wippy run -x app:cli
Hello from CLI!
프로젝트 구조
cli-app/
├── wippy.lock
└── src/
├── _index.yaml
└── cli.lua
1단계: 프로젝트 생성
mkdir cli-app && cd cli-app
mkdir src
2단계: 엔트리 정의
src/_index.yaml 생성:
version: "1.0"
namespace: app
entries:
# 터미널 호스트가 프로세스를 stdin/stdout에 연결
- name: terminal
kind: terminal.host
lifecycle:
auto_start: true
# CLI 프로세스
- name: cli
kind: process.lua
source: file://cli.lua
method: main
modules:
- io
terminal.host가 Lua 프로세스를 터미널에 연결합니다. 없으면 io.print()가 쓸 곳이 없습니다.
3단계: CLI 코드
src/cli.lua 생성:
local io = require("io")
local function main()
io.print("Hello from CLI!")
return 0
end
return { main = main }
4단계: 실행
wippy init
wippy run -x app:cli
출력:
Hello from CLI!
-x 플래그는 terminal.host를 자동 감지하고 깨끗한 출력을 위해 사일런트 모드로 실행합니다.
사용자 입력 읽기
local io = require("io")
local function main()
io.write("Enter your name: ")
local name = io.readline()
if name and #name > 0 then
io.print("Hello, " .. name .. "!")
else
io.print("Hello, stranger!")
end
return 0
end
return { main = main }
컬러 출력
ANSI 이스케이프 코드로 색상 사용:
local io = require("io")
local reset = "\027"
local function red(s) return "\027" .. s .. reset end
local function green(s) return "\027" .. s .. reset end
local function yellow(s) return "\027" .. s .. reset end
local function cyan(s) return "\027" .. s .. reset end
local function bold(s) return "\027" .. s .. reset end
local function main()
io.print(bold(cyan("Welcome!")))
io.write(yellow("Enter a number: "))
local input = io.readline()
local n = tonumber(input)
if n then
io.print("Squared: " .. green(tostring(n * n)))
return 0
else
io.print(red("Error: ") .. "not a number")
return 1
end
end
return { main = main }
시스템 정보
system 모듈로 런타임 통계에 접근:
# 엔트리 정의에 추가
modules:
- io
- system
local io = require("io")
local system = require("system")
local function main()
io.print("Host: " .. system.process.hostname())
io.print("CPUs: " .. system.runtime.cpu_count())
io.print("Goroutines: " .. system.runtime.goroutines())
local mem = system.memory.stats()
io.print("Memory: " .. string.format("%.1f MB", mem.heap_alloc / 1024 / 1024))
return 0
end
return { main = main }
종료 코드
main()에서 반환하여 종료 코드 설정:
local function main()
if error_occurred then
return 1 -- 에러
end
return 0 -- 성공
end
I/O 참조
| 함수 | 설명 |
|---|---|
io.print(...) |
개행과 함께 stdout에 쓰기 |
io.write(...) |
개행 없이 stdout에 쓰기 |
io.eprint(...) |
개행과 함께 stderr에 쓰기 |
io.readline() |
stdin에서 줄 읽기 |
io.flush() |
출력 버퍼 플러시 |
CLI 플래그
| 플래그 | 설명 |
|---|---|
wippy run -x app:cli |
CLI 프로세스 실행 (terminal.host 자동 감지) |
wippy run -x app:cli --host app:term |
명시적 터미널 호스트 |
wippy run -x app:cli -v |
상세 로깅 포함 |