This article is still valid, but there is a newer one available. I recommend checking it out.
Snow Leopard, Apple’s latest release of their OS X Operating System, was released last month. I pre-ordered it from Amazon but it’s only now that I’ve gotten around to installing it on my machines. I first installed it on my Mac Mini as a fresh install and because of that, I wanted to document the process. I probably could have upgraded Leopard to Snow Leopard, but I didn’t want 32bit binaries floating around where I could have been using a 64bit binary.
Determining whether or not your Mac is 64bit or 32bit is based on the processor. Click on the Apple logo in the menu bar and choose About This Mac. Look at the processor type. If it’s a Core Duo, you have a 32bit Mac, if it’s a Core 2 Duo then you have a 64bit Mac. Keep that in mind when installing applications like RubyGems and database drivers.
One more thing, with this guide, I stuck with MacPorts for some application installs. I know that Homebrew is all the rage nowadays, but I’ve had little to no trouble using MacPorts, so that’s what I’ve stuck with.
This whole process breaks down if you don’t install XCode, so go ahead an do that now. You could probably download it online but since the Snow Leopard DVD is only a month old (at the time of this writing), go ahead an install it from there.
Just in case you’ve never installed XCode, it’s located on the DVD in the Optional Installs directory. Just run the Xcode.mpkg installer. Choose the default settings for the installation.
Head on over to the MacPorts site and download the dmg disk image for Snow Leopard. Once the download is complete, run the installer from the mounted disk image. I chose the defaults through the installation process.
The Snow Leopard version of MacPorts should modify your $PATH automatically so that you can run “port” commands from the Terminal without having to prefix it with the location path of the MacPort binaries. If you want to make sure, you can run this command from the Terminal:
You should see something similar to this:
# MacPorts Installer addition on 2009-10-08_at_19:43:18: adding an appropriate PATH variable for use with MacPorts. export PATH=/opt/local/bin:/opt/local/sbin:/usr/local/bin:$PATH # Finished adapting your PATH environment variable for use with MacPorts.
If you don’t see this, you’ll want to edit your path to include /opt/local/bin and opt/local/sbin. You can do this by opening your .profile file with TextEdit and make the changes:
sudo '/Applications/TextEdit.app/Contents/MacOS/TextEdit' ~/.profile
Add the following lines before “$PATH”:
Now you should be able to run the command
which portand see the output
MacPorts should correctly compile the correct version (32bit vs 64bit) of applications and libraries for you based on your CPU (confused about which Mac version you have?). If you’re feeling paranoid and want to force it to always use a certain mode, you can use your favorite text editor and edit the file at:
open -e /opt/local/etc/macports/macports.conf
Look in the file for the commented out “build_arch” declaration. If you want to force 64bit mode for example, you’d uncomment the line and change the value to x86_64.
Ruby, Rails, and Gems
Snow Leopard, like it’s predecessor comes bundled with a version of Ruby, Rails, and RubyGems. Since I’ve been using Rails professionally, I always like to install my own version of Ruby and RubyGems from MacPorts. I also like to download Rails from the gem source myself.
Before we can do that, we should hide the versions that come pre-bundled with Snow Leopard.
You can do that by running the following commands in the Terminal (inputting your password where requested):
sudo mv /usr/bin/ruby /usr/bin/ruby.orig sudo mv /usr/bin/gem /usr/bin/gem.orig sudo mv /usr/bin/rails /usr/bin/rails.orig
Finally we’re ready to install Ruby and RubyGems via MacPorts. Just run the following from the Terminal:
sudo port install ruby rb-rubygems
This will take a while, so you might want to take a break and stretch your legs while it’s doing its business. Once Ruby and RubyGems have been installed, you can go ahead and install Rails itself.
sudo gem install rails
Installing Your Database Servers
I use both PostgreSQL and MySQL but you don’t have to install them. In fact, since Rails uses SQLite for development (by default) you might not need to install either of them. With that being said, I highly recommend to install both database servers just in case you need to use them.
Installing both is quite trivial but make sure to pay attention to the output at the end of the commands as it has text that you’ll want to copy and paste into your Terminal. Run the following commands for PostgreSQL:
sudo port install postgresql84 postgresql84-server
Again, make sure you read the post install text as it’ll direct you to install a default database, create a default postgres user, and setup PostgreSQL to start automatically at start up. (recommended).
Once you’ve run the commands that it has suggestion, it’s a good time to add PostgreSQL to your path so that you can install the database driver. Again, open your .profile and edit your path and add the following right before “$PATH”.
Install the PostgreSQL Rails database driver by running the command:
sudo env ARCHFLAGS="-arch x86_64" gem install pg
If you want to install the 32bit driver, then you can just run:
sudo gem install pg
Installing MySQL is as simple as installing PostgreSQL. In the Terminal:
sudo port install mysql5 mysql5-server
Just like in the PostgreSQL install, make sure you read the post install text. It’ll have you setup a default database, and will give you a command so that MySQL can load at start up (recommended).
After MySQL has been installed you’ll want to install the MySQL database driver for Rails:
sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/opt/local/lib/mysql5/bin/mysql_config
If you want the 32 version:
sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/opt/local/lib/mysql5/bin/mysql_config
By default, MySQL likes to use UNIX sockets for communication and therefore it needs a .sock file. I usually like to store mine in /tmp/mysql.sock. It doesn’t exist by default, so you’ll have to create it:
sudo touch /tmp/mysql.sock
After that file has been created you’ll have to tell MySQL to use your newly created socket file:
sudo touch /opt/local/etc/mysql5/my.cnf sudo '/Applications/TextEdit.app/Contents/MacOS/TextEdit' /opt/local/etc/mysql5/my.cnf
Add the following to the my.cnf file:
[mysqld_safe] socket=/tmp/mysql.sock [client] socket=/tmp/mysql.sock
PostgreSQL and MySQL should now be installed but you’ll want to install the SQLite database driver gem. It’s dead simple:
sudo gem install sqlite3-ruby
Installing Your Web Server
I use Passenger for my development web server and I highly recommend you doing the same. It’s not necessary, so you can certainly skip the step if you’d like.
Before we start installing anything, let’s turn on Apache. Go to the Sharing Preference pane under System Preferences and check Web Sharing. This should activate Apache.
Let’s install the Passenger gem and the Apache 2 module:
sudo gem install passenger sudo passenger-install-apache2-module
Make sure that you read the text after the Apache module has been installed. It will give you lines of text that you’ll need to copy into your Apache config file.
Here is a sample of mine:
# Passenger modules and configuration LoadModule passenger_module /opt/local/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so PassengerRoot /opt/local/lib/ruby/gems/1.8/gems/passenger-2.0.6 PassengerRuby /opt/local/bin/ruby
I create a Passenger specific config file to hold this information:
sudo touch /etc/apache2/other/passenger.conf
Open the newly created file in TextEdit (you know the drill here sudo ‘/Applications/TextEdit.app/Contents/MacOS/TextEdit’ /etc/apache2/other/passenger.conf) and copy the lines from the post Apache 2 module install as well as some additional text. Here is a sample from my passenger.conf file:
# Passenger modules and configuration LoadModule passenger_module /opt/local/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so PassengerRoot /opt/local/lib/ruby/gems/1.8/gems/passenger-2.0.6 PassengerRuby /opt/local/bin/ruby # Set the default environment to development RailsEnv development # Which directory do you want Apache to be able to look into for projects? <Directory "/Users/carlos/work"> Order allow,deny Allow from all </Directory>
You’ll obviously want to replace the path “/Users/carlos/work” with your own. This path doesn’t have to be specific as we’ll be using the Passenger Preference Pane to tell it where are projects are at.
Since the Passenger Preference Pane relies on Ruby Cocoa, we’ll need to install before we start to configure it.
NOTE: The Passenger Preference Pane is 32bit only so you’ll get a warning that the System Preferences has to relaunch in 32bit mode when you try to run it. It doesn’t negatively affect anything but it’s still a minor annoyance. Once MacRuby is stable enough it’ll be ported there and the warnings will go away.
Installing Ruby Cocoa is a simple port install:
sudo port install rb-cocoa
You might get errors setting up your projects using the Passenger Preference Pane because it expects to find the Snow Leopard bundled version of Ruby. Since we installed our own, I just trick it by running the command:
sudo ln -s /opt/local/bin/ruby /usr/bin/ruby
Next, download and install the latest Passenger Preference Pane (as of this writing it’s version 1.3). Adding projects to your Passenger Preference pane should be simple as it’s all GUI driven. When choosing a project path, just point it to the root directory of the project and it’ll figure out the rest.
Even though I prefer Passenger for development mode, it’s still handy to install Mongrel (and simple too).
sudo gem install mongrel
At this point, you should have a working development environment for Ruby on Rails. I’ve tried to distill my notes into something readable just in case someone comes across this. If you have any problems with the steps above, feel free to ask a question in the comments.