Usando MacPorts para instalar Ruby on Rails en Mac OS X
Luego del salto de fé a mi primera MacBook el paso lógico siguiente era recrear en ese precioso hardware el ambiente de desarrollo web de mi PC de desarrollo Linux. Particularmente me interesaba instalar el stack Ruby on Rails completo más todo el Software Libre adicional que había descubierto imprescindible para acompañarlo.
Para comenzar, y casi igual que como sucede en Linux, no hay una única forma de hacerlo en Mac OS X. En esta guía intentaré repasar mi exitosa experiencia haciéndolo con MacPorts y explicando el porqué de esa elección, de entre todas las posibles.
Veamos entonces qué tan fácil es tener un entorno de desarrollo web para Ruby on Rails que nada tendrá que envidiarle al que ya configuramos en Linux.
¿Tarballs, Fink o MacPorts?
Básicamente, para correr todo el Software Libre y el Open Source que queramos en Mac OS X tenemos 3 alternativas:
- Tarballs: Bajarnos los paquetes fuentes de la aplicación (tarball), descomprimirlos, configurarlos y compilarlos "a mano" de la misma manera que lo hacíamos en GNU/Linux, encargándonos además de resolver previamente cualquier problema de dependencias (como librerías y otras molestias). Algo bastante primitivo que me recuerda a mis primeros obscuros días en GNU/Linux. Afortunadamente, tenemos la opción de usar un administrador de paquetes de software para hacer todo ese trabajo. En Mac OS X hay dos.
- Fink Project. Fué el primer intento para traer todo el software Open Source *nix a Mac OS X. A diferencia de MacPorts ofrece paquetes binarios precompilados, además de la opción de construirlos manualmente si así lo deseamos.
- MacPorts (antes conocido como Darwin Ports). Comenzó dos años después que Fink (2002) con varios empleados de Apple involucrados y es más similar a la colección de "ports" de BSD. No nos libramos del trabajo de la compilación de cada uno, pero por lo menos esto se realiza automágicamente.
Al principio no tenia en claro cuál de las dos últimas alternativas es superior; para peor, como con tantas otras cosas relacionadas con proyectos de Software Libre similares, parece haber una "guerra santa" entre los partidarios de uno y otro que sólo hace las cosas más confusas.
Fink tiene una evidente influencia del sistema "apt-get" de Debian GNU/Linux, con hasta versiones "estables" y "experimental" de sus paquetes binarios (que también se llaman ".deb").
MacPorts, por otro lado, está moldeado según los "ports" de FreeBSD con una sola y actualizada versión disponible para cada uno de sus paquetes.
Con prácticamente una cantidad de recursos similar en Internet para una y otra, la elección entre cualquiera de ellas es casi una cuestión personal.
Mi criterio: Teniendo en cuenta que Mac OS X tiene verdaderas entrañas BSD y que intentar "mezclar" paquetes inestables y estables generalmente tiene consecuencias desastrosas en cualquier sistema basado en Debian GNU/Linux (si tenemos la posiblidad, créanme que eventualmente se nos ocurrirá intentar hacerlo), MacPorts me pareció la mejor alternativa en este momento. El "know how" sobre MacPorts y Ruby on Rails disponible es excelente y en mi experiencia, las últimas versiones de sus paquetes disponibles demostraron estar tan actualizadas como aquellas disponibles en las versiones "inestables" de Debian y Ubuntu. Además, los "ports" son la manera preferida para manejar paquetes de software en FreeBSD, una buena porción del cual está en el mismo corazón de Mac OS X.
Todas las anteriores opciones requieren que instalemos antes Xcode, el entorno de desarrollo de Apple, que incluye la colección de compiladores del proyecto GNU entre otras cosas imprescindibles. Xcode 2.4.1 es la versión disponible para Mac OS X 10.4 "Tiger" y la más reciente Xcode 3.0 corresponde al nuevísimo Mac OS X 10.5 "Leopard", lanzado hace sólo semanas (más sobre ésto al final).
Xcode Tools
La última versión (al momento de escribir esto) 2.4.1 de Xcode está disponible como una descarga gratuita para todos los desarrolladores regristrados en el sitio Developer Connection de Apple. Por favor, noten que se trata de una descarga de 923.2 Mb. Su instalación afortudamente está bien documentada en toda la red, y también es posible desinstalarlo si queremos repetir la elección de las opciones con las que lo instalamos originalmente.
Ruby on Rails con MacPorts 1.5
La última versión (como siempre, al momento de escribir esto) de MacPorts es la 1.5, y su instalador se encuentra disponible para las 3 últimas versiones de Mac OS X: 10.3 "Panther", 10.4 "Tiger" y 10.5 "Leopard". Su instalación es trivial y prácticamente idéntica a cualquier otro paquete ".dmg". Luego podemos verificar su correcta instalación con el siguiente comando:
$ port version
Version: 1.520
Si vemos el siguiente mensaje ya tenemos más de 3000 paquetes de Software Libre a sólo un comando de distancia. Sigamos instalando los más básicos ejecutando:
$ sudo port install ruby
$ sudo port install rb-rubygems
$ sudo port install subversion +tools
$ sudo port install sqlite3
Notar que todos los paquetes anteriores requerirán sus propias dependencias, que serán descargadas y compiladas ordenadamente, por lo que todo el proceso puede demorar varios minutos o aún más, dependiendo de la velocidad de nuestra conexión y el poder de nuestro CPU.
La instalación de Ruby on Rails usando RubyGems es exactamente igual a como lo hicimos en Linux, y las instrucciones que publiqué para Ubuntu 6.06 son perfectamente compatibles. ¿No es maravilloso el Software Libre?
Las repasemos nuevamente:
$ sudo gem install rake --remote
$ sudo gem install rails -y
$ sudo gem install sqlite3-ruby
Notar que para instalar el driver de SQLite3 de Ruby no hizo falta ninguna dependencia adicional del sistema (como librerías, etc.), al contrario que en Linux. ¡Todo lo necesario ya estaba disponible con Xcode!
También instalaremos ImageMagick para manipular imágenes con RMagick y MiniMagick. Desgraciadamente, decir esto es más difícil que hacerlo y en la red sobran ejemplos de quienes lo intentaron y fallaron, además de recetas para hacerlo de las maneras más inveroísimiles (incluyendo compilarlo desde sus fuentes, algo que me resistí a hacer desde el principio).
Afortundamente, después de más de darme más de un cabezazo contra la pared encontré el procedimiento correcto para hacerlo usando sólo MacPorts. Primero, comenzamos instalando el port de ImageMagick:
$ sudo port install ImageMagick +no_x11
Luego instalamos RMagick, pero no usando RubyGems, sino su correspondiente port (podemos obviar las advertencias que nos arroja el siguiente comando, ambas se refieren a la disponibilidad de unos ejemplos de RMagick):
$ sudo port install rb-rmagick
Otra gema que resulta muy conveniente para manipular imágenes con ImageMagick desde Ruby es MiniMagick. Esta la podemos instalar tranquilamente con RubyGems (además, porque todavía no tiene un port correspondiente):
$ sudo gem install mini_magick -y
La instalación de MySQL 5.0 es sólo un poco más larga. Primero nos descargamos el port del servidor:
$ sudo gem install mysql5 +server
Al finalizar su instalación veremos un mensaje como este:
###########################################################
# A startup item has been generated that will aid in
# starting mysql5 with launchd. It is disabled
# by default. Execute the following command to start it,
# and to cause it to launch at startup:
#
# sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
###########################################################
---> Installing mysql5 5.0.45_3+darwin_8+server
******************************************************
* In order to setup the database, you might want to run
* sudo -u mysql mysql_install_db5
* if this is a new install
******************************************************
Como dicen las instrucciones anteriores, configuramos la base de datos por primera vez y única con el comando:
$ sudo mysql_install_db5 --user=mysql
Luego nos queda iniciar el servidor, podemos hacer que ésto se realice automáticamente cada vez que arranque Mac OS X usando la línea que se sugiere en el mensaje anterior:
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
Si queremos revertir el comando anterior podemos usar:
$ sudo launchctl unload -w /Library/LaunchDaemons/org.macports.mysql5.plist
Generalmente no me gusta tener servicios innecesarios ejecutándose y consumiendo memoria y CPU, por eso prefiero iniciar MySQL explícitamente cada vez que lo necesito. Esto se puede con el comando:
$ sudo /opt/local/share/mysql5/mysql/mysql.server start
(Cambiar el start por stop para detener el servidor)
MacPorts más allá de Ruby on Rails
Pero por supuesto, con MacPorts no sólo podemos tener un completo stack Rails, otras alternativas también están a un comando de distancia: Apache 2.2.6, Lighttpd 1.4.18, PHP 5.2.5, PostgreSQL 8.3, Python 2.5 (y hasta 3.0 Alpha), Django 0.96, etc., etc. Todo el Software Libre que podamos necesitar para nuestro proyecto web está ahí, y al igual que en Linux, fácilmente instalable, desinstalable y actualizable.
Sumémosle a lo anterior la disponibilidad de excepcional software comercial sólo disponible para Mac como TextMate, CSSEdit, PhotoShop, PixelMator, etc., y de pronto Mac OS X parece una alternativa mucho más atractiva que Linux para el escritorio de trabajo del desarrollador web conciente de la línea de comando.
Actualización Leopard
Cuando comencé a escribir esto, la última versión 10.5 "Leopard" de Mac OS X todavía no había sido lanzada. Ahora está disponible en todo el mundo y en cada nueva Mac. Junto con Leopard también se hizo disponible una nueva versión de Xcode, la v3.0, sólo para esta última versión de OS X, y casi al mismo tiempo también la actualización v2.5 "para los que necesitan continuar usando las herramientas de Tiger mientras corren Leopard".
En haras de la estabilidad seguiré optando por Mac OS X 10.4 "Tiger" y Xcode 2.4.1 por el momento, por lo menos hasta la próxima gran actualización de mi flamante MacBook o de mi increíble "Hackintosh". Desde hace un buen tiempo esa combinación de software ha probado ser bastante buena y soportada para el desarrollo con Ruby on Rails y todavía no parece haber un motivo irresistible para preferir lo último sobre lo más probado.
Además, recordemos que a Tiger le llevó 11 actualizaciones para convertirse en la versión de Mac OS X más estable hasta la fecha. ¿Cuántas necesitará Leopard?
También en Hackintosh
Todos los pasos para la instalación de MacPorts y el stack Ruby on Rails en Mac OS X también los pude replicar muy exitosamente en mi Hackintosh, ¿una prueba más de la idoneidad de ese tipo de hardware a pesar de que a Apple le gustaría que pensáramos lo contrario? Muy pronto prometo más comentarios sobre mis experiencias al respecto.
Referencias
Como dije más arriba, hay abundante información en la red sobre cómo usar MacPorts para instalar el "stack" de Ruby on Rails perfecto. Los siguientes enlaces me fueron particularmente valiosos para tener éxito en esa misma tarea:
- Installing MacPorts.
- Super Simple Ruby on Rails Install with MacPorts (for Leopard).
- Installing Ruby on Rails and PostgreSQL on OS X, Second Edition.
- How To Install MacPorts, Apache2, Rails, MySql, Mongrel, and Subversion on an Intel Mac.
- MacPorts Guide.
¡Oooppss! ¡Rails 2.0!
Todo el procedimiento anterior lo verifiqué instalando Rails 1.2.x y terminé de redactarlo justo a tiempo para el lanzamiento de Rails 2.0 (ironía de ironías). La instalación de esta nueva versión no debería ser muy distinta, pues RubyGems siempre instalaría la última versión disponible a menos que le digamos lo contrario. Quienes ya lo hagan hecho y quieran corregir o aclarar algo de lo publicado, no duden en enviarme un e-mail.