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:
psqlrailsbundlergemgit
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--verbosecho 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:

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 newrails generaterails 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:

Đâ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 🙂