19. Distribución

Has forjado tu espada, has entrenado con ella y has superado todas las pruebas. Ahora necesitas salir de la herrería y cabalgar hacia el mundo. En Clojure, distribuir tu software es sorprendentemente sencillo: empaquetas todo en un archivo JAR y cualquier máquina con Java podrá ejecutarlo. Tu código, listo para la aventura.

Estructura de un proyecto

Un proyecto con Deps and CLI tiene esta estructura mínima:

mi-proyecto/
├── deps.edn
└── src/
    └── mi_proyecto/
        └── core.clj

El archivo deps.edn define las dependencias y la configuración.

{:paths ["src"]
 :deps {org.clojure/clojure {:mvn/version "1.12.0"}}}

Añadir dependencias

Las dependencias se declaran en :deps con sus coordenadas Maven.

{:paths ["src"]
 :deps {org.clojure/clojure {:mvn/version "1.12.0"}
        ring/ring-core {:mvn/version "1.12.2"}}}

Crear un JAR ejecutable

Con la herramienta tools.build puedes crear un uberjar: un JAR que incluye tu código y todas las dependencias.

Añade un alias en deps.edn:

{:paths ["src"]
 :deps {org.clojure/clojure {:mvn/version "1.12.0"}}
 :aliases
 {:build
  {:deps {io.github.clojure/tools.build {:mvn/version "0.10.5"}}
   :ns-default build}}}

Crea el archivo build.clj:

(ns build
  (:require [clojure.tools.build.api :as b]))

(def basis (delay (b/create-basis {:project "deps.edn"})))
(def class-dir "target/classes")
(def uber-file "target/mi-proyecto.jar")

(defn uber [_]
  (b/copy-dir {:src-dirs ["src"] :target-dir class-dir})
  (b/compile-clj {:basis @basis :class-dir class-dir})
  (b/uber {:class-dir class-dir :uber-file uber-file :basis @basis
           :main 'mi-proyecto.core}))

Ejecuta:

clojure -T:build uber
java -jar target/mi-proyecto.jar

Resumen

  • deps.edn define las dependencias y la estructura del proyecto.

  • Las dependencias usan coordenadas Maven.

  • tools.build permite crear un JAR ejecutable con todas las dependencias.

  • Un uberjar es la forma más común de distribuir aplicaciones Clojure.

Ejercicios

  1. Crea un proyecto mínimo con deps.edn y un archivo core.clj que imprima "¡Hola Clojure!" al ejecutarse.

Este trabajo está bajo una licencia Attribution-NonCommercial-NoDerivatives 4.0 International.

¿Me invitas a un café?

Visitantes en tiempo real

Estás solo: 🐱