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.edndefine las dependencias y la estructura del proyecto. -
Las dependencias usan coordenadas Maven.
-
tools.buildpermite crear un JAR ejecutable con todas las dependencias. -
Un uberjar es la forma más común de distribuir aplicaciones Clojure.
Ejercicios
- Crea un proyecto mínimo con
deps.edny un archivocore.cljque imprima "¡Hola Clojure!" al ejecutarse.
This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.
Support me on Ko-fi