Это сборник статей, отвечающих на типичные вопросы студентов в курсе Thinknetica - Продвинутый Rails.
Здесь так же собирается информация, необходимая для обновления используемых в курсе версий Ruby, Rails и других библиотек.
Я использую MacOS для разработки на Ruby, в этой статье опишу свой флоу менеджмента софта. С некоторыми комментариями он подходит для Ubuntu Linux.
Разрабатывать на Ruby под Windows имхо невозможно без серьезного скила жонглирования docker контейнерами, это выходит за рамки данной статьи. Ну либо ставить Ubuntu на виртуалку / юзать WSL.
Отсюда удобно ставить казуальный софт - софт, который вы используете как обычный пользователь, не как разработчик. Сюда относятся Telegram, Slack, Notion, Trello и другое, что можно найти в AppStore. Поставленный отсюда софт проверен Apple и централизованно обновляется, что очень удобно. Дополнительно я ставлю отсюда Xcode, хотя для Ruby разработки можно поставить только Xcode Command line tools, включающие консольный Git и компиляторы
xcode-select --install
В Ubuntu есть собственный магазин приложений. Его удобно использовать схожим образом для GUI софта, консольные же утилиты удобнее ставить через менеджер apt-get, аналогом которого для Mac является Homebrew.
Homebrew: The Missing Package Manager for macOS (or Linux)
MacOS AppStore ориентирован на GUI программы, и консольных *nix утилит в нем нет. Тем не менее MacOS хорошо совместима с *nix на уровне исходников, и нам необходим только репозиторий скомпилированных программ и тул для управления их установкой. Как раз это и дает нам Homebrew. Кстати, он написан на Ruby.
Установка делается в одну команду, документация доступна на сайте brew.sh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Homebrew предоставляет менеджмент обновлений программ и управление зависимостями, аналогичное apt в Ubuntu. Можно оценить мощь этого менеджера, установив ffmpeg.
brew install ffmpeg
Многие версии программ в Homebrew представлены разными версиями, например Postgresql или Mysql. Это дает некоторую гибкость и возможность выбрать необходимый софт
ineedjet@shae ~/P/r/rubycats> brew instal postgresql@<TAB> postgresql@10 postgresql@11 postgresql@12 postgresql@13 postgresql@14 postgresql@15 postgresql@16
ineedjet@shae ~/P/r/rubycats> brew install mysql@<TAB> mysql@5.7 mysql@8.0
Homebrew отлично подходит для установки программ, не требующих особо точного соответствия версий. Я устанавливаю отсюда Postgresql, Redis, Rabbitmq, Imagemagick, да вообще все консольные *nix утилиты. По сути все, что не является языками программирования, на которых я пишу. В Homebrew есть удобный инструмент сервисов, который запускает службы при входе в систему
ineedjet@shae ~/P/r/rubycats> brew services list Name Status User File postgresql@14 started ineedjet ~/Library/LaunchAgents/homebrew.mxcl.postgresql@14.plist redis started ineedjet ~/Library/LaunchAgents/homebrew.mxcl.redis.plist unbound none
Отдельная большая часть Homebrew - это Homebrew Cask. Этот плагин расширяет Homebrew возможностью устанавливать программы, которые обычно устанавливаются из .dmg через механизм "To install, drag this icon…". Cask дает возможность установить GUI программы, разработчики которых не захотели возиться с распространением через AppStore и дает возможность централизованно все обновлять.
Cask не требует какой-то специальной установки - Homebrew обычно сам понимает, что вы хотите использовать Cask. В редких случаях, когда названия консольных *nix утилит и GUI программ для Mac совпадают, может потребоваться явно указать ключ --cask.
ineedjet@shae ~/P/r/rubycats> brew install vlc rubymine
Я устанавливаю отсюда Vlc, TablePlus, RubyMine, qBittorent, Sublime Text, Fork, UTM, Miro и множество другого софта. Для большинства более-менее популярных программ для Mac существуют Cask рецепты. Исключениям будет только софт, принципиально распространяемый вендором через собственный магазин. Это, например, Adobe или Blizzard.
Теперь о языках программирования и версиях Ruby. Homebrew не подходит для сценария, где вам нужен Ruby определенной версии, а это основной сценарий развертывания у себя любого проекта. Для установки и управления Ruby разных версий нужна утилита, которая называется Version manager tool.
Rvm - один из самых первых менеджеров версий для Ruby. Его основная фишка - так называемые гемсеты, которые связывают в гемсет версию Ruby и набор установленных гемов. Название гемсета проекта можно указать в файле .ruby-gemset , гемсет по-умолчанию называется default.
Rbenv пошел другим путем. На практике оказывается не очень удобно иметь большое количество гемсетов с одной и той же версией руби и дублирующимися гемами. Вместо гемсетов rbenv связывает гемы только с версией руби, а использование конкретных версий гемов гарантируется bundler.
ineedjet@shae ~/P/r/rubycats> bundler exec sidekiq
bundler exec ... гарантирует здесь загрузку гемов из Gemfile.lock
Rbenv более модульный и разделен на менеджер версий (сам Rbenv) и тул сборки версий Ruby Ruby-build. Ruby-build можно не ставить, если вы хотите использовать готовые бинарники Ruby из PPA репозитория или другого источника (я рекомендую ставить).
Asdf идет еще дальше, это универсальный менеджер рантайма. При помощи плагинов, он может управлять версиями Ruby, Node.js, Php, Perl, Python их больше сотни. Для рубистов наиболее интересны плагины для Ruby и Node.js.
Asdf предлагает собственный файл конфигурации .tool-versions, в котором можно перечислить все необходимые версии. Дополнительно Asdf поддерживает конфигурацию через файлы .ruby-version .node-version, .nvmrc для совместимости с Rbenv / Rwm и Nvm (это аналогичный менеджер версий для ноды). Для разработки значительно удобнее использовать один менеджер версий для всех возможных языков программирования. Как и Rbenv, Asdf не использует гемсеты и полагается на bundler.
На Mac удобно поставить Asdf из brew. Ставим curl, git и сам asdf
Ставим плагины на Ruby и Node.js
Ставим для примера ruby 3.2.2 и node 18.18.1
ineedjet@shae ~/P/r/rubycats> brew install asdf
В Mac по-умолчанию используется zsh, добавляем в начало .zshrc
~/.zshrc
. $(brew --prefix)/opt/asdf/libexec/asdf.sh
Включаем поддержку файлов .ruby-version и .node-version. Для этого надо создать файл .asdfrc в домашней директории пользователя и включить в нем legacy_version_file = yes
~/.asdfrc
legacy_version_file = yes
Выставляем Global конфигурацию, которая прописывается в файл $HOME/.tool-versions и используется по-умолчанию
ineedjet@shae ~/P/r/rubycats> asdf global nodejs 16.5.0 1 homebrew-asdf! ineedjet@shae ~/P/r/rubycats> asdf global ruby 3.2.2 homebrew-asdf! ineedjet@shae ~/P/r/rubycats> cat $HOME/.tool-versions homebrew-asdf! nodejs 16.5.0 ruby 3.2.2
Для сборки Ruby разных версий Asdf использует Ruby-build.
Для Linux можно использовать метод установки через git clone. Ставим curl, git
ineedjet@shae ~/P/r/rubycats>sudo apt-get install curl, git
Клонируем asdf
ineedjet@shae ~/P/r/rubycats> git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1
В ubuntu по-умолчанию используется bash, добавляем в .bashrc
~/.bashrc
. "$HOME/.asdf/completions/asdf.bash"
Включаем поддержку файлов .ruby-version и .node-version
~/.asdfrc
legacy_version_file = yes
Ставим плагин
ineedjet@shae ~/P/r/rubycats>asdf plugin add ruby
Ставим версию Ruby
ineedjet@shae ~/P/r/rubycats>asdf plugin add ruby
Ставим плагин
ineedjet@shae ~/P/r/rubycats>asdf install ruby 3.2.2
Ставим версию Node
ineedjet@shae ~/P/r/rubycats>asdf install nodejs 18.17.1
Больше документации по Asdf на сайте