Ruby Gems, Gemfile & Bundler (The Ultimate Guide)

Co to jest Ruby gem?

Gem jest pakietem, który możesz pobrać & zainstalować. Kiedy wymagasz zainstalowanego gema dodajesz dodatkową funkcjonalność do swojego programu Ruby.

Gemy pozwalają Ci na:

  • Dodanie funkcji logowania do Twojej aplikacji Rails
  • Łatwą pracę z zewnętrznymi usługami (jak API)
  • Zbudowanie aplikacji internetowej

To tylko kilka przykładów. Każdy gem ma swój własny cel.

Dlaczego używamy gemów?

  • Tak dzielimy się bibliotekami &narzędziami w Rubim
  • Struktura plików &format gemów ułatwia zrozumienie, jak one działają
  • Plik specyfikacji („.spec”), który jest dołączony do każdego gema, opisuje zależności (inne wymagane gemy), dzięki czemu kod ma wszystko, czego potrzebuje do działania

Dzięki RubyGems, mamy bogaty ekosystem pomocnych bibliotek tylko jeden gem install krok od nas!

Lista gemów wymaganych dla danego (nie-gemowego) projektu może być wymieniona w specjalnym pliku zwanym „Gemfile”, dzięki czemu mogą być one automatycznie instalowane przez Bundlera. Oba omówione w dalszej części tego przewodnika.

Jakie są przykłady klejnotów?

  • Rails, i wszystkie jego komponenty (ActiveRecord, ActiveSupport, itd.) są rozprowadzane jako klejnoty Ruby
  • Pry, potężna alternatywa dla irb
  • Nokogiri, popularny parser XML & HTML

Większość klejnotów to czysty kod Ruby.

Kilka klejnotów zawiera rozszerzenie Ruby C dla lepszej wydajności.

To rozszerzenie jest budowane automatycznie podczas instalacji klejnotu. W niektórych przypadkach możesz potrzebować ręcznej instalacji dodatkowego oprogramowania, które nie jest zarządzane przez RubyGems.

Teraz:

Dowiedzmy się więcej o klejnotach budując swój własny &patrząc na pliki, które tworzą klejnot.

Jak zbudować RubyGem

Możesz przygotować pliki dla nowego klejnotu uruchamiając bundle gem <name>.

Na przykład:

bundle gem awesome_gem

Gem składa się z następującej struktury:

├── 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

Ten .gemspec plik jest miejscem, gdzie znajdziesz wszystkie informacje o gemie.

Zawiera on:

  • Nazwa klejnotu
  • Spis treści klejnotu (krótki opis)
  • Nazwa autora
  • Lista zależności
  • Lista plików do dołączenia do klejnotu
  • Opcjonalnie: Adres e-mail autora, adres URL projektu (strona domowa), pliki wykonywalne, rozszerzenia c, długi opis.

Sama wersja gema jest zdefiniowana jako stała w lib/<gem_name>/version.rb.

Tutaj przykładowy gemspec:

Gem::Specification.new do |spec| spec.name = "awesome_gem" spec.version = AwesomeGem::VERSION spec.authors = spec.summary = "Example gem for article about Ruby gems" spec.files = Dir.grep_v(/.gem$/) spec.require_paths = spec.add_development_dependency "bundler", "~> 1.16" spec.add_development_dependency "rake", "~> 10.0" spec.add_development_dependency "minitest", "~> 5.0"end

Tablica require_paths jest miejscem, w którym Ruby będzie szukał twoich plików gem, gdy będziesz ich wymagał. Pozwala to na umieszczenie kodu pod lib/<gem_name>/ & a następnie wymaganie go za pomocą require "<gem_name>/<file_name>".

Na przykład:

Plik o nazwie lib/awesome_gem/parser.rb będzie wymagany jako require "awesome_gem/parser" z dowolnego miejsca w gemie.

Większość swoich wymagań będziesz miał w lib/<gem_name>.rb (jedyny plik w korzeniu /lib).

To jest plik, który zostanie załadowany, gdy require gem!

Następnie:

Linie add_development_dependency definiują klejnoty, których będziesz używał podczas rozwoju.

To są klejnoty takie jak minitest, RSpec, lub pry.

Podczas gdy add_dependency definiuje klejnoty, których używasz jako część swojego kodu.

Gdy zmienisz opis podsumowania & z wartości domyślnych… będziesz w stanie załadować sesję irb z twoim klejnotem używając bin/console programu, który bundle gem tworzy dla ciebie.

Przykład:

$ bin/consoleirb(main):001:0>irb(main):002:0>irb(main):003:0> AwesomeGem=> AwesomeGemirb(main):004:0>irb(main):005:0> AwesomeGem::VERSION=> "0.1.0"

Potem możesz spakować klejnot używając gem build <name>.gemspec &opublikować go na rubygems.org używając gem push.

Czym jest Bundler?

Podczas nauki o klejnotach Ruby możesz również przeczytać o Bundlerze.

Ale czym dokładnie jest Bundler?

Bundler jest narzędziem do zarządzania zależnościami.

Czy RubyGems już sobie z tym nie radzi?

Cóż, radzi sobie… ale tylko dla samych klejnotów.

Twoja zwykła aplikacja Rubiego nie jest zbudowana jako klejnot, więc nie ma tej funkcji.

Dlatego właśnie istnieje Bundler!

Zrozumienie plików Gem

Widziałeś te Gemfile pliki?

To tam piszesz jakie klejnoty chcesz używać w swojej aplikacji Rubiego.

Te klejnoty zostaną załadowane dla Ciebie bez konieczności requireich instalowania.

Plik Gemfile wygląda tak:

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

Bundler (i RubyGems od wersji 2.0) może odczytać ten plik &i zainstalować żądane wersje tych klejnotów.

To jest to, co powinieneś zobaczyć po uruchomieniu polecenia bundle install:

Using turbolinks-source 5.1.0Using turbolinks 5.1.1Using uglifier 4.1.18Using web-console 3.6.2Bundle complete! 18 Gemfile dependencies, 78 gems now installed.Use `bundle info ` to see where a bundled gem is installed.

Teraz:

Czym są te symbole (jak ~>) używane podczas deklarowania wersji dla każdego klejnotu w twoim Gemfile?

Pozwalają one na żądanie zakresu wersji.

Możesz powiedzieć coś w stylu, „Chcę, aby wersja była równa lub większa niż 1.2, ale mniejsza niż 2.0”.

Wyglądałoby to tak:

gem 'puma', '~> 1.2'

Skrót ~> jest skrótem dla tego zakresu:

gem 'puma', '>= 1.2', '

In the case of , it means exactly this:

'>= 5.2.1', '

The more specific the version number is the more restricted the version range will be.

Gemfile Options & Gemfile.lock

You have a few options when requiring a gem inside a Gemfile.

For example:

You may want to pull a gem from a different source, like GitHub.

This is helpful when you need to use the latest version of the project, even if it hasn't been released on rubygems.org yet.

Here's an example:

gem "rails", git: "[email protected]:rails/rails.git"

Możesz przekazać opcję branch, aby użyć kodu z gałęzi, która nie jest master.

gem "awesome_print", git: "[email protected]:awesome-print/awesome_print.git", branch: "v2"

Inną opcją, którą możesz znaleźć jest require: false.

Co to robi?

Powiada ona Bundlerowi, aby nie wymagał automatycznie tego klejnotu za Ciebie. Oznacza to, że będziesz musiał require go w swoim kodzie, kiedy będziesz go potrzebował.

Jest to używane dla klejnotów, które mają ograniczony zakres.

Na przykład:

Klejnoty, których używasz w konkretnym zadaniu rake, ale nie używasz w swoich modelach kontrolerów Rails &. Korzyść jest taka, że oszczędzasz pamięć w swoim kodzie aplikacji, ponieważ ładujesz ten klejnot tylko wtedy, gdy go potrzebujesz.

Możesz również grupować klejnoty według środowiska.

To oznacza, że możesz mieć klejnoty, które są tylko instalowane & ładowane w rozwoju (jak capybara & pry).

Wreszcie, bundler tworzy Gemfile.lock.

Jaka jest różnica?

A Gemfile.lock jest automatycznie generowany & mówi dokładnie, jakie wersje każdego klejnotu zostały zainstalowane.

Bundler zainstaluje te wersje, więc kiedy wdrożysz tę aplikację do produkcji lub udostępnisz swój projekt innym programistom, wszyscy będą pracować z identycznym zestawem klejnotów.

Przydatny klejnot &Komendy bundlera

Komenda Opis
gem list Lista wszystkich zainstalowanych klejnotów. Przyjmuje argument do filtrowania klejnotów według nazwy (przykład: gem list active)
gem which <name> Podaje ścieżkę, gdzie klejnot jest zainstalowany.
gem search <name> Wyszukuje klejnoty ze skonfigurowanych źródeł (domyślnie: rubygems.org). Przyjmuje wyrażenie regularne (przykład: gem search "\Aawesome_").
gem env Wyświetla informacje o twoim środowisku gemów (wersja, ścieżki, konfiguracja).
gem install <name> -v <version> Pozwala zainstalować określoną wersję gema (przykład: gem install sinatra -v 2.0.0).
bundle viz Generuje wizualizację wykresu zależności dla twojego bieżącego projektu.
bundle show Pokazuje informacje o konkretnym klejnocie zainstalowanym przez bundlera. Musi znajdować się wewnątrz folderu z Gemfile.
bundle outdated Wyświetla listę przestarzałych klejnotów w bieżącym projekcie. Może użyć opcji --groups aby je pogrupować.
bundle console Uruchamia sesję irb z klejnotami z Gemfile bieżącego projektu.

Podsumowanie

Poznałeś RubyGems, system pakietów dla Rubiego. Dowiedziałeś się również jak Gem jest zbudowany, co to jest Gemfile, Bundler & różnica między Gemfile & a Gemfile.lock.

Mam nadzieję, że było to dla Ciebie przydatne!

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.