Como criar bibliotecas em Clojure e publicar no Clojars
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! 🙂