Как работает bundler в Ruby?
До этого работал только с Python и начал разбираться с Jekyll для блога с деплоем через GitHub Actions. Мне казалось, что gem - аналог pip в Python, а bundle - аналог pipenv. Попытался добавить в Gemfile jekyll-admin и установить его через bundle install
, он мне выплюнул ошибку прав доступа.
Ruby, gem, bundle и jekyll ставил глобально:
sudo apt install ruby ruby-dev build-essential
sudo gem install bundler jekyll
cd /opt
sudo jekyll new blog.shershulya.ru
sudo chown -R norden:norden /opt/blog.shershulya.ru
Мне казалось, что bundle создат виртуальное окружение в домашней директории пользователя и установит туда все Gem из Gemfile (как это сделал бы pipenv). Это не так работает?
Ответы (1 шт):
В целом вы правы, но bundle не создает виртуальное окружение. Основная его задача собрать неконфликтующую сборку gem-ов и зафиксировать ее в Gemfile.lock. При этом Gemfile.lock собирается автоматически, вручную работа ведется в файле Gemfile. Если в системе отсутствуют гемы с указанными в Gemfile.lock версиями - они будут установлены. При этом если вы просто запустите проект, например, рельсовый
rails s
Вот далеко не факт, что будут задействованы те гемы, которые вы указали в Gemfile. Могут быть задействованы версии из других проектов. Чтобы гарантировать, чтобы у вас использовались гемы из Gemfile.lock, проект следует запустить через bundler
bundle exec rails s
Т.е. все библиотеки хранятся в куче, иногда по несколько версий от самых разных проектов, но вы можете отобрать нужные при помощи bundle exec.
Вы конечно не спрашивали, но вот так через sudo устанавливать ruby чревато проблемами. Вы поставите его для root, экосистема так не используется и можно столкнуться с массой ошибок, которые особо никто не правит. Так как через root-а никто не работает. Удалить потом ruby очень не просто. Кроме того, связка гемов очень чувствительна к версии языка программирования. Обычно ставят менеджер версии rvm, rbenv, asdf. Причем ставят из под обычного пользователя.
Создание "аля" виртуальных пространств по аналогии с pip вроде раньше поддерживал менеджер версий rvm (возможно уже нет, сейчас в новых проектах чаще используется asdf). По крайней мере менеджеры проектов при использовании bundle exec дадут вам тот же уровень контроля, что и виртуальное окружение в python-стеке.