Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Xây dựng công cụ CLI Ruby mạnh mẽ: Hướng dẫn từng bước

Nhiều người quên rằng Ruby có thể làm những thứ không phải ứng dụng web. Trong bài này, tôi muốn chỉ cho bạn cách xây dựng ứng dụng dòng lệnh để khắc phục điều đó!

Dưới đây là một số ứng dụng dòng lệnh bạn có thể quen thuộc:

  • psql
  • rails
  • bundler
  • gem
  • git

Có nhiều cách xây dựng ứng dụng dòng lệnh & trong bài này chúng ta sẽ tập trung vào ba trong số đó.

Bạn sẽ học về:

  • Mảng ARGV
  • Thư viện OptParse
  • Gem Thor

Hãy bắt đầu!

Hằng số ARGV trong Ruby

Ứng dụng dòng lệnh thường nhận nhiều tùy chọn hoặc 'flags'.

Ví dụ:

psql --help

Làm thế nào để truy cập các tùy chọn này trong Ruby?

Dùng mảng ARGV.

Nếu bạn có code sau trong file tên argv.rb:

p ARGV

Và nếu bạn chạy code này dùng ruby argv.rb test abc 1 2 3, bạn sẽ nhận được:

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

Đó là mảng với tất cả tùy chọn!

Bạn có thể kiểm tra xem tùy chọn cụ thể đã được truyền bằng cách triển khai option parser.

Ví dụ:

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

Nếu bạn chạy như sau:

ruby argv.rb -v -c

Bạn sẽ thấy:

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

Điều này hoạt động cho việc đơn giản, nhưng nếu bạn muốn viết ứng dụng lớn hơn, bạn có thể muốn xem xét giải pháp khác.

Cách dùng Thư viện Option Parser

Ruby đi kèm class OptionParser mà bạn có thể dùng để parse tùy chọn dòng lệnh.

Ví dụ:

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

Bạn nhận được một vài lợi ích khi dùng optparse so với giải pháp tự viết.

Ví dụ:

  • Bạn có thể có phiên bản ngắn -v & phiên bản dài --verbose cho mọi flag mà không tốn công sức thêm
  • Mọi tùy chọn có mô tả, sẽ là phần của menu help
  • Menu help được tự động xây dựng cho bạn, nên bạn không phải cập nhật thủ công mỗi khi thêm/bớt tùy chọn

Menu trông như sau:

Xây dựng công cụ CLI Ruby mạnh mẽ: Hướng dẫn từng bước

Phần hay nhất?

Tất cả điều này built-in trong Ruby nên không có gì để cài đặt!

Cách dùng Gem Thor

Nếu bạn tìm cách tiếp cận khác cho option parsing, bạn nên xem gem Thor. Đây là thứ Rails dùng.

Trong Rails bạn làm điều như:

  • rails new
  • rails generate
  • rails console

Để (một phần) tái tạo lệnh rails, bạn có thể làm gì đó như sau:

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)

Menu help trông như sau:

Xây dựng công cụ CLI Ruby mạnh mẽ: Hướng dẫn từng bước

Đây là phong cách rất khác so với OptionParser…

…và nó có thể không phải lựa chọn tốt nhất cho app của bạn nếu nó chỉ làm một việc với vài tùy chọn biến đổi.

Nhưng nếu bạn có lệnh như rails, dùng cho nhiều task khác nhau, thì Thor là lựa chọn tuyệt vời!

Thư viện Ruby Readline

Bạn có muốn xây dựng ứng dụng với giao diện tương tác như pry hoặc psql?

Hãy xem module Readline, giúp bạn làm điều này.

Ví dụ:

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

Điều này sẽ cho bạn một prompt, và echo lại bất cứ gì bạn viết sau khi nhấn enter.

Bạn có thể kết thúc chương trình bằng cách nhấn CTRL+C.

Readline sẽ giữ lịch sử mọi thứ bạn gõ, và cho phép bạn tìm kiếm lịch sử dùng ctrl+r, hoặc Readline::HISTORY.to_a trong code của bạn.

Với Readline bạn cũng có thể triển khai auto-completion, xem link này cho ví dụ.

Xem Video Tutorial

Kết luận

Dù bạn là người thích GUI, ứng dụng dòng lệnh có thể rất mạnh mẽ và vui để xây dựng.

Hãy thử & bắt đầu xây dựng của riêng bạn ngay hôm nay 🙂