Actualmente estamos comenzando un proyecto que consta de unos ajustes a una aplicación en Rails que utiliza una versión vieja de este framework (1.2.3) y por razones de tiempo y costo, no es posible realizar una actualización a una versión mas nueva (2.x).
En mi caso, por ser un desarrollador con Ruby y con Rails, no puedo darme el lujo de hacer un downgrade total a versiones viejas, incluso, Rails 1.2.3 no es compatible con los últimos patchlevel (actualizaciones varias y de seguridad) de Ruby 1.8.6 ni con Ruby 1.8.7 (ni pensar Ruby 1.9). Mi laptop actualmente tiene Ubuntu Jaunty (9.04), por lo que Ruby es de la serie 1.8.7.
Mi solución fue instalar Ruby Enterprise de Phusion, y mantener una instalación paralela en /opt. Pero una de las extensiones que necesitaba instalar era ruby-ldap, que para hacer las cosas más interesantes, la compilación fallaba, las razones se explican aquí.
Para resumir, la versión de libldap2 incluida en Ubuntu Jaunty no es compatible con ruby-ldap 0.9.7 ni con el último ruby-ldap 0.9.8, por lo que la solución era descargar una versión anterior de las librerías de OpenLDAP (la estable del 2008) y compilar ruby-ldap contra estas librerías.
Para agregarle mas interés a todo el embrollo, resulta que la compilación de openldap-2.4.11 (la estable del 2008), también generaba error, ¿la razón?, básicamente, esa versión de OpenLDAP no compila con GCC 4.3. Gracias a la gente de mi antigua y aún muy querida favorita distribución Gentoo, pude compilar las librerías de OpenLDAP gracias a un patch suministrado por ellos, descargable aquí.
Instalación
A continuación los pasos de esta mini-odisea para dejar documentada la solución, tanto para mí como para la comunidad.
El primer paso es instalar Ruby Enterprise (pero primero unas dependencias, que el mismo instalador de Ruby Enterprise solicitará si no se encuentran instaladas)
sudo aptitude install libssl-dev libreadline5-dev
Luego, descomprimir el tarball de Ruby Enterprise e instalar (seguir instrucciones del instalador de línea de comando):
tar xzvf ruby-enterprise-1.8.6-20090520.tar.gz
cd ruby-enterprise-1.8.6-20090520/
sudo ./installer
Ruby Enterprise es instalado por defecto en /opt, para facilitar el acceso a los ejecutables, realizaremos enlaces simbólicos a /usr/bin:
sudo ln -s /opt/ruby-enterprise-1.8.6-20090520/bin/ruby /usr/bin/rubye
sudo ln -s /opt/ruby-enterprise-1.8.6-20090520/bin/gem /usr/bin/geme
sudo ln -s /opt/ruby-enterprise-1.8.6-20090520/bin/irb /usr/bin/irbe
Nótese que los symlinks se llaman igual, pero finalizan con "e" de Enterprise. Por lo tanto para utilizar Ruby Enterprise, desde la línea de comando sólo debemos utilizar rubye, y para instalar gemas utilizamos geme.
Antes de compilar la extensión ruby-ldap, instalar las librerías de OpenLDAP, en este caso utilizaremos como destino /opt/openldap, para evitar conflictos con las librerías existentes en el sistema (Nota: reemplazar openldap_patch.diff por el nombre asignado al momento de descargar el Patch OpenLDAP para GCC 4.3 o superior):
tar xzvf openldap-stable-20080813.tgz
cp openldap_patch.diff openldap-2.4.11/
cd openldap-2.4.11/
patch -p1 < openldap_patch.diff
./configure --prefix=/opt/openldap --enable-slapd=no
make depend
make
sudo make install
Ahora se procede a instalar ruby-ldap 0.9.7, descomprimir el tarball e instalar, indicando las librerías de ldap en /opt/openldap:
tar xzvf libldap-ruby_0.9.7.orig.tar.gz
cd ruby-ldap-0.9.7/
rubye extconf.rb --with-ldap-dir=/opt/openldap
make
sudo make install
Nótese el uso de rubye para la configuración de la extensión.
Instalar las gemas necesarias (nótese el uso de geme y no gem):
sudo geme install rails -v x.x.x
# ...
Adicionalmente, para facilitar el acceso al rake de la instalación de Ruby Enterprise, creé un enlace simbólico a /usr/bin (igual que con rubye, irbe y geme):
sudo ln -s /opt/ruby-enterprise-1.8.6-20090520/bin/rake /usr/bin/rakee
Como observación, los scripts de línea de comando de Rails (por ejemplo, script/server), deben invocarse con rubye -S. Ejemplo:
## Iniciar el servidor local de desarrollo
rubye -S script/server
## Iniciar la cónsola de la aplicación
rubye -S script/console --irb=irbe
## Las Tareas rake debe utilizar rakee
rakee db:migrate
Saludos!
Escribir un comentario