Hỏi - đáp Nơi cung cấp thông tin nghề nghiệp và giải đáp những thắc mắc thường gặp của bạn

Gems vs Engines: Know the difference

Bạn có biết sự khác biệt giữa gems và engines? Nếu bạn đã biết, bài viết này có thể sẽ không đem lại sự thú vị với bạn. Nết bạn chưa biết, bạn nên tham khảo bài viết này bởi vì hiểu biết sự khác biệt giữa chúng thật sự rất quan trọng, đặc biệt nếu bạn đang có ý định trong việc tạo ra những thư viện riêng của bạn.

What’s a gem?

Gem đơn giản được hiểu là một gói thư viện Ruby. Một thư viện chỉ là tập dòng lệnh cung cấp một tập các chức năng dùng sẵn cho người dùng. Bản chất để so sánh sự khác biệt duy nhất giữa engine và gem đó là sự thuần túy code Ruby trong đó. Định nghĩa một gem bao gồm:

  • Đặc tả của gem
  • Thư mục thư viện
  • Có thể được đóng gói và lưu trên rubygems servers
  • Có thể được sử dụng trong bất kỳ project nào khi khai báo tên gem tham chiếu(khi gem được lưu trên servers)

Create a gem

Việc tạo một gem khác là đơn giản. Tất cả bạn cần tạo thực ra là một thư mục libchứa một file được đặt tên là my_gem.rb và một file là my_gem.gemspec. Khi có những file cần thiết này, bạn có thể sử dụng lệnh gem build my_gem.gemspec để đóng gói và tạo ra một gem. Gói dữ liệu này có thể được đẩy lên rubygems servers hoặc được cài đặt tại chính local với lệnh gem install my_gem-x.x.x.gem. Cuối cùng, nếu muốn gem của bạn được lưu trên server, bạn có thể dùng lệnh gem push my_gem-x.x.x.gem. Một khi gem của bạn được công khai sử dụng trên server, bạn có thể dễ dàng cài đặt nó với gem install my_gem.

What's a engine?

Engines thực ra chúng là các gem. Tất cả engines có thể là gem(khi đã đóng gói) nhưng không phải tất cả các gems đều là engine. Engines là một tính năng của Ruby on Rails(feature). Đó chính là sự khác biệt nằm trong đó. Chúng được sử dụng trong một ứng dụng Ruby on Rails, chúng có thể chứa những thực thể tạo nên một ứng dụng Ruby on Rail như: models, controllers, views, migrations,.. Chúng được tối giản trong một ứng dụng Ruby on Rails và không thể tự hoạt động khi không có tương tác trong một ứng dụng Ruby on Rails có trước. Định nghĩa một engine bao gồm:

  • Đặc tả Gemspec
  • Các thực thể rails: models, controllers, views, migrations, initializers,..
  • Có thể được đóng gói và lưu trên rubygems servers
  • Chỉ được sử dụng trong ứng dụng Rails

Creating an engine

Engines có thể được tạo bằng câu lệnh

$ rails plugin new my_engine --mountable

hoặc

$ rails plugin new my_engine --full`

Để đóng gói và cài đặt một engine, bạn có thể sử dụng câu lệnh giống câu lệnh cho gem. Building:

$ gem build my_engine.gemspec`

Cài đặt local:

$ gem install my_engine-x.x.x.gem`

Lưu trên server:

$ gem push my_engine-x.x.x.gem`

Kết luận

Gem là một thư viện Ruby thuần túy có thể bao gồm các tính năng Ruby on Rails. Engine vẫn có thể được đóng gói như một gem bình thường nhưng chỉ có thể hoạt động bên trong một chương trình Ruby on Rails.

Via Viblo