Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby로 명령줄 애플리케이션(CLI) 구축하는 방법: ARGV부터 Thor까지

Ruby는 웹 애플리케이션 외에도 다양한 작업을 수행할 수 있는 언어지만, 많은 개발자들이 이 사실을 잊곤 합니다. 이 글에서는 Ruby로 명령줄 애플리케이션(CLI)을 구축하는 방법을 단계별로 알아보겠습니다.

다음은 여러분이 이미 익숙할 수 있는 명령줄 도구들입니다:

  • psql
  • rails
  • bundler
  • gem
  • git

CLI 애플리케이션을 만드는 방법은 여러 가지가 있으며, 이 글에서는 그중 세 가지에 집중해 살펴보겠습니다.

이 글에서 배울 내용:

  • ARGV 배열
  • OptionParser 라이브러리
  • Thor 젬(gem)

그럼 시작해 보겠습니다!

Ruby의 ARGV 상수

명령줄 애플리케이션은 보통 여러 옵션 또는 '플래그(flag)'를 입력받습니다.

예를 들면:

psql --help

그렇다면 Ruby에서는 이런 옵션들에 어떻게 접근할 수 있을까요?

바로 ARGV 배열을 사용하면 됩니다.

argv.rb라는 파일에 다음 코드를 작성하고,

p ARGV

ruby argv.rb test abc 1 2 3으로 실행하면 아래와 같은 결과를 얻습니다.

["test", "abc", "1", "2", "3"]

모든 옵션이 담긴 배열이 출력됩니다!

옵션 파서를 직접 구현하면 특정 옵션이 전달되었는지 확인할 수도 있습니다.

다음은 그 예제입니다:

def process_argv(option)
  case option
  when "-h"
    puts "This is the help menu."
    puts "  -v Enable verbose mode"
    puts "  -c Enable syntax highlighting"
    exit
  when "-v"
    @options[:verbose] = true
  when "-c"
    @options[:syntax_highlighting] = true
  end
end

@options = {}

ARGV.each { |option| process_argv(option) }

p @options

이렇게 실행하면:

ruby argv.rb -v -c

다음과 같은 결과가 출력됩니다:

{:verbose=>true, :syntax_highlighting=>true}

간단한 작업에는 이 정도면 충분하지만, 규모가 큰 애플리케이션을 개발할 계획이라면 다른 솔루션을 고려하는 편이 좋습니다.

OptionParser 라이브러리 활용법

Ruby에는 명령줄 옵션을 파싱할 때 사용할 수 있는 OptionParser 클래스가 기본으로 내장되어 있습니다.

사용 예제는 다음과 같습니다:

require 'optparse'

@options = {}

OptionParser.new do |opts|
  opts.on("-v", "--verbose", "Show extra information") do
    @options[:verbose] = true
  end

  opts.on("-c", "--color", "Enable syntax highlighting") do
    @options[:syntax_highlighting] = true
  end
end.parse!

p @options

직접 구현한 방식 대신 optparse를 사용하면 여러 가지 장점을 누릴 수 있습니다.

대표적인 장점은 다음과 같습니다:

  • 별도의 추가 작업 없이 -v 같은 축약형과 --verbose 같은 전체 형식의 플래그를 동시에 지원할 수 있습니다
  • 각 옵션에 설명을 붙일 수 있고, 이 설명이 도움말 메뉴에 자동으로 표시됩니다
  • 도움말 메뉴가 자동 생성되므로, 옵션을 추가하거나 삭제할 때마다 수동으로 수정할 필요가 없습니다

생성된 도움말 메뉴의 모습:

Ruby로 명령줄 애플리케이션(CLI) 구축하는 방법: ARGV부터 Thor까지

무엇보다 좋은 점은 무엇일까요?

이 모든 기능이 Ruby에 내장되어 있어 별도로 설치할 것이 전혀 없다는 것입니다!

Thor 젬 활용법

옵션 파싱에 대한 또 다른 접근 방식을 찾고 있다면 Thor 젬을 살펴보세요. Rails 역시 바로 이 Thor를 사용합니다.

Rails에서는 다음과 같은 명령어들을 사용하죠:

  • rails new
  • rails generate
  • rails console

rails 명령어를 (부분적으로) 재현하려면 다음과 같이 작성할 수 있습니다:

require 'thor'

class RailsCLI < Thor
  class_option :verbose, :type => :boolean, :aliases => "-v"

  desc "new DIRECTORY", "Create a new rails app"

  def new
    # ...
  end

  desc "generate THING PARAMETERS", "Generate controller / model / migration"

  def generate
    # ...
  end

  desc "console", "Start a rails console"

  def console
    # ...
  end
end

RailsCLI.start(ARGV)

생성된 도움말 메뉴는 다음과 같습니다:

Ruby로 명령줄 애플리케이션(CLI) 구축하는 방법: ARGV부터 Thor까지

OptionParser와 비교했을 때 스타일이 상당히 다릅니다...

...따라서 몇 가지 변수 옵션으로 하나의 작업만 수행하는 앱이라면 최선의 선택이 아닐 수 있습니다.

하지만 rails처럼 다양한 작업을 수행하는 복합적인 명령어라면 Thor가 훌륭한 선택이 될 것입니다!

Ruby Readline 라이브러리

prypsql처럼 대화형 인터페이스를 갖춘 애플리케이션을 만들고 싶으신가요?

그렇다면 Readline 모듈을 확인해 보세요. 이 모듈이 바로 그 작업을 도와줍니다.

사용 예제는 다음과 같습니다:

prompt = "> "

while buf = Readline.readline(prompt, true)
  puts "Your input was: '#{buf}'"
end

이 코드를 실행하면 프롬프트가 표시되고, 엔터 키를 누를 때마다 입력한 내용이 그대로 되돌려져 출력됩니다.

프로그램을 종료하려면 CTRL+C를 누르면 됩니다.

Readline은 입력한 모든 내용의 히스토리를 자동으로 유지하며, ctrl+r을 사용해 히스토리를 검색하거나, 코드 안에서 Readline::HISTORY.to_a로 히스토리에 접근할 수 있습니다.

또한 Readline을 활용하면 자동 완성(autocomplete) 같은 기능도 구현할 수 있습니다. 자세한 예제는 관련 문서 링크를 참고하세요.

영상 튜토리얼

마치며

GUI 환경을 선호하는 개발자라 할지라도, 명령줄 애플리케이션은 매우 강력하며 만드는 과정 자체도 즐겁습니다.

오늘 배운 내용을 직접 실습해 보면서 나만의 CLI 애플리케이션을 만들어 보세요 🙂