Rewrite "How It Works" with @trevorturk

This commit is contained in:
Sam Stephenson 2013-01-03 21:18:05 -06:00
parent 5174d14d5c
commit 308aa42b67

138
README.md
View file

@ -31,6 +31,10 @@ bulletproof deployments.
## Table of Contents ## Table of Contents
* [How It Works](#how-it-works) * [How It Works](#how-it-works)
* [Understanding PATH](#understanding-path)
* [Understanding Shims](#understanding-shims)
* [Choosing the Ruby Version](#choosing-the-ruby-version)
* [Locating the Ruby Installation](#locating-the-ruby-installation)
* [Installation](#installation) * [Installation](#installation)
* [Basic GitHub Checkout](#basic-github-checkout) * [Basic GitHub Checkout](#basic-github-checkout)
* [Upgrading](#upgrading) * [Upgrading](#upgrading)
@ -50,24 +54,89 @@ bulletproof deployments.
* [Version History](#version-history) * [Version History](#version-history)
* [License](#license) * [License](#license)
## How It Works ## ## How It Works
rbenv operates on the per-user directory `~/.rbenv`. Version names in At at high level, rbenv intercepts Ruby commands using shim
rbenv correspond to subdirectories of `~/.rbenv/versions`. For executables injected into your `PATH`, determines which Ruby version
example, you might have `~/.rbenv/versions/1.8.7-p354` and has been specified by your application, and passes your commands along
`~/.rbenv/versions/1.9.3-p327`. to the correct Ruby installation.
Each version is a working tree with its own executables, like ### Understanding PATH
`~/.rbenv/versions/1.8.7-p354/bin/ruby` and
`~/.rbenv/versions/1.9.3-p327/bin/irb`. rbenv makes _shim executables_
for every such executable across all installed versions of Ruby.
These shims are simple wrapper scripts that live in `~/.rbenv/shims` When you run a command like `ruby` or `rake`, your operating system
and detect which Ruby version you want to use. They insert the searches through a list of directories to find an executable file with
directory for the selected version at the beginning of your `$PATH` that name. This list of directories lives in an environment variable
and then invoke the corresponding executable. called `PATH`, with each directory in the list separated by a colon:
## Installation ## /usr/local/bin:/usr/bin:/bin
Directories in `PATH` are searched from left to right, so a matching
executable in a directory at the beginning of the list takes
precedence over another one at the end. In this example, the
`/usr/local/bin` directory will be searched first, then `/usr/bin`,
then `/bin`.
### Understanding Shims
rbenv works by inserting a directory of _shims_ at the front of your
`PATH`:
~/.rbenv/shims:/usr/local/bin:/usr/bin:/bin
Through a process called _rehashing_, rbenv maintains shims in that
directory to match every Ruby command across every installed version
of Ruby—`irb`, `gem`, `rake`, `rails`, `ruby`, and so on.
Shims are lightweight executables that simply pass your command along
to rbenv. So with rbenv installed, when you run, say, `rake`, your
operating system will do the following:
* Search your `PATH` for an executable file named `rake`
* Find the rbenv shim named `rake` at the beginning of your `PATH`
* Run the shim named `rake`, which in turn passes the command along to
rbenv
### Choosing the Ruby Version
When you execute a shim, rbenv determines which Ruby version to use by
reading it from the following sources, in this order:
1. The `RBENV_VERSION` environment variable, if specified. You can use
the [`rbenv shell`](#rbenv-shell) command to set this environment
variable in your current shell session.
2. The application-specific `.ruby-version` file in the current
directory, if present. You can modify the current directory's
`.ruby-version` file with the [`rbenv local`](#rbenv-local)
command.
3. The first `.ruby-version` file found by searching each parent
directory until reaching the root of your filesystem, if any.
4. The global `~/.rbenv/version` file. You can modify this file using
the [`rbenv global`](#rbenv-global) command. If the global version
file is not present, rbenv assumes you want to use the "system"
Ruby—i.e. whatever version would be run if rbenv weren't in your
path.
### Locating the Ruby Installation
Once rbenv has determined which version of Ruby your application has
specified, it passes the command along to the corresponding Ruby
installation.
Each Ruby version is installed into its own directory under
`~/.rbenv/versions`. For example, you might have these versions
installed:
* `~/.rbenv/versions/1.8.7-p371/`
* `~/.rbenv/versions/1.9.3-p327/`
* `~/.rbenv/versions/jruby-1.7.1/`
Version names to rbenv are simply the names of the directories in
`~/.rbenv/versions`.
## Installation
**Compatibility note**: rbenv is _incompatible_ with RVM. Please make **Compatibility note**: rbenv is _incompatible_ with RVM. Please make
sure to fully uninstall RVM and remove any references to it from sure to fully uninstall RVM and remove any references to it from
@ -76,7 +145,7 @@ and then invoke the corresponding executable.
If you're on Mac OS X, consider If you're on Mac OS X, consider
[installing with Homebrew](#homebrew-on-mac-os-x). [installing with Homebrew](#homebrew-on-mac-os-x).
### Basic GitHub Checkout ### ### Basic GitHub Checkout
This will get you going with the latest version of rbenv and make it This will get you going with the latest version of rbenv and make it
easy to fork and contribute any changes back upstream. easy to fork and contribute any changes back upstream.
@ -138,7 +207,7 @@ easy to fork and contribute any changes back upstream.
$ rbenv rehash $ rbenv rehash
~~~ ~~~
#### Upgrading #### #### Upgrading
If you've installed rbenv manually using git, you can upgrade your If you've installed rbenv manually using git, you can upgrade your
installation to the cutting-edge version at any time. installation to the cutting-edge version at any time.
@ -153,15 +222,10 @@ To use a specific release of rbenv, check out the corresponding tag:
~~~ sh ~~~ sh
$ cd ~/.rbenv $ cd ~/.rbenv
$ git fetch $ git fetch
$ git tag $ git checkout v0.3.0
v0.1.0
v0.1.1
v0.1.2
v0.2.0
$ git checkout v0.2.0
~~~ ~~~
### Homebrew on Mac OS X ### ### Homebrew on Mac OS X
You can also install rbenv using the You can also install rbenv using the
[Homebrew](http://mxcl.github.com/homebrew/) package manager on Mac OS [Homebrew](http://mxcl.github.com/homebrew/) package manager on Mac OS
@ -179,7 +243,7 @@ Afterwards you'll still need to add `eval "$(rbenv init -)"` to your
profile as stated in the caveats. You'll only ever have to do this profile as stated in the caveats. You'll only ever have to do this
once. once.
### Neckbeard Configuration ### ### Neckbeard Configuration
Skip this section unless you must know what every line in your shell Skip this section unless you must know what every line in your shell
profile is doing. profile is doing.
@ -211,7 +275,7 @@ opposed to this idea. Here's what `rbenv init` actually does:
Run `rbenv init -` for yourself to see exactly what happens under the Run `rbenv init -` for yourself to see exactly what happens under the
hood. hood.
### Uninstalling Ruby Versions ### ### Uninstalling Ruby Versions
As time goes on, Ruby versions you install will accumulate in your As time goes on, Ruby versions you install will accumulate in your
`~/.rbenv/versions` directory. `~/.rbenv/versions` directory.
@ -225,12 +289,12 @@ The [ruby-build](https://github.com/sstephenson/ruby-build) plugin
provides an `rbenv uninstall` command to automate the removal provides an `rbenv uninstall` command to automate the removal
process. process.
## Command Reference ## ## Command Reference
Like `git`, the `rbenv` command delegates to subcommands based on its Like `git`, the `rbenv` command delegates to subcommands based on its
first argument. The most common subcommands are: first argument. The most common subcommands are:
### rbenv local ### ### rbenv local
Sets a local application-specific Ruby version by writing the version Sets a local application-specific Ruby version by writing the version
name to a `.ruby-version` file in the current directory. This version name to a `.ruby-version` file in the current directory. This version
@ -250,7 +314,7 @@ file named `.rbenv-version`. For backwards compatibility, rbenv will
read a local version specified in an `.rbenv-version` file, but a read a local version specified in an `.rbenv-version` file, but a
`.ruby-version` file in the same directory will take precedence. `.ruby-version` file in the same directory will take precedence.
### rbenv global ### ### rbenv global
Sets the global version of Ruby to be used in all shells by writing Sets the global version of Ruby to be used in all shells by writing
the version name to the `~/.rbenv/version` file. This version can be the version name to the `~/.rbenv/version` file. This version can be
@ -265,7 +329,7 @@ The special version name `system` tells rbenv to use the system Ruby
When run without a version number, `rbenv global` reports the When run without a version number, `rbenv global` reports the
currently configured global version. currently configured global version.
### rbenv shell ### ### rbenv shell
Sets a shell-specific Ruby version by setting the `RBENV_VERSION` Sets a shell-specific Ruby version by setting the `RBENV_VERSION`
environment variable in your shell. This version overrides environment variable in your shell. This version overrides
@ -285,7 +349,7 @@ prefer not to use shell integration, you may simply set the
$ export RBENV_VERSION=jruby-1.7.1 $ export RBENV_VERSION=jruby-1.7.1
### rbenv versions ### ### rbenv versions
Lists all Ruby versions known to rbenv, and shows an asterisk next to Lists all Ruby versions known to rbenv, and shows an asterisk next to
the currently active version. the currently active version.
@ -298,7 +362,7 @@ the currently active version.
rbx-1.2.4 rbx-1.2.4
ree-1.8.7-2011.03 ree-1.8.7-2011.03
### rbenv version ### ### rbenv version
Displays the currently active Ruby version, along with information on Displays the currently active Ruby version, along with information on
how it was set. how it was set.
@ -306,7 +370,7 @@ how it was set.
$ rbenv version $ rbenv version
1.8.7-p352 (set by /Volumes/37signals/basecamp/.ruby-version) 1.8.7-p352 (set by /Volumes/37signals/basecamp/.ruby-version)
### rbenv rehash ### ### rbenv rehash
Installs shims for all Ruby executables known to rbenv (i.e., Installs shims for all Ruby executables known to rbenv (i.e.,
`~/.rbenv/versions/*/bin/*`). Run this command after you install a new `~/.rbenv/versions/*/bin/*`). Run this command after you install a new
@ -314,7 +378,7 @@ version of Ruby, or install a gem that provides commands.
$ rbenv rehash $ rbenv rehash
### rbenv which ### ### rbenv which
Displays the full path to the executable that rbenv will invoke when Displays the full path to the executable that rbenv will invoke when
you run the given command. you run the given command.
@ -322,7 +386,7 @@ you run the given command.
$ rbenv which irb $ rbenv which irb
/Users/sam/.rbenv/versions/1.9.3-p327/bin/irb /Users/sam/.rbenv/versions/1.9.3-p327/bin/irb
### rbenv whence ### ### rbenv whence
Lists all Ruby versions with the given command installed. Lists all Ruby versions with the given command installed.
@ -331,7 +395,7 @@ Lists all Ruby versions with the given command installed.
jruby-1.7.1 jruby-1.7.1
ree-1.8.7-2011.03 ree-1.8.7-2011.03
## Development ## ## Development
The rbenv source code is [hosted on The rbenv source code is [hosted on
GitHub](https://github.com/sstephenson/rbenv). It's clean, modular, GitHub](https://github.com/sstephenson/rbenv). It's clean, modular,
@ -340,7 +404,7 @@ and easy to understand, even if you're not a shell hacker.
Please feel free to submit pull requests and file bugs on the [issue Please feel free to submit pull requests and file bugs on the [issue
tracker](https://github.com/sstephenson/rbenv/issues). tracker](https://github.com/sstephenson/rbenv/issues).
### Version History ### ### Version History
**0.3.0** (December 25, 2011) **0.3.0** (December 25, 2011)
@ -416,7 +480,7 @@ tracker](https://github.com/sstephenson/rbenv/issues).
* Initial public release. * Initial public release.
### License ### ### License
(The MIT license) (The MIT license)