Working in Ruby on Rails, one should have a very clear understanding about the working of [rails s] with which we start our server and the /bin directory created in our project.
- Any command(like rails s) which we run from the terminal is an executable, residing in one of the folder in load path of our system($PATH)
- Rails executable gets installed when we install rails gem.
- rails in our [rails s] command is a ruby executable.
- Ruby executable means, an executable file written in ruby code.
- When we run [rails s] an equivalent command [exec ruby bin/rails server] is executed. Which runs ruby executable [rails] file in bin directory of our project.
- All the files in /bin directory of a rails project are ruby executable files.
- Binstubs are wrapper scripts around executables, whose purpose is to prepare the environment before dispatching the call to the original executable.
- In Ruby world, the most common binstubs are the ones that RubyGems generates after installing a gem that contains executables.
# For example - # What happens when we run [gem install rspec-core]. Rspec ships with an executable located at [./exe/rspec] inside of t7he gem. # After the installation, RubyGems will provide us with the following executables- # 1. <ruby-prefix>/bin/rspec (binstub generated by RubyGems) # 2. <ruby-prefix>/lib/ruby/gems/1.9.1/gems/rspec-core-XX.YY/exe/rspec (original) # The generated binstub <ruby-prefix>/bin/rspec is a short Ruby script, presented in a slightly simplified form here: #!/usr/bin/env ruby require 'rubygems' # Prepares the $LOAD_PATH by adding to it lib directories of the gem and # its dependencies: gem 'rspec-core' # Loads the original executable load Gem.bin_path('rspec-core', 'rspec')
- By running command rails s, different files in the rails get initialized in the following sequence -