Ruby Ecosystem

Ruby không chỉ đơn thuần là một ngôn ngữ. Nó có cả ngàn công cụ và quy trình hỗ trợ để tạo ra các phần mềm phức tạp. Điều này làm cho người mới khó tiếp cận, vậy nên việc viết ra bài này sẽ làm cho mọi thứ rõ ràng hơn.

1. Version Management

Giả sử bạn có 2 dự án có sử dụng cùng 1 gem, nhưng là khác phiên bản. Dự án sử dụng phiên bản mới hơn thì không tương thích với phiên bản cũ. Bạn sẽ làm gì trong tình huống này?

Có 1 lựa chọn, đó là cài ngay phiên bản mà bạn cần ở thời điểm này. Tuy nhiên, đó không hẳn là giải pháp tốt, bởi vì một hoặc hai phiên bản có thể phụ thuộc vào những thành phần khác trong Gemfile hoặc gemspec. Thực sự vấn đề này rất khó để kiểm soát.

Thay vào đó, hầu hết lập trình viên ruby quản lý các phiên bản dựa trên version manager. Version manager không chỉ giữ cho gems gọn gàng và còn tách bạch các phiên bản ruby rất tốt. Điều này thực sự dễ dàng để test giữa những phiên bản khác nhau, ví dụ như ruby 2.0 và ruby 2.1.

Những version management phổ biến hiện nay như:

Dưới đây là cách làm thế nào để quản lý phiên bản ruby với RVM:

cài đặt RVM

$ \curl -sSL https://get.rvm.io | bash

Khai báo source RVM trong shell

$ echo "source $HOME/.rvm/scripts/rvm" >> ~/.bash_profile

Nạp lại vào shell

$ source ~/.bash_profile

Kiểm tra lại việc khai báo đã thành công chưa

$ type rvm | head -n 1
rvm is a shell function from /Users/justin/.rvm/scripts/cli

Cài đặt phiên bản ruby (2.0.0) và sử dụng:

$ rvm install 2.0.0
$ rvm use 2.0.0

Tạo gemset cho 2.0.0 có tên là "experimental" và sử dụng nó:

$ rvm gemset create experimental
$ rvm gemset use experimental

2. Gems

Đóng gói code không phải là thứ duy nhất trong ruby. Vào năm 2003, rubyforge.org khởi đầu là nơi để các lập trình viên chia sẻ code. Mặc dù đã cải thiện được một chút, xong các lập trình viên mong muốn có thể sử dụng được code của nhau. Vào tháng 11 năm 2003, một số lập trình viên đã cùng nhau giải quyết vấn đề đó. Năm 2004, rubygem.com đã được khởi xướng, cùng với nó là công cụ gem.

RubyGem là một gói quản lý thư viện ruby và nhiều chương trình. Dưới đây là cặp lý do có thể có cho việc tạo ra Ruby gem:

  • Dễ dàng chia sẻ code cho những lập trình viên khác.
  • Tránh trùng lặp code giữa những dự án

Việc cài đặt gem thì dễ dàng:

$ gem install gem_name

Bố cục cho một gem cơ bản trong 1 dự án sẽ giống như sau:

- spec
  - gem_name_spec.rb
  - spec_helper.rb
- bin
  - gem_name
- lib
  - gem_name.rb
  - gem_name
    - source_file1.rb
    - source_file2.rb
    - source_file...
    - version.rb
- Gemfile
- gem_name.gemspec
- README.md
- LICENSE
- Rakefile

3. Ruby implementations

Có nhiều triển khai của ngôn ngữ Ruby. Phổ biến nhất bao gồm:

  • MRI/CRuby -- triển khai ruby được viết bằng C
  • JRuby - Ruby chạy trên Java Virtual Machine
  • Rubinius - được viết bằng ruby, chạy trên LLVM
  • RubyMotion - dùng ruby để viết ứng dụng ios/adroid native

Ngoài ra còn nhiều triển khai khác nữa ở đây

Có vẻ là có quan niệm về việc đa luồng không hoạt động trong ruby. Đa luồng thì bị giới hạn trong CRuby(MRI), nhưng nó cung cấp khả năng để 2 tác vụ trên cùng một luồng. Điều quan trọng là hiểu được sự khác nhau của 2 khái niệm: concurrencyparallelism:

  • concurrency - thực hiện 2 hoặc nhiều tác vụ trong cùng thời gian (ví dụ như là đang download file trong khi đang chờ để thấy được người sử dụng tương tác với giao diện)
  • parallelism - thực hiện 2 hoặc nhiêu tác vụ đồng loạt trên nhiều vi xử lý.

MRI có global interpreter lock(GLI), vậy nên mỗi thời điểm chỉ sử dụng một luồng xử lý. Điều này có nghĩa là Ruby thread có thể chạy kiêm nhiệm chứ không phải song song. Nếu thực thi code trên nhiều vi xử lý được yêu cầu trong MRI, forking hoặc một vài thay đổi để kết hợp xử lý phải được dùng đến (ít nhất là đến khi GLI được gọi ra nếu chưa gọi), Có nhiều Ruby Implementation thiếu mất GLI, bao gồm danh sách ở trên. Trong danh sách này, forking không phải là kỹ thuật có sẵn trong JVM, vậy nên trong JRuby bạn có khá nhiều để sử dụng đa luồng.

Chi tiết hơn bạn có thể đọc bài viết sau về forking

4. Documentation

Khi một gem được cài đặt, bạn sẽ chú ý tới thông báo về tài liệu rdocri đã được cài đặt. RDoc là một tài liệu nhúng được tạo ra cho Ruby. ri là một man - giống như một tài liệu được sử dụng trong terminal.

$ ri Array
$ ri Array#length
$ ri Match::sqrt

Khi sử dụng một version manager, nó có thể cần thiết để tạo ra tài liệu. Ví dụ:

$ rvm docs generate

Việc cài đặc gem với tài liệu đi kèm nhiều lúc cũng không cần thiết. Vậy nên chúng ta có thể loại bỏ chúng ra khỏi trong quá trình cài đặt bằng cách:

$ gem install gem_name --no-rdoc --no-ri

5. Bundler

Bundler là một ruby gem. Bundler có chức năng là cung cấp một môi trường thích hợp cho Ruby project bằng cách theo dõi và cài đặt chính xác những gem và phiên bản cần.

Bundler là một giải pháp cho việc quản lý các phụ thuộc gem, và đảm bảo bạn cần đúng gem bạn muốn theo môi trường làm việc: development, staging, production. Để bắt đầu làm việc với một project, đơn giản là bundle install

6. Testing

Cộng đồng ruby xem việc thực hiện test là một việc rất nghiêm túc. Có nhiều framework sử dụng cho việc test như:

  • Test::Unit
  • RSpec
  • Minitest
  • Cucumber

Test::Unit được xem như là framework test cơ bản dành cho ruby. Tuy nhiên, với những người ủng hộ Minitest thì họ phải đối việc sử dụng Test::Unit.

7. Tổng kết

Như vậy, hệ sinh thái dành cho ngôn ngữ Ruby rất phong phú. Đây cũng là lý do mà những lập trình viên rất thích thú để tiếp cận tới ngôn ngữ này. Điều đó cũng giải thích cho việc cộng đồng ruby trên thế giới đang ngày càng một lớn mạnh so với những ngôn ngữ khác.

Bài viết tham khảo: