# Ruby on Archlinux I thought I would document my setup, since it's somewhat non-standard but working quite well for me. ## What this does * Install major Ruby versions at their latest patch release * Allow to switch between them seamlessly * Use chruby * Encourage bundler usage ## What this does not * Install files outside your home folder that are not tracked by your package manager * Use ruby-install, ruby-build, rbenv or RVM * Allow you to switch to a specific outdated patchlevel version of Ruby, out of the box. ## Setup `yay` is used as an example AUR helper, use whichever you like or do it manually. Prefixed with `#` means run as root, prefixed with `$` means run as the user you regularly work with. ```bash # pacman -S ruby $ yay -S chruby ruby-bundler $ mkdir -p ~/.rubies/3.0/bin $ ln -s /usr/bin/ruby ~/.rubies/3.0/bin/ruby $ echo "gem: --no-user-install --env-shebang" > ~/.gemrc ``` Unfortunately the `ruby2.7` package in `community` changed the packaging style compared to what has been done historically. To make it available we need another symlink: ```bash $ mkdir -p ~/.rubies/2.7/bin $ ln -s /usr/bin/ruby-2.7 ~/.rubies/2.7/bin/ruby ``` Edit your `~/.$SHELLrc` and add: ```bash # chruby source /usr/share/chruby/chruby.sh source /usr/share/chruby/auto.sh RUBIES=(/opt/ruby* $HOME/.rubies/*) ``` Optionally, but the entire point of this setup, install older Ruby versions: ```bash $ yay -S ruby2.6 ruby2.6-bundler ruby2.7 ``` If you want to make other Ruby distributions available just add them to `RUBIES` if they provide a `bin/ruby`. Else symlink them into `.rubies` like we did above for `ruby2.7`. ## Upgrading When the [ruby package](https://www.archlinux.org/packages/extra/x86_64/ruby/) moves to a new minor or major version (`major.minor.teensy`), do the following (adjusting the versions of course): ```bash $ mv ~/.rubies/3.0 ~/.rubies/3.1 ``` Most likely I or somebody else will upload a package for the old release to the AUR: ```bash $ yay -S ruby3.0 ``` Depending on how it's packaged you might need to add a new symlink to `.rubies`. ## Per project setup Create a `.ruby-version` file with the desired version to use, like ``` 2.7 ``` Use a `Gemfile` and `bundle install` to install gems into your home folder, or `bundle install --path vendor/bundle` to install gems to a per project directory. ## System wide gem installation Do not do `gem install` as root, install the packages from the AUR like we already did for `ruby-bundler`, `ruby2.7-bundler` and so on. If the gem you want to install system wide isn't packaged yet, create one! Have a look at existing packages for inspiration or facilitate tools like [gem2arch](https://aur.archlinux.org/packages/gem2arch/). ## Scripting Use `/usr/bin/chruby-exec 2.7 -- regular command` to switch to a different Ruby environment in your scripts. This only works for scripts run as users that have this setup. Same holds true for systemd units, while you can use `chruby-exec` in `ExecStart` and friends, your service needs to have a `User=` to one with this setup.