Laravel Sail: la mejor forma de empezar a desarrollar con Laravel

Montar un entorno de desarrollo en local con Laravel ahora es cuestión de minutos gracias a Sail. Vemos como montar un proyecto desde cero y algunos comandos esenciales.

Laravel Sail: la mejor forma de empezar a desarrollar con Laravel

Antes, dependiendo del sistema operativo con el que estuviéramos trabajando, montar un entorno de desarrollo en local suponía tomar ciertas decisiones.

Si estábamos usando Mac podíamos usar Valet y en cuestión de minutos tener un entorno de desarrollo más o menos funcional, pero Valet no funcionaba ni en Windows ni en Linux.

La otra opción era usar Homestead, que no es rápido de montar o contenedores docker que teníamos que crear uno a uno para cubrir nuestras necesidades y preparar nuestro entorno de desarrollo.

Ahora, con Laravel Sail, todo esto ha cambiado y podemos tener un entorno de desarrollo funciona, sea cual sea nuestro sistema operativo, en cuestión de minutos.

📹 Laravel Sail, desde cero (Vídeo)

👉 Suscríbete ahora al canal


📃 Laravel Sail, desde cero.

¿Cómo comenzar un proyecto desde cero?

Lo único que necesitamos, antes de empezar, es instalar Docker Desktop en nuestra máquina y, en caso de estar Windows, usar Windows Subsystem for Linux 2 (WSL2).

Después, desde el terminal y en el directorio en el que queramos descargar Laravel, ejecutamos el siguiente comando dando nombre al proyecto.

curl -s "https://laravel.build/example-app" | bash

Esto descargará todo lo necesario para montar nuestro entorno local de desarrollo y comenzar a trabajar con Laravel. Al final del proceso te pedirá contraseña sudo para poder configurar los permisos de ciertas carpetas dentro del proyecto.

Nada más terminar el comando, si vemos la salida que nos da, nos dice que entremos al directorio y levantemos los contenedores con:

cd example-app && ./vendor/bin/sail up

Con esto, ya está el entorno de desarrollo montado y funcionando. Por defecto tendremos:

  • Un contenedor para la aplicación en sí con PHP 8.
  • Otro para la base de datos en MySQL aunque existe la opción de usar Postgres.
  • Un contendor de Redis para el caché.
  • Y por último uno de Selenium para ejecutar los tests de navegador de Laravel Dusk en caso de que lo necesitemos.

Antes de empezar, configurar el alias

Hay que tener en cuenta que, como ahora nuestro proyecto está dentro de un contenedor Docker, tenemos que ejecutar los comandos desde dentro de este contendor que es en donde se encuentra la versión de PHP esperada, entre otras cosas. Puede parecer complicado, pero verás como en realidad es todo lo contrario.

Lo primero que tenemos que hacer, aunque es opcional, es configurar un alias para ejecutar, más rápidamente, el ejecutable de Sail.

Lo que haremos es añadir, en el archivo .zshrc o .bashrc lo siguiente:

alias sail='bash vendor/bin/sail'

Una vez configurado el alias podremos trabajar con sail simplemente usando sail, desde el terminal, en vez de ./vendor/bin/sail.

Arrancar o parar los servidores

Para arrancar el servidor simplemente debemos ejecutar sail up para ver el log de salida en primer plano, o sail up -d para ejecutarlo en segundo plano en modo "demonio".

Cuando queramos parar los contenedores solamente tendremos que escribir sail  down. Como puedes ver son exactamente los mismos comando que usamos con Docker. De hecho, si escribes simplemente sail estarás lanzando docker ps. Es una forma sencilla de trabajar en el día a día y de abstraerse un poco de Docker.

Ejecutando comandos con artisan

Al ejecutar cualquier comando nos interesa hacerlo dentro del contenedor y para ello, debemos de trabajar con sail en vez de usar directamente artisan o php artisan como solemos hacer.

# Ejecutará las migraciones localmente
php artisan migrate

# Ejecutará las migraciones dentro del contenedor docker, con Laravel Sail
sail artisan migrate

Esto mismo pasa con PHP, Composer y Node/NPM

# Descar Dusk, con composer dentro de Laravel Sail
sail composer require --dev laravel/dusk

# Imprime la versión de PHP dentro de Laravel Sail
sail php --version

# Compilar los assets de producción desde Laravel Sail
sail npm run prod

Como puedes ver, por lo general viene preparado para trabajar con cualquiera de estos componentes como lo hacemos habitualmente con la única diferencia de que deberemos de añadir sail al principio.

Ejecutar tests unitarios

Con Sail podremos ejecutar los tests unitarios de PHPUnit sin ningún problema desde el primer segundo. Simplemente haremos:

sail test

# Equivalente a
sail artisan test

Ejecutar tests de navegación con Laravel Dusk

Ejecutar los tests de navegación conlleva más configuración que los tests unitarios. Necesitamos en este caso un contenedor de Selenium y los chrome drivers necesarios.

Para conseguir esto solamente tenemos que descomentar el siguiente bloque del archivo docker-compose.yml:

selenium:
    image: 'selenium/standalone-chrome'
    volumes:
        - '/dev/shm:/dev/shm'
    networks:
        - sail

Y añadir la dependencia de Selenium en el contenedor laravel.test:

depends_on:
    - mysql
    - redis
    - selenium

Con esto, e instalando obviamente la librería laravel/dusk ya podremos lanzar los tests con sail dusk.

En este caso, aunque pueda parecer lo contrario, el comando sail artisan dusk no es equivalente y fallaría al ejecutarlo.

Personaliza Laravel Dusk

Por último, tienes que saber que puedes configurar los contenedores a tu gusto simplemente publicando los archivos de configuración como harías con cualquier otra librería.

sail artisan sail:publish
Recuerda que cada cambio que hagas tendrás que reconstruir los contenedores con sail build --no-cache