Tụ tập lại đây các cháu, và để ông già kể về những ngày xưa khi cuộc sống khó khăn, và cài gems là một kinh nghiệm đau đầu, rụt tóc, nghiến răng.
Quay lại khi tôi mới bắt đầu Ruby, không có Bundler và gems phải cài theo cách khó. Trong Rails, điều này nghĩa chạy rake gems:install một triệu lần, fix occurring bugs dọc theo đường, cho đến khi command pass với no errors. Hôm nay, chúng ta sẽ tạo gem theo old school way, sau khi nhìn vào gems là gì và chúng hoạt động như thế nào.
Gems, Chúng Là Gì?
RubyGems là cách dễ dàng extend code của bạn với functionality viết bởi người khác. Ví dụ, thay vì viết authentication/authorization code riêng, bạn có thể dùng Devise, hoặc nếu muốn resize uploaded images bạn có thể dùng CarrierWave. Điều này cho phép viết reusable code bạn có thể share với người khác.
Nhưng Chúng Hoạt Động Như Thế Nào?
Dưới dạng cơ bản nhất, gem không gì hơn zipped-up directory chứa code và file <name>.gemspec. File .gemspec này chứa metadata về gem như name, files để load và dependencies.
Command gem install hoặc bundle download zip file từ source và extract nó to hard drive. Bạn có thể find out gem ở đâu bằng chạy bundle info <gem name> hoặc directly open gem directory bằng chạy bundle open <gem name>.
Để load gem vào application, Rubygems monkey-patches function require trong class Kernel. Nó first tries read file from disk và nếu không work, nó then tries resolve file trong each of gems on your system. Once nó find file in gem nó "activates" gem bằng add nó to load path.
Nếu bạn dùng Bundler, nó add each specific gem to load path trong setup call. Điều này save Rubygems hassle của trying to resolve paths. Nó cũng prevent Ruby load different version của gem khác với version selected in Gemfile(.lock).
Làm Sao Tạo Một?
Cách dễ nhất tạo gem của riêng bạn là dùng Bundler generate gem scaffold. Đây bao gồm proper directory structure, license, code of conduct và test environment cho gem.
Tuy nhiên, hôm nay chúng ta sẽ tạo minimalistic gem của riêng mình với just two files, one chứa code và gemspec file chứa metadata. Gem của chúng ta sẽ greet user khi called. Hãy bắt đầu bằng tạo directory cho gem.
mkdir howdy cd howdyTrong directory này, chúng ta tạo lib folder chứa code và howdy.gemspec file chứa metadata. Nó nên trông như sau:
tree . ├── howdy.gemspec └── lib └── howdy.rbHowdy gem của chúng ta có code sau:
lib/howdy.rb
class Howdy def greet "howdy!" end endMinimalistic howdy.gemspec file chứa thông tin về version, author, etc. Nó cũng specify files để keep khi building gem. Điều này prevent users của gem từ phải download unnecessary files như tests và files khác không needed to run gem code.
Gem::Specification.new do |spec| spec.name = "howdy" spec.version = "0.0.1" spec.authors = ["Robert Beekman"] spec.email = ["robert@example.com"] spec.summary = %(Greets the user) spec.description = %(Howdy is a gem that greets the user when called) spec.license = "MIT" spec.files = ["lib/howdy.rb"] endĐể build gem chúng ta dùng command gem build howdy.gemspec. Nó generate howdy-0.0.1.gem file chứa code của bạn. Để make gem available cho người khác, bạn có thể publish nó to rubygems.org với command gem publish.
Recap
Đây là steps needed để tạo và publish very basic gem. Hy vọng bạn enjoy chúng ta diving vào archaeology of gems, và old school way of making them. Như đề cập trước đây này for educational purposes; chúng ta recommend dùng Bundler generate gem scaffold in today's world.
Peace out, youngsters! Nếu bạn có ideas, questions hoặc comments, please don't hesitate to let us know.