Rails Boot Inquirer (Bootinq)
The gem allows to select which bundle groups to boot in the current rails process.
Installation
Add this line to your application's Gemfile:
gem 'bootinq'
And then execute:
$ bundle
Get started
There are few steps to setup partial gem booting using Bootinq in any ruby application:
1. Declare loadable parts
The environment variable specifies which parts should be loaded using the assigned char keys. If the value is starts with -
, all parts except the given will be loaded.
For example, looking at the configuration below, if we want to load only api
, we should set BOOTINQ=a
. If we want to load the all except frontend
and admin
, we should set BOOTINQ=-fz
.
The name of the environment variable can be customized by changing the env_key:
# config/bootinq.yml
env_key: BOOTINQ
default: "-f"
# Non-mountable parts
parts:
c: :console
# Mountable parts (engines)
mount:
a: :api
f: :frontend
z: :admin
2. Add gem groups
For each app part you should add a gem group named as #{group_name}_boot
:
# Gemfile
gem "api", path: "apps/api", group: :api_boot
gem "admin", path: "apps/admin", group: :admin_boot
gem "frontend", path: "apps/frontend", group: :frontend_boot
group :console_boot do
gem 'term-ansicolor', '1.1.5'
gem 'pry-rails'
end
Ruby on Rails
3. Swap Bundle.require to Bootinq.require
Insert require "bootinq"
to the top of config/application.rb
file and replace Bundler.require(*Rails.groups)
with the Bootinq.require
:
Simple
# config/application.rb
require File.('../boot', __FILE__)
require 'rails/all'
require 'bootinq'
# With no additional gem groups:
Bootinq.require(verbose: true)
# otherwise, set them like in <tt>Bundle.require(*Rails.groups(*groups))</tt>:
# Bootinq.require(:assets => %w(development test))
Separate load rails components with Bootinq
# config/application.rb
require File.('../boot', __FILE__)
require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_record/railtie"
require "active_job/railtie"
require "action_mailer/railtie"
require "rails/test_unit/railtie"
Bootinq.require do
# Load the following components only when the frontend component is enabled
on :frontend do
require "sprockets/railtie"
require "action_controller/railtie"
require "action_view/railtie"
end
end
4. Mount enabled engines in config/routes.rb
Use the Bootinq.each_mountable {}
helper to easily mount currently loaded engines or do it by yourself checking Bootinq.enabled?(engine_name)
:
# config/routes.rb
Rails.application.routes.draw do
Bootinq.each_mountable do |part|
mount part.engine => '/', as: part.to_sym
end
root 'frontend/pages#index' if Bootinq.enabled?(:frontend)
end
5. Run app with only wanted parts
Now, you can set environment variable to tell workers which part of app it should load.
For example, with the foreman in Procfile
:
api: env BOOTINQ=a MAX_THREADS=128 bundle exec puma -w 4
admin: env BOOTINQ=z bundle exec puma
Usage with other frameworks
-
Locate
Bundler.require(...)
in your app and insertrequire "bootinq"
above it. -
Replace located
Bundler.require(...)
line with theBootinq.require(...)
.
For example, if you are using Grape:
# config/application.rb
require 'boot'
require 'bootinq'
# Bundler.require :default, ENV['RACK_ENV']
Bootinq.require :default, ENV['RACK_ENV'], verbose: true
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/estum/bootinq.