Suppose that we need to create a Rails project that will use the classic ERB views and PostgreSQL. One way to start with is simply by running the following command to create a new Rails project called my-project:
I’m using Ruby 2.7.1 and Rails 6
rails new my-project --database=postgresql
That command will generate the folder my-project, and inside it we will find the Gemfile where are defined all of the gems that will be used by our application
This is the content of the generated Gemfile
I always prefer to delete the generated comments to get a clearer view of the gems
source 'https://rubygems.org'
ruby '2.7.1'
gem 'rails', '~> 6.0.3', '>= 6.0.3.4'
gem 'pg', '>= 0.18', '< 2.0'
gem 'puma', '~> 4.1'
gem 'sass-rails', '>= 6'
gem 'webpacker', '~> 4.0'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.7'
gem 'bootsnap', '>= 1.4.2', require: false
group :development, :test do
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
gem 'web-console', '>= 3.3.0'
gem 'listen', '~> 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
group :test do
gem 'capybara', '>= 2.15'
gem 'selenium-webdriver'
gem 'webdrivers'
end
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
Those are the default gems for Rails 6 installed after ran the last command. For the case of our application, we are not going to need all of them (YAGNI), so lets clean up the Gemfile a little bit
We are going to add some options more to our rails new
command. You can see the full list of options by running rails new -h
Remember to delete the last generated folder before generate it again. To do it, you can use this command sudo rm -r my-project
rails new my-project --database=postgresql --skip-keeps --skip-action-mailer --skip-action-mailbox --skip-action-text --skip-active-storage --skip-action-cable --skip-puma --skip-test --skip-bundle --skip-webpack-install
Explanation of the options
--skip-keeps
why? This avoids adding empty folders to your git repository (I want not commit empty files in my repository)--skip-action-mailer
why? I don’t need this stuff to start with my project--skip-action-mailbox
why? I don’t need this stuff to start with my project--skip-action-text
why? I don’t need this stuff to start with my project--skip-active-storage
why? I don’t need this stuff to start with my project--skip-action-cable
why? I don’t need this stuff to start with my project--skip-puma
why? Puma web server is suitable for Production environment, but for development I can use the default WebBrick web server--skip-test
why? I’m going to use RSpec, so I don’t need the default Minitest stuff--skip-bundle
why? I’m going to make some changes to my Gemfile then I will manually runbundle install
command--skip-webpack-install
why? I’m going to manually run the commandrails webpacker:install
after the changes on the Gemfile are done
This is the resulting Gemfile after run the last command
source 'https://rubygems.org'
ruby '2.7.1'
gem 'rails', '~> 6.0.3', '>= 6.0.3.4'
gem 'pg', '>= 0.18', '< 2.0'
gem 'sass-rails', '>= 6'
gem 'webpacker', '~> 4.0'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.7'
gem 'bootsnap', '>= 1.4.2', require: false
group :development, :test do
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
gem 'web-console', '>= 3.3.0'
gem 'listen', '~> 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
Cleaning more the Gemfile
Although you have already cleaned the Gemfile by using the rails new
command options, you can even clean it more by removing unneeded gems manually. Let’s do that
Gems that we can keep
rails
andpg
gems why These two gems are basics to develop the application with Rails and PostgreSQLsass-rails
andwebpacker
gems why These two gems are needed to Sprokets (default CSS bundler) and WebPack (default JS bundler)turbolinks
gem why This gem is needed to speed up navigation between pagesbootsnap
gem why This gem is needed to optimization loading of the applicationbyebug
andweb-console
gems why These two gems are useful to debugging the applicationspring
,spring-watcher-listen
, andlisten
gems why These three gems work together to speed up the development by caching some common operations like running the rails console, tests execution, and so on
Gems that we can remove
tznfo-data
why This gem is not necessary on unix-based systems (Mac or Ubuntu), so if you are using Mac or Ubuntu like I, then you can remove itjbuilder
why I’m not going to work with JSON data (at least not for now) which is commonly used in API development
This is the final Gemfile
source 'https://rubygems.org'
ruby '2.7.1'
gem 'rails', '~> 6.0.3', '>= 6.0.3.4'
gem 'pg', '>= 0.18', '< 2.0'
gem 'sass-rails', '>= 6'
gem 'webpacker', '~> 4.0'
gem 'turbolinks', '~> 5'
gem 'bootsnap', '>= 1.4.2', require: false
group :development, :test do
gem 'byebug'
end
group :development do
gem 'web-console', '>= 3.3.0'
gem 'listen', '~> 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
Note that, I have removed the platform part of byebug
. Since the default platform on unix-based systems is ruby and I’m not going to developing on Windows, the platform parameter is not necessary
One downside of this approach is that everytime you want to start with this lighweight setup like I have shown you here, you will have to execute the same long command every time
rails new my-light-project --database=postgresql --skip-keeps --skip-action-mailer --skip-action-mailbox --skip-action-text --skip-active-storage --skip-action-cable --skip-puma --skip-test --skip-bundle --skip-webpack-install
There are shortcuts to some flags that you could use to reduce a little bit this long command: rails new command option shortcuts
-d postgresql
instead of--database=postgresql
-M
instead of--skip-action-mailer
-C
instead of--skip-action-cable
-P
instead of--skip-puma
-T
instead of--skip-test
-B
instead of--skip-bundle
So, the command will look like this:
rails new my-light-project -d postgresql --skip-keeps -M --skip-action-mailbox --skip-action-text --skip-active-storage -C -P -T -B --skip-webpack-install
Ok, that is quite better, but it is still very long. So, the better way is to move that long command to the .railsrc
file (You can take a look on mine here)
Just put the flags in the .railsrc
file like this
--database=postgresql
--skip-keeps
--skip-action-mailer
--skip-action-mailbox
--skip-action-text
--skip-active-storage
--skip-puma
--skip-action-cable
--skip-test
--skip-bundle
--skip-webpack-install
Once you have moved the flags to your .railsrc
file, you can run only this command to create your rails project rails new my-project
by applying the changes based on the options defined in the .railsrc
file
Summary of all steps to create a lightweight project
- Create your
.railsrc
file with the needed options - Run
rails new my-project
- Edit your Gemfile and remove not necessary stuff (as explained lines above)
- Run
bundle install
- Run
rails webpacker:install
- Run
rails db:setup
- Run
rails s
Note that this strategy to clean up your Gemfile and got a lightweight project setup is though to a new project with a very basic stuff that will use server-side rendering
The final recommendation here would be that always starting with the simplest stuff and grow up from that instead of starting with a lot of unknown stuff that you don’t need right now and likely you are going to not need it