0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>По историческим причинам, утилита<em>gem</em>не умеет управлять зависимостями конкретного проекта. С ее помощью нельзя легко указать зависимости, поставить их одной командой и разделить на основные зависимости и зависимости для разработки. Поэтому ее, в основном, используют для установки гемов, которые нужны в системе глобально, например линтера.</p>
1
<p>По историческим причинам, утилита<em>gem</em>не умеет управлять зависимостями конкретного проекта. С ее помощью нельзя легко указать зависимости, поставить их одной командой и разделить на основные зависимости и зависимости для разработки. Поэтому ее, в основном, используют для установки гемов, которые нужны в системе глобально, например линтера.</p>
2
<p>Для полноценного управления зависимостями используется гем<a>bundler</a>, который включен в RubyGems и поставляется с ним по умолчанию. В этом уроке, мы научимся подключать его к проекту и разберемся с некоторыми особенностями работы.</p>
2
<p>Для полноценного управления зависимостями используется гем<a>bundler</a>, который включен в RubyGems и поставляется с ним по умолчанию. В этом уроке, мы научимся подключать его к проекту и разберемся с некоторыми особенностями работы.</p>
3
<h2>Установка зависимостей</h2>
3
<h2>Установка зависимостей</h2>
4
<p>Работа с Bundler начинается с создания файла<a>Gemfile</a>в котором указываются зависимости. Сам файл использует Ruby-код для своего описания:</p>
4
<p>Работа с Bundler начинается с создания файла<a>Gemfile</a>в котором указываются зависимости. Сам файл использует Ruby-код для своего описания:</p>
5
<p>Когда в файл добавлены зависимости, нужно выполнить их установку:</p>
5
<p>Когда в файл добавлены зависимости, нужно выполнить их установку:</p>
6
<p>Во время установки<em>bundler</em>создаст файл<em>Gemfile.lock</em>, в котором фиксируются версии всех зависимостей включая транзитивные. Любой последующий запуск команды<em>install</em>будет ориентироваться на версии указанные в этом файле. Сам<em>lock</em>-файл должен храниться в git-репозитории.</p>
6
<p>Во время установки<em>bundler</em>создаст файл<em>Gemfile.lock</em>, в котором фиксируются версии всех зависимостей включая транзитивные. Любой последующий запуск команды<em>install</em>будет ориентироваться на версии указанные в этом файле. Сам<em>lock</em>-файл должен храниться в git-репозитории.</p>
7
<p>Благодаря<em>lock</em>-файлу, в Ruby не принято указывать версии гемов в<em>Gemfile</em>, они и так зафиксированы. Технически указать версии можно и иногда это бывает важно, когда, по какой-то причине нужно зафиксировать версию:</p>
7
<p>Благодаря<em>lock</em>-файлу, в Ruby не принято указывать версии гемов в<em>Gemfile</em>, они и так зафиксированы. Технически указать версии можно и иногда это бывает важно, когда, по какой-то причине нужно зафиксировать версию:</p>
8
<p>Для обновления зависимостей используется команда bundle update:</p>
8
<p>Для обновления зависимостей используется команда bundle update:</p>
9
<p>Добавляют гемы прямым прописыванием в файле<em>Gemfile</em>. В Bundler есть команда добавления гема, но она мало полезна из-за того, как Bundler работает с разделением сред.</p>
9
<p>Добавляют гемы прямым прописыванием в файле<em>Gemfile</em>. В Bundler есть команда добавления гема, но она мало полезна из-за того, как Bundler работает с разделением сред.</p>
10
<h2>Группировка гемов</h2>
10
<h2>Группировка гемов</h2>
11
<p>В Bundler нет предустановленного разделения на продакшен- и девелопмент-зависимости, как, например, в JavaScript. Единственное, что он предоставляет, это механизм группировки гемов.</p>
11
<p>В Bundler нет предустановленного разделения на продакшен- и девелопмент-зависимости, как, например, в JavaScript. Единственное, что он предоставляет, это механизм группировки гемов.</p>
12
<p>Группировка - обобщенный механизм, с его помощью можно создавать любое количество сред, в которых мы хотим запускать код. В примере выше есть не только продакшен (все что вне групп) и разработка, но и группа для тестов. Эти зависимости используются и подключаются только во время запуска тестов.</p>
12
<p>Группировка - обобщенный механизм, с его помощью можно создавать любое количество сред, в которых мы хотим запускать код. В примере выше есть не только продакшен (все что вне групп) и разработка, но и группа для тестов. Эти зависимости используются и подключаются только во время запуска тестов.</p>
13
<p>По умолчанию команда bundle install устанавливает все гемы, включая те что указаны внутри групп. Чтобы установить только конкретную группу, ее можно указать явно:</p>
13
<p>По умолчанию команда bundle install устанавливает все гемы, включая те что указаны внутри групп. Чтобы установить только конкретную группу, ее можно указать явно:</p>
14
<p>Гемы указанные вне групп будут установлены в любом случае, так как, по смыслу, они нужны всем.</p>
14
<p>Гемы указанные вне групп будут установлены в любом случае, так как, по смыслу, они нужны всем.</p>
15
<p>Сами гемы устанавливаются в стандартные пути RubyGems, а не локально в проект. Это позволяет экономить место если проектов на Ruby много, но не подходит в том случае, если мы работаем, например, в Docker. Поэтому путь для установки гемов<a>иногда меняют</a>на<em>vendor/bundle</em>.</p>
15
<p>Сами гемы устанавливаются в стандартные пути RubyGems, а не локально в проект. Это позволяет экономить место если проектов на Ruby много, но не подходит в том случае, если мы работаем, например, в Docker. Поэтому путь для установки гемов<a>иногда меняют</a>на<em>vendor/bundle</em>.</p>
16
<p>Эта команда создаст файл<em>.bundle/config</em>, в котором будет указан путь установки. Bundler использует эту конфигурацию во время своей работы.</p>
16
<p>Эта команда создаст файл<em>.bundle/config</em>, в котором будет указан путь установки. Bundler использует эту конфигурацию во время своей работы.</p>
17
<h2>Интеграция в проект</h2>
17
<h2>Интеграция в проект</h2>
18
<p>Bundler появился намного позже чем RubyGems, поэтому он не включается автоматически. Для подключения Bundler, во входном файле нужно добавить сверху такой код:</p>
18
<p>Bundler появился намного позже чем RubyGems, поэтому он не включается автоматически. Для подключения Bundler, во входном файле нужно добавить сверху такой код:</p>
19
<p>В этом случае в пути загрузки добавятся все гемы из всех групп. Если нужно указать конкретные группы, то код меняется на такой:</p>
19
<p>В этом случае в пути загрузки добавятся все гемы из всех групп. Если нужно указать конкретные группы, то код меняется на такой:</p>
20
<p>Когда гемов становится много, то постоянные включения зависимостей начинают сильно разрастаться. Bundler может взять эту работу на себя и включить все нужные зависимости сразу во время настройки:</p>
20
<p>Когда гемов становится много, то постоянные включения зависимостей начинают сильно разрастаться. Bundler может взять эту работу на себя и включить все нужные зависимости сразу во время настройки:</p>
21
<p>В целом, прямая работа с подключением Bundler нужна редко. В прикладных проектах типа Rails, весь процесс инициализации скрыт от программиста. А для библиотек используется автоматическая генерация кода.</p>
21
<p>В целом, прямая работа с подключением Bundler нужна редко. В прикладных проектах типа Rails, весь процесс инициализации скрыт от программиста. А для библиотек используется автоматическая генерация кода.</p>