Cómo preparar tu entorno de desarrollo en OSX

Emanuel Al.
lemontech-engineering
6 min readFeb 22, 2019

En el siguiente blog voy a describir cómo tengo configurado mi entorno de desarrollo con el fin de mostrar algunas herramientas que pueden simplificar la vida de un programador.

A medida que vamos trabajando en distintos proyectos de programación suele ser común la interacción con distintos lenguajes y tecnologías que además van cambiando de version rápidamente. Por este motivo, podemos llegar a necesitar que convivan distintas versiones de un mismo lenguaje en nuestro host, o incluso un escenario más complejo como la imagen de abajo, en donde cada proyecto requiere un stack de tecnologías totalmente distintas a otro o similar pero en distintas versiones :

Por otro lado, eventualmente será necesario actualizar nuestro hardware y tener que hacer un setup desde cero. Los bootstraps y setups son tareas duras y tediosas ya que requieren leer muchas documentaciones, hacer configuraciones, instalar programas, dependencias, etc, y cuando pensamos que ya está todo listo, comenzamos a trabajar y nos damos cuenta de que aún faltan configurar o instalar programas y dependencias.

Por ende en algún momento llegaremos a la problemática de:

  • ¿Cómo lograr que convivan distintas tecnologías y sus variantes en distintas versiones sin entrar en conflicto entre ellas?
  • ¿Cómo automatizar la instalación de un proyecto?

Resolver esto nos ayudaría a:

  • Tener un entorno de desarrollo robusto, apto para trabajar y experimentar con una amplia variedad de tecnologías.
  • Tener una contingencia y poder compartirla con otros programadores que interactúen con nosotros.

A lo largo de mi carrera he probado distintas formas, desde instalaciones manuales, pasando por sistemas de virtualización como ser VirtualBox, VMware, o Docker. Sin embargo, siempre preferí evitar la virtualización en el entorno de desarrollo debido a que terminaba siendo más lenta la experiencia al programar. Por ende prefería usar herramientas como RVM (Ruby Version Manager), NVM (Node Version Manager), Clusters de Postgres, distintas versiones de Elasticsearch, dockers con distintas versiones de MySQL, etc. El problema era que cada vez que quería agregar una tecnología nueva, tenía que buscar un sistema que administrara sus versiones. Por otro lado cuando actualizaba mi laptop, tenía que instalar desde cero cada una de las herramientas anteriores.

Por supuesto hay muchos caminos para llegar a tal fin. Hoy compartiré el camino con el que me sentí más cómodo. La siguiente solución permitirá:

  1. Administrar las distintas versiones de tus lenguajes de programación y tecnologías relacionadas como ser PostgreSQL, Redis, Elasticsearch, MySQL.
  2. Automatizar el bootstrap de tu entorno de desarrollo.
  3. Automatizar el bootstrap de tus proyectos particulares
  4. Tener una contingencia del bootstrap de tu entorno de desarrollo.

A continuación listaré las herramientas que nos permitirán llegar a esto:

  1. Script Laptop de la compañía Thoughtbot.
  2. Personalización del archivo .laptop.localcon las herramientas que utilizo.
  3. Definición de una receta de setup para nuestros proyectos .projects.local.

La mayor parte del trabajo la hace el script de bootstrap que propone Thoughbot. Leyendo el script del archivo mac, encontré una herramienta mágica llamada ASDF que se encarga de administrar la versión de muchos lenguajes y servicios necesarios como Postgres, Redis, Elasticsearh, etc.

Veamos rápidamente como funciona ASDF ejecutando:

$ asdf --help

A continuación podemos buscar si hay plugins que soporten los lenguajes y herramientas que necesitamos:

$ asdf plugin-list-all

Si el lenguaje que queremos figura en la lista, podemos agregarlo con:

$ asdf plugin-add <name> [<git-url>]

El próximo paso será buscar la versión que necesitamos con:

$ asdf list-all <name>

Luego de verificar que está disponible la versión que necesitamos, podemos instalarla con:

$ asdf install <name> <version>

Finalmente podemos verificar el lenguaje agregado en asdf con:

$ asdf list <name>

Otra opción es agregar todas las dependencias que necesitamos con sus respectivas versiones a un archivo oculto llamado.tool-versions que estará adentro del directorio de nuestro proyecto:

ruby 2.3.4
nodejs 8.11.1
redis 5.0.3
elasticsearch 6.0.0

Finalmente podemos instalar todo el stack ejecutando:

$ asdf install

Utilizaremos este último enfoque para crear cada uno de los stacks que necesiten nuestros proyectos de una forma aislada. Se puede ver el ejemplo que hice en el archivo llamado .projects.local

El conjunto de herramientas agregado por Thougtbot es realmente acertado y útil para todo programador e incluye:

Herramientas macOS:

  • Homebrew para administrar librerías del sistema operativo.

Herramientas Unix:

  • Exuberant Ctags
  • Git
  • OpenSSL
  • RCM
  • The Silver Searcher
  • Tmux
  • Watchman
  • Zsh

Herramientas de Heroku:

  • Heroku CLI y Parity

Herramientas de GitHub:

  • Hub para interactuar con la API de GitHub

Herramienta de Imágenes:

  • ImageMagick para recortar y redimensionar imágenes

Lenguajes de programación, administradores de paquetes, y configuración:

  • ASDF para administrar versiones de lenguajes de programación
  • Bundler para administrar librerías de Ruby
  • Node.js y NPM, para ejecutar aplicaciones e instalar paquetes de JavaScript
  • Ruby stable para escribir código de propósito general
  • Yarn para administrar paquetes de Javascript

Base de datos:

  • Postgres para almacenar datos relacionales
  • Redis para almacenar datos clave-valor.

Además de este valioso setup, agregué un conjunto adicional que pienso que puede ser de mucha utilidad para cualquier programador y/o devops.
Personalicé .laptop.localpara que instale las siguientes herramientas:

Aplicaciones:

  • Google Chrome
  • Skype
  • Slack
  • Sublimetext

Herramientas Unix:

  • libmagic
  • font-hack-nerd-font
  • iterm2
  • oh-my-zsh
  • powerlevel9k

Base de datos:

  • mysql@5.6
  • mysqlworkbench

ASDF plugins:

  • asdf-python
  • asdf-postgres
  • asdf-java
  • asdf-elasticsearch
  • asdf-redis

AWS tools:

  • awsebcli
  • aws-cli

Proyectos personales:

  • Ver archivo .projects.local

Iterm2 nos permitirá dividir la terminal en varias ventanas con la finalidad de leer distintos logs al mismo tiempo:

En la misma captura de pantalla podemos observar cómo oh-my-zsh agrega información relevante al proyecto en el prompt, como lo puede ser nombre la rama en la que estamos parados, número de release, si hay cambios que no han sido agregados al area de staging, etc. Oh-my-zsh incluye una amplia variedad de plugins que pueden simplificar nuestros desarrollos con la utilización de shortcuts internacionales. Para sacar el máximo provecho debemos leer un poco el código en el repositorio. A continuación resumiré algunos:

Git:

Bundler:

Rails:

Como se observa en el script, agregué aws-cli y awsebcli para poder interactuar con Amazon desde la terminal y con ElasticBeanstalk.

Los pasos finales serían terminar de configurarpowerlevel9k para que iterm2 use las fuentes correctas:

De forma similar a .laptop.local creé un archivo llamado .projects.local en donde incluyo todo lo necesario para instalar cada uno de mis proyectos personales y laborales.

A continuación un ejemplo:

Si alguien está interesado en el mismo set de herramientas puede bajar mi archivo personalizado de.laptop.local y usar como referencia .projects.local para escribir las recetas de sus proyectos personales.

Como se observa en los scripts será necesario:

  1. Contar con id_rsay id_rsa.puben ~/.ssh/
  2. Verificar conectividad con Github, Bitbucket o similar (lo que se use para clonar) ssh -T git@github.como ssh -T git@bitbucket.org
  3. Editar .laptop.local con tu GIT_USERNAME e EMAIL
  4. Tener los scripts en el home: mac , .laptop.local y .projects.local
  5. Ejecutar sh mac 2>&1 | tee ~/laptop.log

Se recomienda probar el funcionamiento en máquinas virtuales, modificando los scripts hasta llegar al comportamiento esperado.

En el caso de mi script, fue necesario ejecutarlo varias veces, ya que se cortaba la ejecución de la instalación luego de instalar algunas herramientas.

Cuanto más completo sea el setup, tendremos que configurar menos cosas en la nueva laptop y es un buen punto de partida que aliviará la pesada tarea de bootstrap de aplicaciones y olvidar dependencias necesarias para que nuestro proyecto funcione. También ayudará a cualquier desarrollador que se una al equipo contar con un bootstrap básico de tecnologías.

Como mejoras a esto se podría incluir Docker para instalar distintas versiones de MySQL por ejemplo, ya que aún no se ve un desarrollo final en ASDF para esto.

Otro detalle que extrañaré en ASDF será la funcionalidad de crear gemsets que ofrece RVM, lo encontraba útil cuando quería probar actualizaciones de gemas.

Espero que esto pueda ayudar a otros programadores que se encuentren buscando una forma de automatizar y gestionar sus herramientas.

--

--