Computer >> Máy Tính >  >> Lập trình >> Ruby

Ruby Gems, Gemfile &Bundler (Hướng dẫn cuối cùng)

Đá quý Ruby là gì?

Đá quý là một gói mà bạn có thể tải xuống và cài đặt. Khi bạn yêu cầu một viên đá quý được cài đặt, bạn đang thêm chức năng bổ sung vào chương trình Ruby của mình.

Đá quý cho phép bạn :

  • Thêm tính năng đăng nhập vào ứng dụng Rails của bạn
  • Dễ dàng làm việc với các dịch vụ bên ngoài (như API)
  • Xây dựng một ứng dụng web

Đó chỉ là một số ví dụ. Mỗi viên ngọc đều có mục tiêu riêng.

Tại sao chúng tôi sử dụng đá quý?

  • Đó là cách chúng tôi chia sẻ thư viện và công cụ trong Ruby
  • Cấu trúc và định dạng tệp của gem giúp bạn dễ dàng hiểu cách chúng hoạt động
  • Tệp thông số kỹ thuật (“.spec”) đi kèm với mọi viên ngọc mô tả các phần phụ thuộc (các viên đá quý bắt buộc khác) để mã có mọi thứ cần thiết để hoạt động

Nhờ có RubyGems, chúng tôi có một hệ sinh thái phong phú gồm các thư viện hữu ích chỉ với một gem install đi!

Danh sách các đá quý cần thiết cho một dự án nhất định (không phải đá quý) có thể được liệt kê trên một tệp đặc biệt có tên “Gemfile” để chúng có thể được cài đặt tự động bởi Bundler. Cả hai đều được đề cập sau trong hướng dẫn này.

Một số ví dụ về đá quý là gì?

  • Rails và tất cả các thành phần của nó (ActiveRecord, ActiveSupport, v.v.) được phân phối dưới dạng đá quý Ruby
  • Pry, giải pháp thay thế mạnh mẽ cho irb
  • Nokogiri, một trình phân tích cú pháp XML và HTML phổ biến

Hầu hết các viên đá quý là mã Ruby thuần túy.

Một số đá quý bao gồm phần mở rộng Ruby C để cải thiện hiệu suất.

Tiện ích mở rộng này được tạo tự động cho bạn khi bạn cài đặt đá quý. Trong một số trường hợp, bạn có thể cần phải cài đặt thủ công phần mềm bổ sung không do RubyGems quản lý.

Bây giờ :

Hãy cùng tìm hiểu thêm về đá quý bằng cách xây dựng đá quý của riêng bạn và xem các tệp tạo nên đá quý.

Cách tạo RubyGem

Bạn có thể chuẩn bị các tệp cho một viên ngọc mới bằng cách chạy bundle gem <name> .

Ví dụ :

bundle gem awesome_gem

Đá quý bao gồm cấu trúc sau :

├── awesome_gem.gemspec
├── bin
│   ├── console
│   └── setup
├── Gemfile
├── lib
│   ├── awesome_gem
│   │   └── version.rb
│   └── awesome_gem.rb
├── Rakefile
├── README.md
└── test
    ├── awesome_gem_test.rb
    └── test_helper.rb

.gemspec này tệp là nơi bạn sẽ tìm thấy tất cả thông tin về đá quý .

Nó bao gồm :

  • Tên đá quý
  • Tóm tắt về đá quý (mô tả ngắn)
  • Tên tác giả
  • Danh sách phụ thuộc
  • Danh sách các tệp cần đưa vào gem
  • Tùy chọn:Địa chỉ email của tác giả, URL dự án (trang chủ), tệp thực thi, tiện ích mở rộng c, mô tả dài.

Bản thân phiên bản đá quý được định nghĩa là một hằng số trong lib/<gem_name>/version.rb .

Đây là một ví dụ về gemspec :

Gem::Specification.new do |spec|
  spec.name          = "awesome_gem"
  spec.version       = AwesomeGem::VERSION
  spec.authors       = ["Jesus Castello"]
  spec.summary       = "Example gem for article about Ruby gems"

  spec.files         = Dir['**/**'].grep_v(/.gem$/)

  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.16"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "minitest", "~> 5.0"
end

require_paths mảng là nơi Ruby sẽ tìm kiếm các tệp đá quý của bạn khi bạn yêu cầu. Điều này cho phép bạn đặt mã của mình dưới lib/<gem_name>/ &sau đó yêu cầu nó với require "<gem_name>/<file_name>" .

Ví dụ :

Tệp có tên lib/awesome_gem/parser.rb sẽ được yêu cầu như require "awesome_gem/parser" từ bất kỳ đâu bên trong viên ngọc.

Bạn sẽ có hầu hết các yêu cầu của mình trong lib/<gem_name>.rb (tệp duy nhất ở thư mục gốc của /lib ).

Đó là tệp được tải khi bạn require đá quý!

Tiếp theo :

add_development_dependency dòng xác định đá quý mà bạn sẽ sử dụng trong quá trình phát triển.

Đây là những viên ngọc như minitest, RSpec hoặc pry.

Trong khi add_dependency xác định đá quý mà bạn sử dụng như một phần của mã của mình.

Khi bạn đã thay đổi tóm tắt và mô tả từ các giá trị mặc định… bạn sẽ có thể tải phiên irb với đá quý của mình bằng cách sử dụng bin/console lập trình bundle gem tạo cho bạn.

Ví dụ :

$ bin/console

irb(main):001:0>
irb(main):002:0>
irb(main):003:0> AwesomeGem
=> AwesomeGem
irb(main):004:0>
irb(main):005:0> AwesomeGem::VERSION
=> "0.1.0"

Sau đó, bạn có thể đóng gói đá quý bằng cách sử dụng gem build <name>.gemspec &xuất bản nó lên rubygems.org bằng cách sử dụng gem push .

Bundler là gì?

Trong khi tìm hiểu về đá quý Ruby, bạn cũng có thể đọc về Bundler .

Nhưng chính xác thì Bundler là gì?

Bundler là một công cụ để quản lý sự phụ thuộc .

RubyGems chưa xử lý việc này sao?

Chà, nó có… nhưng chỉ dành cho chính những viên đá quý .

Ứng dụng Ruby thông thường của bạn không được xây dựng dưới dạng đá quý, vì vậy nó không có tính năng này.

Đó là lý do tại sao Bundler tồn tại!

Hiểu về Gemfiles

Bạn đã thấy những Gemfile đó chưa tệp?

Đó là nơi bạn viết những viên ngọc nào bạn muốn sử dụng cho ứng dụng Ruby của bạn .

Những viên ngọc này sẽ được tải cho bạn mà không cần phải require họ.

Một tệp Gem trông giống như thế này :

ruby '2.5.0'

gem 'rails', '~> 5.2.1'
gem 'sqlite3'
gem 'puma', '~> 3.11'
gem 'bootsnap', '>= 1.1.0', require: false

Bundler (và RubyGems kể từ phiên bản 2.0) có thể đọc tệp này và cài đặt các phiên bản được yêu cầu của những viên đá quý này.

Đây là những gì bạn sẽ thấy khi chạy bundle install lệnh:

Using turbolinks-source 5.1.0
Using turbolinks 5.1.1
Using uglifier 4.1.18
Using web-console 3.6.2

Bundle complete! 18 Gemfile dependencies, 78 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

Bây giờ :

Những ký hiệu này là gì (như ~> ) được sử dụng khi khai báo các phiên bản cho mọi viên ngọc trong Gemfile của bạn?

Những điều này cho phép bạn yêu cầu nhiều phiên bản .

Bạn có thể nói những câu như “Tôi muốn phiên bản bằng hoặc lớn hơn 1,2, nhưng nhỏ hơn 2.0”.

Trông giống như sau:

gem 'puma', '~> 1.2'

~> một phím tắt cho phạm vi này :

gem 'puma', '>= 1.2', '< 2.0'

Trong trường hợp của ~> 5.2.1 , nó có nghĩa là chính xác là thế này :

'>= 5.2.1', '< 5.3'

Số phiên bản càng cụ thể thì phạm vi phiên bản càng bị hạn chế.

Tùy chọn Gemfile &Gemfile.lock

Bạn có một số tùy chọn khi yêu cầu một viên ngọc bên trong một Gemfile.

Ví dụ :

Bạn có thể muốn lấy một viên ngọc từ một nguồn khác, chẳng hạn như GitHub.

Điều này hữu ích khi bạn cần sử dụng phiên bản mới nhất của dự án , ngay cả khi nó chưa được phát hành trên rubygems.org.

Đây là một ví dụ:

gem "rails", git: "git@github.com:rails/rails.git"

Bạn có thể chuyển một branch tùy chọn sử dụng mã từ một nhánh không phải là chính.

Như thế này :

gem "awesome_print", git: "git@github.com:awesome-print/awesome_print.git", branch: "v2"

Một tùy chọn khác mà bạn có thể tìm thấy là require: false .

Điều đó có tác dụng gì?

Nó yêu cầu Bundler không tự động yêu cầu đá quý cho bạn. Điều này có nghĩa là bạn sẽ phải require nó trong mã của bạn khi bạn cần.

Điều này được sử dụng cho đá quý có phạm vi giới hạn.

Ví dụ :

Đá quý mà bạn sử dụng trong một nhiệm vụ cào cụ thể, nhưng bạn không sử dụng trong bộ điều khiển và mô hình Rails của mình. Lợi ích là bạn tiết kiệm bộ nhớ trong mã ứng dụng của mình vì bạn chỉ tải viên ngọc đó khi bạn cần.

Bạn cũng có thể nhóm đá quý theo môi trường .

Điều đó có nghĩa là bạn có thể có các đá quý chỉ được cài đặt và tải trong quá trình phát triển (như capybara &pry ).

Cuối cùng, Bundler tạo một Gemfile.lock .

Sự khác biệt là gì?

Một Gemfile.lock được tạo tự động &nó cho biết chính xác phiên bản của mọi viên ngọc đã được cài đặt .

Bundler sẽ cài đặt các phiên bản này để khi bạn triển khai ứng dụng này vào sản xuất hoặc chia sẻ dự án của mình với các nhà phát triển khác, mọi người sẽ làm việc với một bộ đá quý giống hệt nhau.

Các lệnh hữu ích về Gem &Bundler

Lệnh Mô tả
danh sách đá quý Liệt kê tất cả các gem đã cài đặt của bạn. Chấp nhận một đối số để lọc đá quý theo tên (ví dụ:gem list active )
viên ngọc nào Cung cấp cho bạn đường dẫn nơi một viên ngọc được cài đặt.
tìm kiếm đá quý Tìm kiếm đá quý từ các nguồn đã định cấu hình (mặc định:rubygems.org). Sử dụng biểu thức chính quy (ví dụ:gem search "\Aawesome_" ).
gem env Hiển thị thông tin về môi trường đá quý của bạn (phiên bản, đường dẫn, cấu hình).
gem install -v Cho phép bạn cài đặt phiên bản gem cụ thể (ví dụ:gem install sinatra -v 2.0.0 ).
gói viz Tạo hình ảnh trực quan về biểu đồ phụ thuộc cho dự án hiện tại của bạn.
chương trình gói Hiển thị thông tin về một viên ngọc cụ thể được cài đặt thông qua gói. Phải nằm trong thư mục có Gemfile.
gói đã lỗi thời Hiển thị danh sách các viên ngọc lỗi thời trong dự án hiện tại. Có thể sử dụng --groups tùy chọn để nhóm chúng.
bảng điều khiển gói Chạy phiên irb với các đá quý từ Gemfile của dự án hiện tại.

Tóm tắt

Bạn đã tìm hiểu về RubyGems, hệ thống gói cho Ruby. Bạn cũng đã biết cách cấu trúc của một viên ngọc, Gemfile là gì, Bundler và sự khác biệt giữa Gemfile &Gemfile.lock .

Tôi hy vọng bạn thấy điều này hữu ích!

Vui lòng chia sẻ bài viết này, đăng ký nhận bản tin nếu bạn chưa (hơn 9000 nhà phát triển Ruby!) Và xem cuốn sách Ruby của tôi.

Cảm ơn vì đã đọc và chúc một ngày tốt lành 🙂