mirror of
https://github.com/pyenv/pyenv.git
synced 2024-11-21 20:47:00 -05:00
Rewrite "How It Works" with @trevorturk
This commit is contained in:
parent
5174d14d5c
commit
308aa42b67
1 changed files with 101 additions and 37 deletions
138
README.md
138
README.md
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue