Джемы, зависимости, библиотеки

Андрей Васильев

2020

Наборы ПО Ruby

Наборы ПО Ruby носят имя gem (джем), драгоценный камень

Каталог джемов является публичным, и разместить джемы там могут любые разработчики

Базовые команды инструмента gem

Поиск джемов

Для поиска по имени в каталоге используйте команду search

$ gem search png # Поиск по строке 'png'

Удобно использовать также и сайт https://rubygems.org

Установка джемов

Для установки джема по имени используйте команду install

По умолчанию установка включает в себя шаг генерации документации, для его отключения и ускорения установки используйте опцию --no-doc

$ gem install chunky_png # Установка 'chunky_png'
$ gem install --no-doc chunky_png # Без документации

Базовые команды инструмента gem

Отображение списка установленных джемов

Команда list показывает список установленных джемов

$ gem list # Список локальных джемов

Удаление джемов

Команда uninstall удаляет указанные джемы

$ gem uninstall chunky_png

Накопление мусора

При установке джемов ставятся также и их зависимости

Со временем количество неиспользуемых джемов будет расти

Местоположение установленных джемов

Когда вы ставите джем, то он устанавливается в специальную директорию, которая привязана к Ruby-интерпретатору, а не к конкретному проекту. Эта директория определяется в переменной окружения GEM_HOME, для её просмотра в UNIX-системах воспользуйтесь $ echo $GEM_HOME, $ echo %GEM_HOME% в Windows

gem можно настроить на использование нескольких директорий для хранения джемов:

Для просмотра текущей конфигурации и выяснения местоположения этих директорий используйте команду gem env и посмотрите на список GEM PATHS.

Особенности установки джемов

Джемы устанавливаются в каталог конкретной версии интерпретатора, не разделяются между интерпретаторами

Как решить проблему общих джемов

Есть специальные инструменты, которые позволяют создать отдельные наборы джемов на уровне установок

bundler — программное решение для создания наборов джемов

Просмотр документации

Если во время установки джема вы поставили документацию, тогда её можно посмотреть с помощью встроенных средств

Инструмент ri позволяет просмотреть документацию

$ ri chunky_png

Вы можете запустить встроенный сервер для просмотра документации

$ gem server

Большинство джемов предоставляют отдельные сайты с детальной документацией, ссылки на них можно найти на сайте rubygems.org. Это является рекомендованным на настоящий момент способом

Использование ресурса rubygems.org

Поиск джема

  1. Открыть сайт https://rubygems.org
  2. Ввести имя джема в поисковую строку
  3. Нажать кнопку поиска
  4. Выбрать подходящий джем из списка

Просмотр важной информации по джему

На странице описания джема есть важные ссылки

Структура джема

cool_gem
├── bin
│   ├── console
│   └── setup
├── CODE_OF_CONDUCT.md
├── cool_gem.gemspec
├── Gemfile
├── lib
│   ├── cool_gem
│   │   └── version.rb
│   └── cool_gem.rb
├── LICENSE.txt
├── Rakefile
├── README.md
└── spec
    ├── cool_gem_spec.rb
    └── spec_helper.rb

Структура джема, расшифровка

Ключевые параметры спецификации

Проблемы совместной разработки

Для эффективной совместной работы команда должна придти к общему пониманию по ряду ключевых вопросов. Часть из них изложена ниже.

Варианты решения

Далее мы рассмотрим инструменты, которые дают ответ на последние два вопроса и являются стандартными инструментами в Ruby-сообществе

Джем Bundler

Джем bundler является стандартом де-факто в Ruby сообществе для управления зависимостями разрабатываемого проекта

Документация по проекту доступна на https://bundler.io

Для начала использования bundler его необходимо установить

$ gem install bundler

Список зависимостей, Gemfile

Набор необходимых джемов в Bundler указывается в Gemfile

source 'https://rubygems.org'
gem 'nokogiri'
gem 'rack', '~> 2.0.1'
gem 'rspec'

Установка зависимостей с Bundler

Процесс установки зависимостей с Bundler очень прост:

  1. Установить джем bundler: $ gem install bundler
  2. Создать файл Gemfile в каталоге проекта, если его нет. Можно воспользоваться командой: $ bundle init
  3. Указать в файле источник для скачивания джемов
  4. Указать в файле список джемов-зависимостей
  5. Выполнить команду $ bundle install
$ gem install bundler
$ bundle init
$ bundle install

Установка зависимостей на других компьютерах

После выполнения установки был создан Gemfile.lock, его тоже необходимо переносить на другие компьютеры — там указаны конкретные версии джемов, а не пожелания

Если вы перенесли все необходимые для приложения и bundler файлы, то на других компьютерах необходимо:

  1. Перейти в каталог с проектом (где лежат Gemfile и Gemfile.lock)
  2. Установить джем bundler, если он не установлен

    $ gem install bundler
  3. Установить все зависимости с указанными версиями

    $ bundle install

Добавление новых джемов в набор

Добавление новых джемов в набор

Процесс добавления достаточно прост:

  1. Добавить новую запись в Gemfile
  2. Выполнить команду $ bundle install для установки

Использование команды add

Если у вас уже есть Gemfile, тогда можно воспользоваться командой $ bundle add для установки джемов

$ bundle add write_xlsx

Команда добавит строку в Gemfile и установит джем

Получение информации о функциях Bundler

Bundler предоставляет обширную документацию по встроенным командам, которую можно прочитать локально

Интересные команды

Обновление версий джемов

Обычно в Gemfile указаны пожелания, а в Gemfile.lock конкретные версии приложений. Бывает необходимо обновить версию джема из-за выхода новой версии

Для решения этой задачи обновления зафиксированных версий

  1. Исправьте строки в Gemfile, укажите нужные версии
  2. Выполните команду $ bundle update chunky_png. Команда обновит версию джема chunky_png в Gemfile.lock и установит его

По умолчанию Bundler поставит самые последние версии, которые удовлетворяют вашим ограничениям. Обязательно проверяйте работоспособность вашего ПО после обновления версий. Наилучший способ — это запуск автоматизированных тестов

Запуск приложений в рамках набора джемов

Команда $ bundle exec <command> позволяет запустить приложение в контексте установленного набора джемов

Для запуска приложения в рамках набора используйте

$ bundle exec ruby bin/application.rb

В таком случае в приложении application.rb можно будет подключить только джемы из набора Bundler

Также можно запускать исполняемые файлы джемов

$ bundle exec rubocop lib
$ bundle exec rspec spec/my_spec.rb

Программное ограничение доступных джемов

Если Вы используете Bundler, то при создании приложения удобно его подключать прямо из Ruby-кода, чтобы сэкономить на длине команды для запуска приложения

Полную информацию по данной функции можно прочитать в официальной документации.

Для подключения всех зависимостей достаточно добавить в главный файл следующее

require 'rubygems'
require 'bundler/setup'
require 'nokogiri'

После этого следующие варианты запуска приложения будут равнозначны

$ bundle exec ruby bin/app.rb
$ ruby bin/app.rb

Лучшие практики по применению Ruby

Ruby является очень выразительным языком, позволяющим решить задачу многими способами. За время жизни языка некоторые из способов были признаны сложными для восприятия и не рекомендуются к использованию

Для поддержания хорошего стиля кодирования на Ruby был разработан Ruby Style Guide, который также был переведён на русский язык

Данное руководство постоянно дорабатывается, так как практики по использованию языка постоянно изменяются:

Джем Rubocop

Джем Rubocop проверяет исходный код на соответствие Ruby Style Guide, а также внутренним требованиям команды

Установку джема в Bunler рекомендуется выполнять так:

gem 'rubocop', require: false

Проверка исходного кода

Для проверки всех файлов в текущем каталоге достаточно вызывать исполняемый файл джема:

$ bundle exec rubocop

Для проверки конкретных файлов и директорий:

$ bundle exec rubocop lib bin/application.rb

Автоматическое исправление расхождений

Поначалу прочитать руководство, воспринять его и следовать ему бывает сложно. Для решения простейших проблем джем Rubocop предоставляет режим автоматического исправления:

$ bundle exec rubocop -a

Важно! автоматическое исправление может привести к поломке кода. Если Bundler нарушил работу вашего приложения, то это ваша обязанность и удовлетворить его требованиям, и вернуть работоспособность коду

Для ускорения проверки, её можно запустить в несколько потоков с помощью ключа -p, --parallel:

$ bundle exec rubocop -p

Настройка Rubocop

Данный инструмент можно достаточно гибко настраивать, чтобы он смог удовлетворить конкретным требованиям команды. Про его настройку можно прочитать в официальной документации.

Настройка производится путём редактирования файла .rubocop.yml, который обычно находится в корне проекта. Ниже представлен конфигурационный файл, который будем использовать в рамках курса

Metrics/AbcSize:      # Отключение ABC-проверок
  Enabled: false
Metrics/LineLength:   # Длина строк 100
  Max: 100
Metrics/MethodLength: # Количество строк кода 15
  Max: 15
Style/NegatedIf:      # Не форсировать unless
  Enabled: false

Настройка Rubocop. Продолжение

Rubocop поддерживает отключение проверок для конкретного участка кода. Для этого необходимо добавить соответствующие комментарии:

# rubocop:disable Metrics/LineLength
[...]
# rubocop:enable Metrics/LineLength

Настройка Rubocop для лабораторных работ

В рамках учебного процесса будем использовать настройки из предыдущего экрана. Вам запрещается отключать проверки или редактировать файл .rubocop.yml.

Если вы считаете, что исправления кода согласно требованиям Rubocop делают его хуже, тогда надо для каждого такого случая подготовить разъяснение. Оно должно включать в себя исправленный код и сравнительный анализ вашего текущего кода и исправленного.