🔥 첫 번째 커맨드 만들기
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
위 코드에서 inputFile
과 outputFile
프로퍼티는 @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