Como construir projetos Clojure com Leiningen

Dois pontos essenciais, não diretamente relacionados ao código, em projetos sérios são gestão de código (ou controle e versionamento de código) e ferramentas de automação de build. Para uma tecnologia tão prática como clojure não faz sentido usar tecnologia arcaicas e duras, então para versão de código você vai usar o GIT.

Para quem trabalha com java provavelmente está acostumado a usar o Ant ou o Maven para gerir os projetos (provavelmente parcialmente disfarçados por uma IDE), e quem já editou um pom.xml de um projeto sabe o inferno que isso se torna. Então, como uma ferramente elegante que é o Clojure, uma ferramenta de build e automação tão elegante quanto é necessária. Eis que temos o Leininghen.

Leininghen (não sei pronunciar) é uma ferramente de build para clojure em clojure desenhada para não te perturbar (adaptação minha da explicação oficial). Não tem XML, hail that. Você tem um arquivo de configuração escrito em, vejam só, Clojure! E é bem simples até (e programável, já que é de fato um programa), e pequeno.

Ele serve basicamente para:

  • Criar um projeto em branco com uma estrutura padrão
  • Baixar as depend&eecirc;ncias
  • Rodar os testes
  • Compilar e empacotar

Ele usa ainda o Clojars.org , um repositório de bibliotecas jar para clojure, como base para dependências, além de visar o GIT.

Mão na massa:

Primeiro você entra na github do leiningen e baixa o script, e coloque-o no seu path e rode o instalador:

$ wget -O lein http://github.com/technomancy/leiningen/raw/stable/bin/lein
$ chmod +x lein
$ sudo mv lein /usr/bin/lein
$ lein self-install

Isso vai baixar o próprio lein para seu usuário pode usar. Agora começamos um projeto.

lein new meuprojeto  

Isso vai criar um projeto “meuprojeto” mínimo, com a estrutura básica de pastas. Mais ou menos assim:

/meuprojeto
/meuprojeto/classes
/meuprojeto/lib
/meuprojeto/src/meuprojeto/core.clj
/meuprojeto/test/meuprojeto/core.clj
/meuprojeto/project.clj
/meuprojeto/README
/meuprojeto/.gitignore

Ele vem com as pastas para as classes compiladas, para as dependências, código fonte e testes (e o primeiro arquivo).

O project.clj é a configuração, o README é para explicação do projeto (e para o GIT) e o .gitignore também. Então agora temos que configurar o project.clj. Ele vem assim:

(defproject meuprojeto "1.0.0-SNAPSHOT"
:description "FIXME: write"
:dependencies [[org.clojure/clojure "1.1.0"]
[org.clojure/clojure-contrib "1.1.0"]])

Podemos editá-lo para tornar nosso projeto mais completo.

(defproject meuprojeto "1.0.0-SNAPSHOT"
:description "Projeto de teste do lein"
:main meuprojeto.core
:url "http://www.meuprojeto.com"
:dependencies [[org.clojure/clojure "1.1.0-master-SNAPSHOT"]
[org.clojars.okkop/clojure-couchdb "0.2"]
[org.clojure/clojure-contrib "1.1.0-master-SNAPSHOT"]])

As informação de versionamento e descrição, além de organização, vão ser usados se enviar sua biblioteca ao clojars.org. O main será definido na geração do jar, e as dependências para construir tudo e os paths.

Com o project.clj pronto você pode fazer o lein instalar as dependências:

$ lein deps

Isso vai baixar os jars na pasta lib,e ele acerta o path na hora rodar.

Agora você pode programar, criar seus testes e fazer eles passarem. Conforme programando você pode rodar todos os testes ou apenas um namespace usando o lein:

$ lein test
$ lein test meuprojeto.dbclient-test

Então quando esse release estiver pronto para distribuir, o código já no repositório (você fez os commits e os pushs e etc) você pode construir os pacotes:

$ lein uberjar

Esse vai compilar as suas classes, criar um jar “clean” (sem as depend&eecirc;ncias) e um standalone, que vai conter as bibliotecas que estão prontos para distribuir e ser executado

BONUS: Se você construiu uma biblioteca e quer torná-la disponível pelo lein você pode publicá-la no clojars.org, basta se cadastrar e depois enviar o jar “clean”: 

$ lein jar
$ scp meuprojeto.jar clojars@clojars.org:

Presto!