Библиотеки
Как и в большинстве языков программирования, в Ruby можно использовать широкий набор сторонних библиотек.
Большая часть из них реализована в форме гема. RubyGems – менеджер пакетов Ruby, созданный для упрощения процесса создания, распространения и установки библиотек (в каком-то смысле это распределенный пакетный менеджер, похожий, скажем, на apt-get , но нацеленный на Ruby приложения). С версии Ruby 1.9 RubyGems используются по умолчанию, хотя для предыдущих версий его нужно было устанавливать вручную.
Некоторые другие библиотеки реализованы как архивы (.zip или .tar.gz) исходного кода. Процесс установки может различаться, обычно файл README или INSTALL содержит инструкции по установке.
Давайте взглянем на поиск библиотек и установку их для дальнейшего использования.
Поиск библиотек
Основное место, где хранятся библиотеки — RubyGems.org, предоставляет библиотеки Ruby в виде гемов. Вы можете поискать прямо на сайте или воспользоваться командой gem .
Используя команду gem search -r , вы можете проверить репозиторий RubyGems. Например, gem search -r rails вернет список относящихся к Rails библиотек. С опцией —local ( -l ) вы можете произвести локальный поиск среди установленных у вас гемов. Чтобы установить гем, используйте gem install [gem] . Просмотреть список установленных библиотек можно командой gem list . Для более подробной информации о команде gem смотрите ниже или почитайте документацию RubyGems.
Также есть и другие источники библиотек. RubyForge был популярным домом для библиотек Ruby, но в последний год возросла популярность GitHub, как одного из главных хранилищ исходного кода приложений околорубиевой тематики. Намного чаще сейчас исходный код гема размещен на GitHub и сам гем опубликован на RubyGems.org.
The Ruby Toolbox это проект, который позволяет легче исследовать проекты на Ruby с открытым исходным кодом. Там есть категории для различных проблем разработки, содержащие большое количество информации о проектах, вроде даты релиза и активности разработчиков, а также зависимости и рейтинг проекта, основанный на его популярности на RubyGems.org и GitHub.com. Поиск поможет быстрей найти то, что вы ищете.
Еще пару слов о RubyGems
Это был краткий обзор команды gem для вашего повседневного использования. Более подробная документация также доступна, она покрывает все аспекты данной пакетной системы.
Поиск среди доступных гемов
Команда search может быть использована для поиска гемов по названию. Гемы, название которых начинаются с заданной строки, будут отображены в результатах. Например, чтобы найти гемы, относящиеся к “html”:
$ gem search -r html *** REMOTE GEMS *** html-sample (1.0, 1.1)
Флаг —remote / -r показывает, что мы хотим проверить официальный RubyGems.org репозиторий (поведение по-умолчанию). С флагом —local / -l вы можете совершить локальный поиск среди установленных у вас гемов.
Установка гема
Когда вы знаете, какой гем вы желаете установить, например, популярные Rails:
$ gem install rails
Вы даже можете установить определенную версию библиотеки. Просто используйте флаг —version / -v :
$ gem install rails --version 5.0
Список всех гемов
Для просмотра всех локально установленных гемов:
$ gem list
Чтобы получить (очень длинный) список всех гемов, доступных на RubyGems.org:
$ gem list -r
Документация
Документация доступна в вашем терминале:
$ gem help
Например, gem help commands очень полезна, выводит список всех подкоманд команды gem .
Создание своего собственного гема
RubyGems.org содержит несколько инструкций по этой теме. Вы также можете посмотреть в сторону Bundler, полезный инструмент, который поможет вам управлять зависимостями приложений и может быть использован вместе с RubyGems.
Начните сейчас, это легко!
- Попробуйте Ruby! (в своем браузере)
- Ruby за двадцать минут
- В Ruby из других языков
Исследуйте новый мир…
- Документация
- Научные публикации
- Библиотеки
- Истории успеха
Вступайте в дружелюбное и развивающееся сообщество.
- Почтовые рассылки: Разговоры о Ruby в кругу программистов со всего мира.
- Группы пользователей: Познакомьтесь с рубистами рядом с вами.
- Блоги: Читайте о том, что происходит в сообществе Ruby прямо сейчас.
- Ядро Ruby: Помощь в полировке последней версии Ruby.
- Решение проблем: Сообщайте или помогайте решать проблемы в Ruby.
RubyGems — Ruby: Настройка окружения
В поставку Ruby входит утилита gem, через которую ставятся, обновляются и удаляются зависимости. В целом gem — это часть RubyGems , механизма управления библиотеками или пакетами в Ruby.
Каждая библиотека в Ruby называется гемом. Программисты так и говорят: «Давайте использовать вот этот гем». Список всех гемов можно найти:
- На сайте RubyGems
- В модерируемом каталоге RubyToolbox , в котором гемы разбиты по категориям
Как и у любого пакетного менеджера, у RubyGems есть пути, по которым можно ставить библиотеки и менять переменные окружения. Такое может понадобиться при работе с Docker.
Чтобы увидеть настройки RubyGems, нужно набрать команду gem env :
# Очень помогает в отладке RubyGems Environment: - RUBYGEMS VERSION: 3.2.32 - RUBY VERSION: 3.0.3 (2021-11-24 patchlevel 157) [x86_64-darwin21] - INSTALLATION DIRECTORY: /Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0 - USER INSTALLATION DIRECTORY: /Users/myname/.gem/ruby/3.0.0 - RUBY EXECUTABLE: /Users/myname/.asdf/installs/ruby/3.0.3/bin/ruby - GIT EXECUTABLE: /usr/local/bin/git - EXECUTABLE DIRECTORY: /Users/myname/.asdf/installs/ruby/3.0.3/bin - SPEC CACHE DIRECTORY: /Users/myname/.gem/specs - SYSTEM CONFIGURATION DIRECTORY: /Users/myname/.asdf/installs/ruby/3.0.3/etc - RUBYGEMS PLATFORMS: - ruby - x86_64-darwin-21 - GEM PATHS: # Пути по которым происходит установка гемов - /Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0 - /Users/myname/.gem/ruby/3.0.0 - GEM CONFIGURATION: - :update_sources => true - :verbose => true - :backtrace => false - :bulk_threshold => 1000 - REMOTE SOURCES: - https://rubygems.org/ - SHELL PATH: - /Users/myname/.asdf/installs/ruby/3.0.3/bin - /usr/local/sbin - /Users/myname/.asdf/shims - /Users/myname/.asdf/bin - /usr/local/bin - /usr/bin - /bin - /usr/sbin - /sbin
Обратите внимание на GEM PATHS. В Ruby все гемы по умолчанию ставятся в общую директорию, а не в директорию проекта. То есть неважно откуда мы выполняем команду установки, все гемы будут лежать в одном месте. Тогда возникает вопрос, как RubyGems работает с разными версиями одной и той же библиотеки? Очень просто, имя директории гема включает в себя и версию:
ls /Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems aasm-5.2.0 omniauth-2.0.4 abbrev-0.1.0 omniauth-github-2.0.0 actioncable-6.1.4.1 omniauth-oauth2-1.7.2 actionmailbox-6.1.4.1 omniauth-rails_csrf_protection-1.0.0 actionmailer-6.1.4.1 open-uri-0.1.0 actionpack-6.1.4.1 open3-0.1.1 actionpack-7.0.0 openssl-2.2.1 actiontext-6.1.4.1 optparse-0.1.1 actionview-6.1.4.1 orm_adapter-0.5.0
Несколько примеров того, как работать с гемами:
# Линтер на Ruby # По умолчанию установка происходит в системные директории gem install rubocop Fetching rubocop-1.25.1.gem Fetching parser-3.1.1.0.gem Successfully installed parser-3.1.1.0 Successfully installed rubocop-1.25.1 Parsing documentation for parser-3.1.1.0 Installing ri documentation for parser-3.1.1.0 Parsing documentation for rubocop-1.25.1 Installing ri documentation for rubocop-1.25.1 Done installing documentation for parser, rubocop after 18 seconds 2 gems installed # 2 потому что с зависимостями rubocop -v 1.25.1 # HTTP-клиент # https://github.com/lostisland/faraday gem install faraday # Тут вывод 2 gems installed irb # Проверяем в repl # Имя для включения почти всегда соответствует названию гема irb(main):001:0> require 'faraday' => true irb(main):002:0> response = Faraday.get('https://ru.hexlet.io') => # . irb(main):003:0> response.status => 200
RubyGems модифицирует пути загрузки, по которым инструкция require производит поиск Ruby-кода. Каждый раз когда выполняется require , RubyGems всего лишь добавляет директорию lib гема в этот список путей.
(main):002:0> $LOAD_PATH => ["/Users/kirillmokevnin/.asdf/plugins/ruby/rubygems-plugin", "/Users/kirillmokevnin/.asdf/installs/ruby/3.0.3/lib/ruby/site_ruby/3.0.0", "/Users/kirillmokevnin/.asdf/installs/ruby/3.0.3/lib/ruby/site_ruby", "/Users/kirillmokevnin/.asdf/installs/ruby/3.0.3/lib/ruby/vendor_ruby/3.0.0", "/Users/kirillmokevnin/.asdf/installs/ruby/3.0.3/lib/ruby/vendor_ruby", "/Users/kirillmokevnin/.asdf/installs/ruby/3.0.3/lib/ruby/3.0.0"] irb(main):003:0> require 'faraday' # Включение irb(main):004:0> $LOAD_PATH => # Обратите внимание на пути до faraday ["/Users/myname/.asdf/plugins/ruby/rubygems-plugin", "/Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/faraday-net_http-2.0.1/lib", "/Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/ruby2_keywords-0.0.5/lib", "/Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/faraday-2.2.0/lib", "/Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/faraday-2.2.0/spec/external_adapters", "/Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/site_ruby/3.0.0", "/Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/site_ruby", "/Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/vendor_ruby/3.0.0", "/Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/vendor_ruby", "/Users/myname/.asdf/installs/ruby/3.0.3/lib/ruby/3.0.0"]
Все это так же работает и через файлы.
# index.rb require 'faraday' response = Faraday.get('https://ru.hexlet.io') puts response.status
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Что такое gem в ruby
Unpack the mystery behind what’s in a RubyGem.
Structure of a Gem
Each gem has a name, version, and platform. For example, the rake gem has a 13.0.6 version (from Jul 2021). Rake’s platform is ruby , which means it works on any platform Ruby runs on.
Platforms are based on the CPU architecture, operating system type and sometimes the operating system version. Examples include “x86-mingw32” or “java”. The platform indicates the gem only works with a ruby built for the same platform. RubyGems will automatically download the correct version for your platform. See gem help platform for full details.
Inside gems are the following components:
- Code (including tests and supporting utilities)
- Documentation
- gemspec
Each gem follows the same standard structure of code organization:
% tree freewill freewill/ ├── bin/ │ └── freewill ├── lib/ │ └── freewill.rb ├── test/ │ └── test_freewill.rb ├── README ├── Rakefile └── freewill.gemspec
Here, you can see the major components of a gem:
- The lib directory contains the code for the gem
- The test or spec directory contains tests, depending on which test framework the developer uses
- A gem usually has a Rakefile , which the rake program uses to automate tests, generate code, and perform other tasks.
- This gem also includes an executable file in the bin directory, which will be loaded into the user’s PATH when the gem is installed.
- Documentation is usually included in the README and inline with the code. When you install a gem, documentation is generated automatically for you. Most gems include RDoc documentation, but some use YARD docs instead.
- The final piece is the gemspec, which contains information about the gem. The gem’s files, test information, platform, version number and more are all laid out here along with the author’s email and name.
The Gemspec
The gemspec specifies the information about a gem such as its name, version, description, authors and homepage.
Here’s an example of a gemspec file. You can learn more in how to make a gem.
% cat freewill.gemspec Gem::Specification.new do |s| s.name = 'freewill' s.version = '1.0.0' s.summary = "Freewill!" s.description = "I will choose Freewill!" s.authors = ["Nick Quaranto"] s.email = 'nick@quaran.to' s.homepage = 'http://example.com/freewill' s.files = ["lib/freewill.rb", . ] end
For more information on the gemspec, please check out the full Specification Reference which goes over each metadata field in detail.
Credits
This guide was adapted from Gonçalo Silva’s original tutorial on docs.rubygems.org and from Gem Sawyer, Modern Day Ruby Warrior.
RubyGems.org is the Ruby community’s gem hosting service. Instantly publish your gems and install them. Use the API to interact and find out more information about available gems. Become a contributor and enhance the site with your own changes.
RubyGems — подробно
Для начала определимся с понятиями:
RubyGems — фрэймворк для установки и запаковки Ruby библиотек и приложений.
gem — пакет(файл) с библиотекой или приложением. Имеет стандартизированный вид и расположен в хранилище в сети.
gem command tool — RubyGems предоставляет утилиту «gem» для работы с gem пакетами из командной строки. Она интегрирована с Ruby и позволяет получать доступ к установленным gem’ам как к библиотекам.
В чем же предназначение RubyGems?
До того как появилась RubyGems, для установки новой библиотеки нужно было найти, скачать её, попытаться установить, часто лишь для того, чтобы убедиться в отсутствии нужных зависимостей. Если же библиотека запакована с помощью RubyGems, достаточно попросить RubyGems сделать это за нас и получить установленную, интегрированную библиотеку со всеми нужными зависимостями. В дополнение ко всему утилита gem — платформонезависима, неважно какую ОС вы используете, везде механизм установки библиотек и приложений будет одинаков. Здорово, правда?
Под катом будут описаны:
1) Поиск, получение деталей, установка gem’s
2) Доступ документации по установленному gem
3) Использование установленных gem’s
4) Работа с версиями gem’s
5) Создание собственных gem’s
1. Поиск, получение деталей, установка gem’s
Допустим в вашем текущем проекте генерируется много XML. И где то вы слышали, что есть замечательная библиотека Jim Weirich’s Builder library, которая позволит вам создавать XML прямо в коде Ruby.
Посмотрим, доступна ли она в качестве gem:
% gem query —details —remote —name-matches build
*** REMOTE GEMS ***
AntBuilder (0.4.3)
Author: JRuby-extras
Homepage: jruby-extras.rubyforge.org
AntBuilder: Use ant from JRuby. Only usable within JRuby
builder (2.1.2)
Author: Jim Weirich
Homepage: onestepback.org
Builders for MarkUp.
.
—details — отображает детали о найденном gem
—remote — ищет на удалённом хранилище (—locale — поиск на локальной машине)
—name-matches build — фильтрует gem’s по содержанию строки ‘build’ в имени
Номер около названия каждого gem, показывает последнюю версию.
Список всех доступных версий для определённого gem, запустим команду list с опцией —all:
% gem list —details —remote —all builder
*** REMOTE GEMS ***
builder (2.1.2, 2.1.1, 2.0.0, 1.2.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0, 1.1.0,
1.0.0, 0.1.1, 0.1.0)
Author: Jim Weirich
Homepage: onestepback.org
Builders for MarkUp.
Для установки самой последней версии:
% gem install builder #RubyGems сам выберет последнюю
По умолчанию (если вы не используете RVM), для установки gem’s используются общие системные директории, так что под Unix нужно добавлять sudo перед командой gem.
Список уже установленных на вашем компьютере gem’s:
gem list
*** LOCAL GEMS ***
builder (2.1.2)
2. Чтение документации по установленному gem
Мы установили gem builder, возникает вопрос, как с ним работать?
В большинстве случаев gem содержит документацию, она хранится в /doc директории, например:
#Узнаем путь где хранятся наши gem’s
% gem environment gemdir
/usr/local/lib/ruby/gems/1.9.0
/usr/local/lib/ruby/gems/1.9.0/doc — здесь лежит документация к установленным gem’s
/usr/local/lib/ruby/gems/1.9.0/doc/builder-2.1.2/rdoc/index.html — полный путь к документации gem’а builder в моём случае
Есть 2 способа читать документацию:
1. Заходить в директорию с документацией гема и запускать файл index.html
2. Более простой способ, запустить web сервер, командой % gem server
По умолчанию он запустится на порту 8808 и будет доступен по ссылке localhost:8808
В браузере вы увидите документацию на все установленные gem’s.
Путь к директории с gem’s и порт могут быть перезаданы с помощью опций -p и -d
3. Использование установленных gem’s
После установки gem, достаточно написать команду require , чтобы подключить его. Т.е. работа с гемами не отличается от работы с обычными библиотеками.
# пример генерации XML с помощью установленной нами библиотеки require 'builder' xml = Builder::XmlMarkup.new(target: STDOUT, indent: 2) xml.person(type: "programmer") do xml.name do xml.first "Dave" xml.last "Thomas" end xml.location "Texas" xml.preference("ruby") end
4. Работа с версиями gem’s
Что если последняя вышедшая версия используемого вами gem не совместима с той которую вы используете сейчас?
К счастью, RubyGems позволяет нам одновременно хранить несколько версий gem. Указанные ниже команды установят обе версии builder.
% gem install builder -v 2.1.2
% gem install builder -v 1.1.0
% gem list builder
*** LOCAL GEMS ***
builder (2.1.2, 1.1.0)
#Подключение builder v.1.1.0 gem 'builder', '= 1.1.0' require 'builder' xml = Builder::XmlMarkup.new(STDOUT, 2) xml.person do name("Dave Thomas") location("Texas") end
Тут доступны ещё несколько трюков:
gem ‘builder’ , ‘> 1’ — использовать версию больше чем первую
gem ‘builder’ , »>= 2.2.0′, ‘ < 3.0'' — использовать версию больше 2.2.0 и меньше 3.0
Полный список выражений:
= идентичная версия
!= неидентичная версия
> версия больше чем
< версия меньше чем
>= большая и равная версия
~> примерно больше чем (подробнее RubyGems docs)
5. Создание собственных gem’s
- написание кода соответсвующего gem структуре
- создание файла спецификации (ourgem.gemspec)
- создание gem файла
% gem build mygem.gemspec - размещение созданного гема на сервере rubygems.org
%gem push mygem.gemspec
