October 11, 2021
By: Jesús Gómez

Clojure CLI

En el artículo Clojure el Jar exploré cómo utilizar clojure.main de forma «primitiva».

Para programas más complejos, dividido en módulos, que dependan de bibliotecas de terceros, que requieran «recursos», etc., puede ser muy complicado preparar el entorno de ejecución para que el programa pueda acceder a dichas elementos.

clojure.org pone a nuestra disposición unas herramientas que nos permite programar en Clojure de una forma más simple desde la línea de órdenes.

Estas herramientas se conocen como «Interfaz de Línea de órdenes de Clojure» a la cual me referiré como Clojure CLI.

Instalación

Hay varios métodos de instalación. Cada distribución de Sistema Operativo muy posiblemente las tendrá a disposición con el nombre de clojure.

Exploraremos aquí la manera de instalar Clojure CLI independientemente de la distribución de Sistema Operativo.

Clojure CLI necesita:

  • bash
  • java
  • rlwrap (opcional)

En clojure.org hay un «script» de instalación.

Para el día de hoy, la versión estable de Clojure es la versión 1.10.3.986. Así que descargaremos el instalador de dicha versión y lo ejecutamos.

Si no indicamos nada, el «script» intentará instalar Clojure CLI a nivel del sistema (/usr/bin, etc.). En ese caso, habría que tener permisos para hacerlo (sudo por ejemplo).

Pero con la opción --prefix podemos indicar un destino alternativo. Hagamos eso, instalemos Clojure CLI en ~/clojure.

$ wget https://download.clojure.org/install/linux-install-1.10.3.986.sh
$ chmod +x linux-install-1.10.3.986.sh
$ ./linux-install-1.10.3.986.sh --prefix ~/clojure
...
Installing libs into /home/.../clojure/lib/clojure
Installing clojure and clj into /home/.../clojure/bin
Installing man pages into /home/.../clojure/share/man/man1

Una vez instalado, Clojure CLI queda en la subcarpeta bin: clojure y clj.

clojure es la interfaz principal. Es una herramienta de línea de órdenes para iniciar programas escritos en Clojure (el lenguaje).

clj es un simple envoltorio alrededor de clojure para hacer más amena la interacción con el «REPL» (Read Eval Print Loop).

En la subcarpeta share/man se encuentra el manual en línea de estas herramientas.

Recomiendo enseñarle al sistema cómo conseguir los ejecutables y el manual de Clojure CLI.

Uso

Cuando utilizamos Clojure desde la consola, normalmente utilizamos clj por ergonomía, y clojure en los «scripts».

En cualquier caso, escribir simplemente la orden inicia un REPL interactivo de Clojure:

$ clj
[ . . . ]
Clojure 1.10.3
user=> (+ 1 1)
2

Clojure CLI y clojure.jar

Dejé marcado con puntos suspensivos [ . . . ] un contenido que puede que haya salido o no dependiendo de si es la primera vez que se ejecuta la orden o no.

La primera vez que invocamos clj o clojure, Clojure CLI procede a descargar al mismísimo Clojure y otros paquetes básicos.

Esta es la imagen completa de lo que sucedería:

$ clj
Downloading: org/clojure/clojure/1.10.3/clojure-1.10.3.pom from central
Downloading: org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.pom from central
Downloading: org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.pom from central
Downloading: org/clojure/pom.contrib/0.3.0/pom.contrib-0.3.0.pom from central
Downloading: org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.jar from central
Downloading: org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar from central
Downloading: org/clojure/clojure/1.10.3/clojure-1.10.3.jar from central
Clojure 1.10.3
user=>

En este caso, lo mínimo necesario para utilizar Clojure son los paquetes clojure, spec.alpha y core.specs.alpha.

En el artículo anterior Clojure el Jar , habíamos creado a mano un único jar llamado clojure.jar. En ese caso, ese jar tenía incluido a los demás.

Como Clojure CLI es, entre otras cosas, un envoltorio alrededor de clojure.main, todas las opciones del clojure.main están a nuestra disposición.

Con -M tenemos acceso directo a clojure.main:

$ clj -M -e '(+ 1 1)'

«Clojure CLI» está dirigido por un archivo llamado deps.edn.

Además -M, hay opciones para controlar las direcciones establecidas por el deps.edn.

Para ver qué opciones soporta Clojure CLI, utiliza la opción -h.

Algo interesante es comparar el texto de ayuda de Clojure CLI con el texto de ayuda de clojure.main. Al hacerlo, te darás cuenta que un texto está incluido en el otro. Inténtalo:

$ clj -h
$ clj -M -h

Dejo el artículo hasta aquí porque mi intención no es escribir un manual de Clojure CLI, sino más bien señalar y exponer la relación que existe entre ella y el clojure.jar.

Para saber cómo utilizar bien Clojure CLI, lee al menos la guía Deps and CLI Guide.

En un próximo artículo exploraré cómo crear un archivo jar a partir de un programa escrito en Clojure.

Apéndice

Enseñarle al sistema cómo conseguir los ejecutables y el manual de Clojure CLI

Para que el sistema consiga fácilmente Los *«scripts» clojure y cli añade a la variable de entorno PATH la subcarpeta bin.

Para que el manual en línea man encuentre los manuales de clojure y cli, hay que añadir información acerca de la subcarpeta share/man en diferentes lugares, dependiendo del sistema que uses.

Si usas una distribución de Linux basada en Debian, añade MANDATORY_MANPATH al archivo .manpath del «$HOME».

En caso contrario, añade una entrada al MANPATH\_MAP que relacione la subcarpeta bin con la subcarpeta share/man.

En este caso de ejemplo, y suponiendo un sistema Ubuntu:

$ echo 'export PATH="$HOME/clojure/bin/:$PATH"' >> ~/.bashrc
$ echo 'MANDATORY_PATH home/ubuntu/clojure/share/man' >> ~/.manpath
Tags: CLI Clojure CLI Clojure es Java