Como criar bibliotecas em Clojure e publicar no Clojars

Cesar Augusto Alcancio de Souza
5 min readDec 6, 2021
Biblioteca José Vasconcelos, Cidade do Mexico

Recentemente eu estava preparando um projeto para uma introdução à Clojure e precisava escrever um código que era um pouco mais complexo e que não tinha muito relação com meu contexto.

Esse código era basicamente uma função que recebia um número de 1 a 13 para desenhar na tela uma carta de baralho em caracteres ascii.

Para evitar adicionar esse código no projeto, eu resolvi abstrair o código e colocar em uma biblioteca separada. Dessa forma, a pessoa que estivesse estudando o projeto simples, apenas importaria a biblioteca e chamaria a função. A biblioteca pode ser encontrado no Github.

Nesse artigo vou mostrar como criar uma biblioteca em Clojure e publicar no repositório Clojars caso você tenha a mesma necessidade.

O que é Clojars?

É um repositório Maven, mantido pela comunidade, para publicar bibliotecas Clojure de código aberto. É possível acessar o repositório do Clojars no Maven.

Registrar e gerar um token

Para utilizar o Clojars, basta se registrar uma conta aqui.

Guarde o seu Username, pois ele vai fazer parte do seu groupId e você vai precisar dele na definição do seu projeto.

Depois de se registrar, essa é a página inicial.

No canto superior direito você vai clicar no menu Deploy Tokens.

Agora basta criar o seu token e guardar. Pode colocar qualquer nome pra identificar o token. O escopo é para dizer em que groupId você vai permitir criar pacotes dentro do Clojars, nesse caso pode deixar para todos como está na imagem.

Agora com o username e o token guardados, vamos criar o projeto.

Criando projeto com Leiningen

O Leiningen é uma ferramenta que ajuda a criar projetos em Clojure e também a gerenciar as dependências do projeto.

Primeiro vamos executar o comando lein new app minha-biblioteca e teremos criado o nosso projeto chamado minha-biblioteca.

Agora precisamos adicionar o groupId no nome do nosso projeto, para que o Clojars saiba qual groupId esse projeto vai pertencer.

Execute um cd minha-bibliteca para entrar na pasta do projeto. Dentro da pasta tem um arquivo chamado project.clj com as definições do projeto.

Vamos substituir o nome passado para a função defproject de minha-biblioteca para groupId/minha-biblioteca.

No meu caso org.clojars.cesaralcancio/minha-biblioteca, no seu caso você vai substituir o cesaralcancio pelo username que você criou anteriormente.

Seu project.clj vai ficar mais ou menos assim.

(defproject com.github.cesaralcancio/minha-biblioteca "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
:url "https://www.eclipse.org/legal/epl-2.0/"}
:dependencies [[org.clojure/clojure "1.10.1"]]
:main ^:skip-aot minha-biblioteca.core
:target-path "target/%s"
:profiles {:uberjar {:aot :all
:jvm-opts ["-Dclojure.compiler.direct-linking=true"]}})

Antes de publicar o projeto, vamos adicionar uma função simples no arquivo src/minha_biblioteca/core.clj, para que possamos utilizá-la em outro projeto.

O seu core.clj deverá ser mais ou menos isso.

(ns my-library.core
(:gen-class))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println "Hello, World!"))
(defn hello-world
"Minha primeira biblioteca"
[]
(println "Ola, biblioteca!"))

Publicando o projeto

Dentro da pasta do projeto, você vai executar o comando lein deploy clojars para publicar o seu jar no repositório do Clojars.

Ele vai pedir o username e o token que geramos anteriormente, e vai publicar o serviço no seu Clojars.

Inclusive no lado direito inferior, com o nome Version Badge, você pode copiar um código para colocar no readme do seu projeto e fazer referencia ao repositório do Clojars.

Como usar a biblioteca

Vamos criar um projeto com o comando lein new app meu-cliente para consumir a biblioteca que está hospedada no Clojars.

Vamos atualizar as dependências no project.clj e, dentro da chave tal :dependencies, adicionar[org.clojars.cesaralcancio1/minha-biblioteca "0.1.0-SNAPSHOT"] . O código completo seria.

(defproject meu-cliente "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
:url "https://www.eclipse.org/legal/epl-2.0/"}
:dependencies [[org.clojure/clojure "1.10.1"]
[org.clojars.cesaralcancio1/minha-biblioteca "0.1.0-SNAPSHOT"]]
:main ^:skip-aot meu-cliente.core
:target-path "target/%s"
:profiles {:uberjar {:aot :all
:jvm-opts ["-Dclojure.compiler.direct-linking=true"]}})

Depois disso, vamos executar o comando lein repl, que permite executar códigos Clojure de maneira interativa, utilizando os recursos do projeto, no nosso caso, o projeto meu-cliente.

E uma vez que estamos no namespace do projeto meu-cliente podemos utilizar a função (use '[minha-biblioteca core]) para importar o namespace core da minha-biblioteca e executar a função (hello-world) .

Na imagem podemos ver que depois de executar o lein repl a biblioteca foi baixada do repositório Maven, e o comando (hello-world) escreveu na tela a mensagem Ola, biblioteca!.

Conclusão

Utilizando apenas Clojure, Leiningen e Clojars é possível criar uma biblioteca e hospedá-la publicamente. Essa é a maneira mais simples que eu encontrei de criar uma biblioteca de maneira open source e disponibilizar para que outras pessoas possam utilizar. Espero que tenha ajudado! 🙂

--

--

Cesar Augusto Alcancio de Souza

Sofware Engineer Lead, focused on development and maintenance of products