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

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

2020

Наборы ПО Ruby

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

  • Каталог всех публичных джемов называется rubygems.org
  • Джемы предназначены для решения различных задач
    • Предоставление API для выполнения конкретных действий
    • Инструменты для разработчиков приложений
    • Прикладные приложения
  • Для установки и удаления используйте приложение gem

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

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

Поиск джемов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Глобальная директория для интерпретатора
  • Директория для всех Rails-приложений
  • Директория для текущего приложения

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

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

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

  • Джемы являются общими для проектов
  • Может быть несколько одновременно установленных версий одного и того же джема

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

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

  • chruby — изменить текущий интерпретатор Ruby
  • gem_home — изменить путь к набору джемов
  • rbenv — изменить интерпретатор Ruby
  • rvm — решить все задачи управления наборами джемов, установки и изменения интерпретаторов

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

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

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

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

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

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

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

Поиск джема

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

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

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

  • Source Code — сайт с исходным кодом джема
  • Wiki — информационные страницы проекта
  • Documentation — ссылка на документацию проекта

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

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

  • bin — исполняемые файлы джема
  • lib — библиотечные файлы джема
  • test — каталог с автоматическими тестами
  • Gemfile — список зависимостей джема
  • Rakefile — конфигурация автоматических задач
  • README.md — краткое описание джема для людей
  • .gemspec — спецификация джема

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

  • Название, например simple-gem
  • Версия, например 1.0.5
  • Описание краткое и полное

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

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

  • Как вместе редактировать общий исходный код?
  • Как отслеживать задачи, которые необходимо решить?
  • Какие типы автоматических тестов надо написать для проверки работы приложения?
  • Какие версии джемов необходимы для работы приложения и для поддержания разработки?
  • Как следует оформлять исходный код приложения?

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

  • Система контроля версий решает задачу совместного редактирования кода
  • Трекер задач позволяет координировать работу людей

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

Джем Bundler

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

  • Позволяет сформировать список джемов, использующихся при разработке, тестировании и поставке приложения
  • Позволяет запускать приложение в окружении джемов, которые указаны в списке, изолируя от мусора
  • Позволяет фиксировать конкретные версии необходимых джемов
  • Позволяет обновить версии зафиксированных джемов
  • Позволяет сохранять джемы локально в проект для переноса на другие системы

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

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

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

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

  • source указывает источник для получения джем-файлов
    • Источников может быть несколько в одном файле
    • Сайт rubygems.org — источник публичных джемов
  • gem указывает джем, который надо установить
    • Первый аргумент — название джема
    • Последующие указывают ограничения на версии

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

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

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

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

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

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

  • Для отображения списка команд выполните

  • Для получения помощи по конкретной команде выполните $ bundle help <command>, вместо <command> надо написать название команды: $ bundle help add

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

  • $ bundle console — запустить IRB-сессию с установленными джемами
  • $ bundle clean — удалить неиспользуемые версии джемов, что скорее всего сломает другие проекты
  • $ bundle config — настроить Bundle

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

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

  • с исправлениями ошибок, в том числе безопасности
  • с добавлением новой, необходимой функциональности

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Разрабатываются новые подходы к решению задач
  • В новых версиях языка добавляются более выразительные средства программирования

Джем Rubocop

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

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

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

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

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

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

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

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

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

Настройка Rubocop

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

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

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

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

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

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

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