Computer >> Máy Tính >  >> Lập trình >> Ruby

Cách xây dựng ứng dụng dòng lệnh (CLI) với Ruby

Nhiều người quên rằng Ruby có thể làm những thứ không phải là ứng dụng web. Trong bài viết này, tôi muốn hướng dẫn bạn cách tạo một ứng dụng dòng lệnh để giúp khắc phục điều đó!

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

  • psql
  • rails
  • bundler
  • gem
  • git

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

Bạn sẽ tìm hiểu về :

  • Mảng ARGV
  • Thư viện OptParse
  • Viên ngọc Thor

Hãy bắt đầu!

Hằng số ARGV Ruby

Các ứng dụng dòng lệnh thường có nhiều tùy chọn hoặc 'cờ'.

Ví dụ :

psql --help

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

Sử dụng ARGV mảng.

Nếu bạn có mã sau trong tệp có tên argv.rb :

p ARGV

Và nếu bạn chạy mã này bằng cách sử dụng ruby argv.rb test abc 1 2 3 , bạn sẽ nhận được điều này:

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

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

Bạn có thể kiểm tra xem một tùy chọn cụ thể đã được thông qua hay chưa bằng cách triển khai trình phân tích cú pháp tùy chọn.

Đây là một ví dụ :

Tùy chọn trường hợp
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 nó như thế này :

ruby argv.rb -v -c

Bạn sẽ thấy :

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

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

Cách sử dụng Thư viện phân tích cú pháp tùy chọn

Ruby đi kèm với OptionParser mà bạn có thể sử dụng để phân tích cú pháp các tùy chọn dòng lệnh.

Đây là một 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 số lợi ích khi sử dụng optparse qua giải pháp tùy chỉnh của riêng bạn.

Ví dụ :

  • Bạn có thể có -v ngắn gọn &phiên bản dài --verbose của mọi cờ mà không cần làm thêm
  • Mỗi tùy chọn đều có mô tả, mô tả này sẽ là một phần của menu trợ giúp
  • Menu trợ giúp được tạo tự động cho bạn, vì vậy bạn không phải cập nhật thủ công mỗi khi thêm hoặc xóa các tùy chọn

Đây là menu trông như thế nào :

Cách xây dựng ứng dụng dòng lệnh (CLI) với Ruby

Phần tốt nhất?

Tất cả những thứ này đều được tích hợp sẵn trong Ruby nên không cần cài đặt gì cả!

Cách sử dụng viên ngọc Thor

Nếu bạn đang tìm kiếm một cách tiếp cận khác để phân tích cú pháp tùy chọn, bạn nên xem qua viên ngọc Thor. Đây là những gì Rails sử dụng.

Trong Rails, bạn làm những việc như :

  • rails new
  • rails generate
  • rails console

Để (một phần) tạo lại rails lệnh bạn có thể làm 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)

Trình đơn trợ giúp trông như thế này :

Cách xây dựng ứng dụng dòng lệnh (CLI) với Ruby

Đây là một kiểu rất khác so với OptionParser

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

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

Thư viện Ruby Readline

Bạn có muốn tạo một ứng dụng có giao diện tương tác như pry không hoặc psql ?

Kiểm tra Readline mô-đun giúp bạn thực hiện việc này.

Đây là một ví dụ :

prompt = "> "

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

Thao tác này sẽ cung cấp cho bạn lời nhắc và phản hồi lại bất cứ điều 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ẽ lưu lại lịch sử của mọi thứ bạn nhập và nó sẽ cho phép bạn tìm kiếm lịch sử của mình bằng ctrl+r hoặc Readline::HISTORY.to_a bên trong mã của bạn.

Với Readline bạn cũng có thể triển khai những thứ như tự động hoàn thành, hãy xem liên kết này để biết ví dụ.

Xem hướng dẫn bằng video

Kết luận

Ngay cả khi bạn là người thích GUI, các ứng dụng dòng lệnh có thể rất mạnh mẽ và thú vị để xây dựng.

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