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.
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:
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 lib
chứ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
.
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:
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`
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