My Setup with rvm, gemsets and bundler
I took me some time, to figure out how to correctly setup every project I worked on, not that I work in tons of projects, but now that I have a better understanding of how to setup, it makes more sense to me, at least.
RVM
So RVM or Ruby Version Manager, allow to install different ruby version on the same machine without them collision it.
When RVM installs a new version of ruby it will create a new folder inside the ~/.rvm/gems
folder with the name of the ruby version, that way when installing different ruby version each of them will have their own folder, each folder containing the next structure
bash
drwxr-xr-x 11 ……… staff 374 Sep 13 23:10 .
drwxr-xr-x 13 ……… staff 442 Oct 17 15:37 ..
drwxr-xr-x 5 ……… staff 170 Sep 13 23:10 bin
drwxr-xr-x 2 ……… staff 68 Sep 13 23:10 build_info
drwxr-xr-x 4 ……… staff 136 Sep 13 23:10 cache
drwxr-xr-x 2 ……… staff 68 Sep 13 23:10 doc
-rw-r--r-- 1 ……… staff 468 Jul 30 17:45 environment
drwxr-xr-x 2 ……… staff 68 Sep 13 23:10 extensions
drwxr-xr-x 4 ……… staff 136 Sep 13 23:10 gems
drwxr-xr-x 4 ……… staff 136 Sep 13 23:10 specifications
drwxr-xr-x 13 ……… staff 442 Sep 13 23:10 wrappers
When using that version of ruby, all the gems installed via gem install ...
will be installed in the gems
folder, that way we can have different version of the same gem in the different ruby version, in our computer.
RVM allow to specify which ruby version are we using when cd
inside a project, with a special file .ruby-version
. This file will have the ruby version, you can create it manually or tell rvm to do it for you with this command
rvm --create --ruby-version ruby-2.3.3
this will create the .ruby-version
file.
Gemsets
When having the same ruby version for multiple projects, could create some conflicts, because we have a different version of nokogiri
in both projects, to avoid conflict error, we have to use bundle exec ...
to use the version specify by the Gemfile
.
We can avoid this tedious extra typing by creating a different gemset for each project, and within each gemset all the gems that the project need. So every time we create a new gemset
a new folder is added to ~/.rvm/gems/#{ruby-version}@#{gemset}
so with this we completely avoid conflicts.
Another good thing is when finishing working on the project, we can delete all the gems from that project just by deleting the gemset completely by typing rvm gemset delete #{gemset}
As well as the ruby version, RVM can automatically use a gemset by specifying with the file .ruby-gemset
Workflow
When I start on a new project, I create a ruby-version and a ruby-gemset file, and install all the gems I need for that project.
There is a great command that will create both files for us, let’s imagine the ruby version is 2.3.3 and the project is called testrvm, so I would like to create a gemset for this project, just by typing `rvm use –create ruby-2.3.3@testrvm`
Another cool thing is that for every ruby version RVM automatically created a global gemset, which all gemsets for that ruby version will share, so before creating a new gemset for that ruby version I make sure that I have installed bundler
.
rvm use global
gem install bundler
This way I don’t have to install in every gemset.
So this is my normal workflow, any idea of how to improve it, or if I’m doing something wrong. Please just let me know.