Instalar un entorno de desarrollo Ruby on Rails en OS X 10.7.3

Después de varios intentos frustrados, usando dos y hasta tres tutoriales diferentes, he conseguido instalar mi entorno de desarrollo RoR en OS X 10.7.3. No es tarea fácil, pero en menos de una hora lo tendréis listo si seguís los mismos pasos que yo.

Aparte, os recomiendo que instaléis también RVM para la gestión de diferentes versiones de Ruby y Rails, que luego os simplificará la vida cuando tengáis que cambiar el entorno de desarrollo para mantener aplicaciones que ya tengáis en el servidor.

Finalmente también os recomiendo Passenger para simplificar la integración con Apache y así emular lo más posible el entorno de producción, en lugar de usar WEBrick el servidor web que lleva Rails por defecto.

Mi configuración:

  • Mac OSX 10.7.3
  • XCode 4.3
  • RVM 1.10.3
  • Ruby 1.9.3
  • Rails 3.2.1
  • MySQL 5.5
  • Passenger 3.0.11

Ten en cuenta que muchos de los comandos instalarán las últimas versiones de las herramientas y librerías, así que tus resultados puede variar. Por ejemplo, al ejecutar ‘gem install rails’ en el momento de publicar este post, la versión que se instala es Rails 3.2.1., la última versión disponible a finales de Febrero 2012.

1. Instalar Xcode

Te lo puedes bajar en el App Store de Apple, o en el Developer center. Necesitas un Apple ID.

Con XCode 4.3 las herramientas de la línea de comando son opcionales. Instálalas en Xcode > Preferences > Downloads.

2. Homebrew

Homebrew es una applicación que nos sirve para facilitar la instalación de software libre sobre Mac OS X. Siguiendo las instrucciones:

$> /usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"
==> This script will install:
/usr/local/bin/brew
/usr/local/Library/Formula/...
/usr/local/Library/Homebrew/...

Press enter to continue
==> Downloading and Installing Homebrew...
==> Installation successful!
Now type: brew help

3. RVM

Para instalar RVM, el sistema de gestión (que no control) de versiones de Ruby, lo primero es instalar Git (este si que es un sistema de control de versiones, para liarlo más)

$> brew install git

Una vez tenemos git instalado, instalamos RVM…

$> bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer) 
1

... y lo configuramos:
1
$> source ~/.rvm/scripts/rvm

Pero no todo es tan fácil. Si ejecutamos

$> rvm notes

Notes for Mac OS X 10.7.3, No Xcode.

For JRuby:  Install the JDK. See http://developer.apple.com/java/download/  # Current Java version "1.6.0_26"
For IronRuby: Install Mono >= 2.6
For Ruby 1.9.3: Install libksba # If using Homebrew, 'brew install libksba'
...

Es decir, que si queremos soporte para Ruby 1.9.3 tenemos que instalar libksba:

brew install libksba

Y luego instalar RVM con clang como compilador (gracias Stack Overflow)

$> rvm install 1.9.3 --with-gcc=clang

Para hacer que 1.9.3 sea la versión por defecto:

$> rvm --default use 1.9.3
$> ruby -v
$> ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]

4. Rails

A medida que vamos instalando herramientas, se hace más fácil la instalación:

$> gem install rails

Esto instala Rails y gems dependientes, incluyendo Bundler (gestión de gemas para deployment). Comprobemos que versión tenemos instalada.

$> rails --version
Rails 3.2.1

5. MySQL 5.5

Puedes elegir la base de datos SQL o No-SQL que más te guste. Para esta guía he elegido MySQL 5.5.

$> brew install mysql

Para crear la base de datos y los usuarios:

$> unset TMPDIR
$> mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

Lanza el servidor

$> mysql.server start

Haz tu instalación de MySQL más segura (cambia el password de root, borra los usuarios anónimos, bloquea el acceso remoto, borra la base de datos de test y vuelve a cargar las tablas de privilegios):

$> mysql_secure_installation

Crear un usuario de desarrollo de MySQL

$> mysql -u root -p
mysql> use mysql;
mysql> insert into user(host, user, password) values ('localhost', 'dev_user', '');

6. Passenger

Phusion passenger es un módulo de Apache para deployear (¿alguien conoce un verbo mejor?) aplicaciones de Ruby on Rails. Es el método recomendado por los creadores de Rails.

$> gem install passenger
$> passenger-install-apache2-module

Para configurar Apache con passenger, sigue las instrucciones en pantalla (te las resumo a continuación). Enciende Apache desde System Preferences > Sharing > Web Sharing (tiene que estar activado)

Edita con sudo el fichero /etc/apache2/httpd.conf e incluye la configuración de Passenger al final del fichero:

Include /etc/apache2/other/passenger.conf

Cierra httpd.conf y crea el fichero de configuración para passenger

touch /etc/apache2/other/passenger.conf

Edita con sudo el fichero /etc/apache2/passenger.conf

LoadModule passenger_module /Users/cesar/.rvm/gems/ruby-1.9.3-p125/gems/passenger-3.0.11/ext/apache2/mod_passenger.so
PassengerRoot /Users/cesar/.rvm/gems/ruby-1.9.3-p125/gems/passenger-3.0.11
PassengerRuby /Users/cesar/.rvm/wrappers/ruby-1.9.3-p125/ruby

Ten en cuenta que mi directorio home es 'cesar', pero el tuyo seguramente será otro.

Reinicia Apache

sudo apachectl restart

Comprueba en /var/log/apache2/error_log que no hay errores. Por ejemplo:

[Thu Feb 23 18:00:21 2012] [notice] Apache/2.2.21 (Unix) DAV/2 Phusion_Passenger/3.0.11 configured -- resuming normal operations

7. Crea una aplicación Rails de ejemplo

Voy a seguir el ejemplo típico del blog de Rails, que está en la guía Getting Started with Rails.

Crear el directorio para los proyectos rails. Yo lo tengo en mi home:

$> cd ~
$> mkdir railsprojects
$> cd railsprojects

Para crear la aplicación:

$> rails new blog

Configura Passenger y Apache para esta aplicación, activando virtual hosts si no está activado en /etc/apache2/httpd.conf . Busca:

# Virtual hosts
# Include /private/etc/apache2/extra/httpd-vhosts.conf

Borra el '#' de la segunda línea, para incluir el fichero de hosts virtuales. A continuación, edita (con sudo) /private/etc/apache2/extra/httpd-vhosts.conf y añade:

<VirtualHost *:80>
       ServerName blog.lvh.me
       DocumentRoot /Users/cesar/railsprojects/blog/public
       RailsEnv development
       <Directory /Users/cesar/railsprojects/blog/public>
           AllowOverride all
           Order allow,deny
           Allow from all
           Options -Indexes +FollowSymLinks MultiViews
       </Directory>
</VirtualHost>

Ten en cuenta que mi directorio home es 'cesar', pero el tuyo puede ser otro.

Reinicia Apache una vez más con sudo apachectl restart

En tu navegador visita blog.lvh.me (ya he hablado de LVH en otro post. Es lo mismo que localhost).

Si ves esta pantalla, ya tienes Rails configurado y funcionando. Ahora hay que terminar de cerrar el stack, configurando la base de datos MySQL.

Editar el Gemfile en el directorio blog y añade:

gem 'mysql2'

Instala la nueva gema con

$> Bundle install

Edita ~/railsprojects/blog/config/database.yml y cambia la sección 'development':

development:
adapter: mysql2
encoding: utf8
database: blog_development
pool: 5
username: dev_user
password:
socket: /tmp/mysql.sock

Crea la base de datos:

$> rake db:create

Dale permisos al usuario dev_user:

$> mysql -u root -p
mysql> grant SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD on *.* to 'dev_user'@'localhost';
$> flush privileges;

Genera el scaffolding de Post, que crea una migración con el script en SQL para modificar la base de datos:

$> rails generate scaffold Post name:string title:string content:text

Si se ha creado una tabla posts en la base de datos: Has triunfado. Enhorabuena ya tienes el entorno de Rails listo en tu Mac OS X 10.7.3