🔥 첫 번째 커맨드 만들기

349자
5분

Swift Argument Parser를 사용해서 첫 번째 커맨드를 만들어 보겠습니다. 우리가 만들 커맨드 이름은 count입니다. 이 커맨드는 아래처럼 실행할 수 있어요.

% count readme.md readme.counts
Counting words in 'readme.md' and writing the result into 'readme.counts'.
 
shell

ParsableCommand 프로토콜 준수하기

우선 ParsableCommand 프로토콜을 준수하는 타입을 정의해 보겠습니다.

import ArgumentParser
 
@main
struct Count: ParsableCommand {
    @Argument var inputFile: String
    @Argument var outputFile: String
 
    mutating func run() throws {
        print("""
            Counting words in '\(inputFile)' \\
            and writing the result into '\(outputFile)'.
            """)
 
        // 'inputFile'을 읽고, 단어를 세고, 'outputFile'에 저장합니다.
    }
}
 
swift

위 코드에서 inputFileoutputFile 프로퍼티는 @Argument 프로퍼티 래퍼를 사용합니다. ArgumentParser는 이 래퍼를 사용해서 커맨드 라인에서 입력받은 값을 프로퍼티에 저장합니다. 이때, 프로퍼티 선언 순서에 따라 커맨드 라인 입력값 위치가 결정됩니다.

예를 들어, 위 코드에서 inputFile 프로퍼티를 먼저 선언했기 때문에, 커맨드 라인에서 첫 번째로 입력한 값이 inputFile에 저장됩니다. 그 다음으로 입력한 값은 outputFile에 저장되는 식이죠.

따라서 아래처럼 커맨드를 실행하면:

% count input.txt output.txt
 
shell

Counting words in 'input.txt' and writing the result into 'output.txt'. 을 출력합니다.

이렇게 커맨드 라인 입력값 위치에 따라 어떤 프로퍼티에 값이 저장될지 결정되는 걸 "위치 기반 커맨드 라인 입력"이라고 부릅니다.

커맨드 로직 구현하기

커맨드 로직은 run() 메서드에서 구현합니다. 여기서는 사용자가 입력한 파일 이름을 확인하는 메시지를 출력합니다. (완성된 커맨드 전체 구현은 이 가이드 끝에서 찾을 수 있습니다.)

프로그램 진입점 지정하기

마지막으로 @main 속성을 적용하여 Count 커맨드를 프로그램 진입점으로 지정합니다. 커맨드를 실행할 때, ArgumentParser 라이브러리는 커맨드 라인 인자를 파싱하고, Count에서 정의한 것과 일치하는지 확인한 후, run() 메서드를 호출하거나 도움말 메시지와 함께 종료합니다.

참고

Swift 컴파일러는 @main으로 표시된 타입 또는 main.swift 파일을 실행 파일 진입점으로 사용합니다. 둘 중 하나를 사용할 수 있지만, 둘 다 사용할 수는 없습니다. @main을 추가할 때는 main.swift 파일 이름을 커맨드 이름으로 바꿉니다. 이 경우에는 파일 이름을 Count.swift로 바꿉니다.

이렇게 해서 첫 번째 커맨드를 만들어 봤습니다. ParsableCommand 프로토콜을 준수하는 타입을 정의하고, @Argument 프로퍼티 래퍼를 사용해서 위치 기반 커맨드 라인 인자를 받아오고, run() 메서드에서 커맨드 로직을 구현했죠. 마지막으로 @main 속성을 적용해서 프로그램 진입점으로 지정했습니다.

참고로 위 소스코드를 컴파일하고 실행하기 위해서 아래와 같이 명령어를 입력합니다.

% swift build
% cd .build
% cd debug
% ./count input.txt output.txt
text