---
layout: default
title: Installing and Running
---

h1(#all-in-one). All In One Bundle

Contributors to this project maintain a separate distribution over on "RubyForge":http://rubyforge.org/projects/buildr. Using this distribution, it is possible to install Buildr just like you would install Apache Ant or Apache Maven. It comes bundled with JRuby and distributed as a cross-platform zip or tar.gz file.

The RubyForge distribution is *not* an official Apache distribution. The all-in-one bundles are hosted on the "Files page":http://rubyforge.org/frs/?group_id=3180.

*In details:* Navigate to "Rubyforge's buildr's Files page":http://rubyforge.org/frs/?group_id=3180 and download the all-in-one bundle for the latest version available.

Unzip the bundle in a convenient location.

You can execute the buildr executable under the bin directory directly.

You should consider adding the bin directory of the result to the @PATH@ global environment variable. See "Installing Buildr for JRuby":#jruby for instructions to update it.

h1(#the-gem). Installing the gem

*The easy way:*  We recommend you pick the platform you want to run Buildr on and then follow the _easy way_ instructions for that platform.  It could save you an hour or two struggling to install all the right dependencies.

"Installing Buildr for JRuby":#jruby is the same on all operating systems.  Choose JRuby if you're working with Java 6 on OS X, developing with multiple JDKs, or just like JRuby better.

If you are running behind a proxy server, make sure the environment variable @HTTP_PROXY@ is set, as many of these steps require HTTP access.

<br>

*In details:* The @gem install@ and @gem update@ commands install Buildr from a binary distribution provided through "RubyForge":http://rubyforge.org/projects/buildr. This distribution is maintained by contributors to this project, but is *not* an official Apache distribution.  You can obtain the official Apache distribution files from the "download page":download.html.

Older versions of RubyGems are all kind of fail.  You want to avoid these unless you have the patience to install each Buildr dependency manually.  Get RubyGems 1.3.1 or later, and when using Debian packages (e.g. Ubuntu), make sure to get the unmolested RubyGems straight form the source.

The Ruby interpreter and JVM must use compatible architectures.  For example, OS X comes with 32-bit version of Ruby, Java 1.5 in both 32-bit and 64-bit flavors, and 64-bit Java 6.  As a result you can run Ruby with Java 1.5 (32-bit), but to use Java 6 you either need to build Ruby from source for 64-bit, or use "Buildr for JRuby":#jruby.

h2(#linux).  Installing on Linux

*The easy way:* Use this bash script to "install Buildr on Linux":scripts/install-linux.sh.  This script will install the most recent version of Buildr, or if already installed, upgrade to the most recent version.  It will also install Ruby 1.8.6 if not already installed (requires @apt-get@, @yum@ or @urpmi@) and upgrade to RubyGems 1.3.1 or later.

<br>

*In details:* To get started you will need a recent version of Ruby, Ruby Gems and build tools for compiling native libraries (@make@, @gcc@ and standard headers).

On *RedHat/Fedora* you can use yum to install Ruby and RubyGems, and then upgrade to the most recent version of RubyGems:

{% highlight sh %}
$ sudo yum install ruby rubygems ruby-devel gcc
$ sudo gem update --system
{% endhighlight %}

On *Ubuntu* you have to install several packages:

{% highlight sh %}
$ sudo apt-get install ruby-full ruby1.8-dev libopenssl-ruby build-essential
{% endhighlight %}

If using Ubuntu 9.10 or earlier, the Debian package for @rubygems@ will not allow you to install Buildr, so you need to install RubyGems from source:

{% highlight sh %}
$ wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz
$ tar xzf rubygems-1.3.1.tgz
$ cd rubygems-1.3.1
$ sudo ruby setup.rb
$ sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
{% endhighlight %}

Before installing Buildr, please set the @JAVA_HOME@ environment variable to point to your JDK distribution.  Next, use Ruby Gem to install Buildr:

{% highlight sh %}
$ sudo env JAVA_HOME=$JAVA_HOME gem install buildr
{% endhighlight %}

To upgrade to a new version or install a specific version:

{% highlight sh %}
$ sudo env JAVA_HOME=$JAVA_HOME gem update buildr
$ sudo env JAVA_HOME=$JAVA_HOME gem install buildr -v 1.4.3
{% endhighlight %}


h2(#osx).  Installing on OS X

*The easy way:* Use this script to "install Buildr on OS X":scripts/install-osx.sh.  This script will install the most recent version of Buildr, or if already installed, upgrade to the most recent version.  It will also install Ruby 1.8.6 if not already installed (using MacPorts/Fink) and upgrage RubyGems to 1.3.1 or later.

You need to have the Apple Development Tools installed.  They are available on the Mac OSX installation CD.

p(note). Java Update 3 for Snow Leopard removes header files necessary to compile the native Ruby-Java Bridge (RJB) gem, so installing rjb gem may fail on OS X.  The solution is to install Java for Mac OS X 10.6 Update 3 Developer Package from http://connect.apple.com before @gem install@.

*Using RVM?* If you're not using the built-in ruby on OS X (e.g., if you're using RVM), you'll need to force-install the platform-independent RJB:

{% highlight sh %}
$ gem install rjb -v 1.3.3 --platform ruby
{% endhighlight %}

The darwin pre-built binary seems to only work with the built-in ruby.

<br>

*In details:* OS X 10.5 (Leopard) comes with a recent version of Ruby 1.8.6.  You do not need to install a different version of Ruby when running OS X 10.5.

OS X 10.4 (Tiger) includes an older version of Ruby that is not compatible with Buildr.  You can install Ruby 1.8.6 using MacPorts (@sudo port install ruby rb-rubygems@), Fink or the "Ruby One-Click Installer for OS X":http://rubyosx.rubyforge.org/.

We recommend you first upgrade to the latest version of Ruby gems:

{% highlight sh %}
$ sudo gem update --system
{% endhighlight %}

Before installing Buildr, please set the @JAVA_HOME@ environment variable to point to your JDK distribution:

{% highlight sh %}
$ export JAVA_HOME=/Library/Java/Home
{% endhighlight %}

To install Buildr:

{% highlight sh %}
$ sudo env JAVA_HOME=$JAVA_HOME gem install buildr
{% endhighlight %}

To upgrade to a new version or install a specific version:

{% highlight sh %}
$ sudo env JAVA_HOME=$JAVA_HOME gem update buildr
$ sudo env JAVA_HOME=$JAVA_HOME gem install buildr -v 1.3.4
{% endhighlight %}

h2(#windows).  Installing on Windows

*The easy way:*  The easiest way to install Ruby is using the "one-click installer":http://rubyinstaller.rubyforge.org/.  Be sure to install Ruby 1.8.6; support for Ruby 1.9.x is still a work in progress.  Once installed, set the @JAVA_HOME@ environment variable and run @gem install buildr --platform mswin32@.

<br>

*In details:* Before installing Buildr, please set the @JAVA_HOME@ environment variable to point to your JDK distribution.  Next, use Ruby Gem to install Buildr:

{% highlight sh %}
> gem install buildr --platform mswin32
{% endhighlight %}

To upgrade to a new version or install a specific version:

{% highlight sh %}
> gem update buildr
> gem install buildr -v 1.3.4 --platform mswin32
{% endhighlight %}

h2(#jruby).  Installing for JRuby

*The easy way:* Use this bash script to "install Buildr on JRuby":scripts/install-jruby.sh.  This script will install the most recent version of Buildr, or if already installed, upgrade to the most recent version.  If necessary, it will also install JRuby 1.6.1 in @/opt/jruby@ and update the @PATH@ variable in @~/.bash_profile@ or @~/.profile@.

<br>

*In details:* If you don't already have JRuby 1.5.1 or later installed, you can download it from the "JRuby site":http://www.jruby.org/download.

After uncompressing JRuby, update your @PATH@ to include both @java@ and @jruby@ executables.

For Linux and OS X:

{% highlight sh %}
$ export PATH=$PATH:[path to JRuby]/bin:$JAVA_HOME/bin
$ jruby -S gem install buildr
{% endhighlight %}

For Windows:

{% highlight sh %}
> set PATH=%PATH%;[path to JRuby]/bin;%JAVA_HOME%/bin
> jruby -S gem install buildr
{% endhighlight %}

To upgrade to a new version or install a specific version:

{% highlight sh %}
$ jruby -S gem update buildr
$ jruby -S gem install buildr -v 1.3.4
{% endhighlight %}


*Important: Running JRuby and Ruby side by side*

Ruby and JRuby maintain separate Gem repositories, and in fact install slightly different versions of the Buildr Gem (same functionality, different dependencies).  Installing Buildr for Ruby does not install it for JRuby and vice versa.

If you have JRuby installed but not Ruby, the @gem@ and @buildr@ commands will use JRuby.  If you have both JRuby and Ruby installed, follow the instructions below.  To find out if you have Ruby installed (some operating systems include it by default), run @ruby --version@ from the command line.

To work exclusively with JRuby, make sure it shows first on the path, for example, by setting @PATH=/opt/jruby/bin:$PATH@.

You can use JRuby and Ruby side by side, by running scripts with the @-S@ command line argument.  For example:

{% highlight sh %}
$ # with Ruby
$ ruby -S gem install buildr
$ ruby -S buildr
$ # with JRuby
$ jruby -S gem install buildr
$ jruby -S buildr
{% endhighlight %}

Run @buildr --version@ from the command line to find which version of Buildr you are using by default.  If you see @(JRuby ...)@, Buildr is running on that version of JRuby.

h2. Using multiple versions of Buildr

Rubygems makes it possible to install several versions of Buildr side-by-side on the same system.  If you want to run a specific version, you can do so by adding the version number between underscores ('_') as the first command-line parameter.  For example,

{% highlight sh %}
$ buildr _1.3.4_ clean   # runs Buildr v1.3.4

$ buildr _1.4.4_ clean   # runs Buildr v1.4.4
{% endhighlight %}

p(note). There are two `buildr` executables installed by Rubygems.  One script serves to select the specified (or default) version of Buildr and is typically found under `/usr/bin/buildr` or `/var/lib/gems/1.8/bin/buildr`. The exact location will vary depending on your system.   The other script is the Buildr bootstrap per se and can be found under the specific version of Buildr, e.g, `/var/lib/gems/1.8/gems/buildr-1.4.0/bin/buildr`.   The first script should be on your `PATH`.   The second script should not be called directly and should not be on your `PATH`.

h2(#running). Running Buildr

You need a *Buildfile*, a build script that tells Buildr all about the projects it's building, what they contain, what to produce, and so on.  The Buildfile resides in the root directory of your project.  We'll talk more about it in "the next chapter":projects.html.  If you don't already have one, ask Buildr to create it by running @buildr@.

p(tip). You'll notice that Buildr creates a file called @buildfile@.  It's case sensitive, but Buildr will look for either @buildfile@ or @Buildfile@.

You use Buildr by running the @buildr@ command:

{% highlight sh %}
$ buildr [options] [tasks] [name=value]
{% endhighlight %}

There are several options you can use, for a full list of options type @buildr --help@:

|_. Option                  |_. Usage |
| @-f/--buildfile [file]@   | Specify the buildfile.                                  |
| @-e/--environment [name]@ | Environment name (e.g. development, test, production).  |
| @-h/--help@               | Display this help message.                              |
| @-n/--nosearch@           | Do not search parent directories for the buildfile.     |
| @-q/--quiet@              | Do not log messages to standard output.                 |
| @-r/--require [file]@     | Require MODULE before executing buildfile.              |
| @-t/--trace@              | Turn on invoke/execute tracing, enable full backtrace.  |
| @-v/--verbose@            | Log message to standard output                          |
| @-V/--version@            | Display the program version.                            |
| @-P/--prereqs@            | Display tasks and dependencies, then exit.              |

You can tell Buildr to run specific tasks and the order to run them.  For example:

{% highlight sh %}
# Clean and rebuild
buildr clean build
# Package and install
buildr install
{% endhighlight %}

If you don't specify a task, Buildr will run the "@build@ task":building.html, compiling source code and running test cases.  Running a task may run other tasks as well, for example, running the @install@ task will also run @package@.

There are several "environment variables":settings_profiles.html#env_vars that let you control how Buildr works, for example, to skip test cases during a build, or specify options for the JVM.  Depending on the variable, you may want to set it once in your environment, or set a different value each time you run Buildr.

For example:

{% highlight sh %}
$ export JAVA_OPTS='-Xms1g -Xmx1g'
$ buildr TEST=no
{% endhighlight %}


h2(#help). Help Tasks

Buildr includes a number of informative tasks.  Currently that number stands at two, but we'll be adding more tasks in future releases.  These tasks report information from the Buildfile, so you need one to run them.  For more general help (version number, command line arguments, etc) use @buildr --help@.

To start with, type:

{% highlight sh %}
$ buildr help
{% endhighlight %}

You can list the name and description of all your projects using the @help:projects@ task.  For example:

{% highlight sh %}
$ buildr help:projects
killer-app                 # Code. Build. ??? Profit!
killer-app:teh-api         # Abstract classes and interfaces
killer-app:teh-impl        # All those implementation details
killer-app:la-web          # What our users see
{% endhighlight %}

You are, of course, describing your projects for the sake of those who will maintain your code, right?  To describe a project, or a task, call the @desc@ method before the project or task definition.

So next let's talk about "projects":projects.html.


h2(#more). Learning More

*Ruby*  It pays to pick up Ruby as a second (or first) programming language. It's fun, powerful and slightly addictive.  If you're interested in learning Ruby the language, a good place to start is "Programming Ruby: The Pragmatic Programmer's Guide":http://www.pragprog.com/titles/ruby/programming-ruby, fondly known as the _Pickaxe book_.

For a quicker read (and much more humor), "Why’s (Poignant) Guide to Ruby":http://poignantguide.net/ruby/ is available online.  More resources are listed on the "ruby-lang web site":http://www.ruby-lang.org/en/documentation/.

*Rake* Buildr is based on Rake, a Ruby build system that handles tasks and dependencies.  Check out the "Rake documentation":http://docs.rubyrake.org/ for more information.

*AntWrap* Buildr uses AntWrap, for configuring and running Ant tasks.  You can learn more from the "Antwrap documentation":https://rubygems.org/gems/Antwrap.

*YAML* Buildr uses YAML for its profiles.  You can "learn more about YAML here":http://www.yaml.org, and use this handy "YAML quick reference":http://www.yaml.org/refcard.html.
