Skip to content

Instantly share code, notes, and snippets.

@gabipilegi
Last active April 5, 2020 20:44
Show Gist options
  • Save gabipilegi/81e4a76b55198028937d9800b64deb49 to your computer and use it in GitHub Desktop.
Save gabipilegi/81e4a76b55198028937d9800b64deb49 to your computer and use it in GitHub Desktop.
Clojure Deps

Clojure Deps

Ao rodar um programa em clojure é comum que você precise utilizar funcionalidades de outras bibliotecas de clojure ou java.

Essas bibliotecas podem ser tanto algo que você está desenvolvendo localmente, quanto algum projeto disponível no github ou bibliotecas disponíveis no ecossistema do maven.

Clojure libraries Dependency Heaven

Em todos os casos, será necessário: [1] Especificar quais as bibliotecas utilizadas, e suas versões. [2] Baixar localmente essas dependências [3] Deixar essas bibliotecas disponíveis no path da JVM

Para [1] o clojure disponibiliza um arquivo de configuração (deps.edn) e a partir disso ele consegue garantir [2] e [3]

deps.edn

Mapa edn com 3 chaves top level:

  • :deps
  • :paths
  • :aliases

Dependencias (:deps)

:deps - mapa de bibliotecas para coordenar. Bibliotecas são simbolos no formato <groupId>/<artifactId> ou simplesmente <id>. Se o gruoId e o artifactID forem os mesmos, para declarar um identificador usar essa formula <groupId>/<artifactId>$<classifier>

coordinartes

  • Maven coordinate: {:mvn/version "1.2.3"}

    • optional keys: :extension, :exclusions
  • Local project coordinate: {:local/root "/path/to/project"}

    • Optional key :deps/manifest (project manifest type - default: auto-detect the project type (:deps or :pom)
  • Local jar: {:local/root "/path/to/file.jar"}

  • Git coordinate: {:git/url "https://github.com/user/project.git", :sha "sha", :tag "tag"}

    • Required key :git/url can be one of the following:
    • Required key :sha should indicate the full commit sha
    • Optional key :tag is used only to indicate the semantics of the sha
    • Optional key :deps/root (relative path within the root to search for the manifest file)

Paths (:paths)

Vetor de string paths, geralmente relativo à raiz do projeto. Os paths declarados no vetor serão incluídos no classpath. e.g:

{:paths ["src"]}

Aliases (:aliases)

Nomeiam estruturas de dados que podem ser utilizados tanto pelo clojure tools ou outros consumidores do deps.edn Podem ser utilizados com as flags:

-R - usa essas chaves ao expandir as dependências na etapa resolve-deps:

  • :extra-deps - a deps map from lib to coordinate of deps to add to the deps
  • :override-deps - a deps map from lib to coordinate of override versions to use
  • :default-deps - a deps map from lib to coordinate of versions to use if none is found

-C - usa essas chaves ao criar o classpath na etapa make-classpath

  • :extra-paths - a collection of string paths to add to :paths
  • :classpath-overrides - a map of lib to string path to replace the location of the lib

-O - usa essas chaves ao construir as JVM options

  • :jvm-opts - a collection of string JVM options

-M - usa essas chaves ao constuit os argumentos para clojure.main

  • :main-opts - a collection of clojure.main options

-A - ativa todas as chaves anteriores. As seguintes chaves só podem ser utilizadas com a flag -A

  • :deps - a deps map from lib to coordinate of deps to REPLACE the project :deps
  • :paths a collection of string paths to REPLACE project :paths

Procurers

As coordinaets são interpretadas pelos procurers. Eles sabem determinar as dependencias de uma biblioteca e como baixar os artefatos. Atualmente os procurers disponíveis sãoL mvn, local, e git.

Procrers podem guaradar atributos de configutração na raiz do deps.edn. O procurer vai buscar por :mvn/repos que configuram os repositórios Maven padrão.

{:mvn/repos
 {"central" {:url "https://repo1.maven.org/maven2/"}
  "clojars" {:url "https://clojars.org/repo"}}}

Repositorios Maven autenticados

guarde os dados de autenticação em ~/.m2/settings.xml

<settings>
  ...
  <servers>
    <server>
      <id>my-auth-repo</id>
      <username>zango</username>
      <password>123</password>
    </server>
    ...
  </servers>
  ...
</settings>

Maven S3 repos

{:deps
 {my.library {:mvn/version "0.1.2"}}
 :mvn/repos
 {"my-private-repo" {:url "s3://my-bucket/maven/releases"}}}

Get started

Antes de tudo, garanta que as ferramentas do clojure estejam instaladas.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment