leiningen: ¿cómo agregar dependencias para jar locales?

117

Quiero usar leiningen para construir y desarrollar mi proyecto clojure. ¿Hay alguna forma de modificar project.clj para decirle que elija algunos frascos de directorios locales?

Tengo algunos frascos propietarios que no se pueden cargar en repositorios públicos.

Además, ¿se puede usar leiningen para mantener un directorio "lib" para proyectos de clojure? Si varios de mis proyectos de clojure comparten los mismos frascos, no quiero mantener una copia separada para cada uno de ellos.

Gracias

buscador de señales
fuente
1
Gracias a todos. Como se señaló a todos, este es un tema espinoso sin una respuesta clara disponible hasta el momento.
signalseeker

Respuestas:

38

Podrías poner tus frascos privados lib/y estarían en la ruta de clases para propósitos lein swanky similares; esto parece anular el punto de usar una herramienta de administración de dependencias, aunque si realmente no desea que esas dependencias se administren, podría tratar a Leiningen como una "herramienta de administración de dependencias de código abierto" y tal vez tener cuidado conlein clean .

A medida que la situación se vuelve más compleja, hay una mayor cantidad de frascos privados involucrados, evolucionan y debe tener en cuenta cierta información de versiones sobre ellos, la idea de Arthur de crear un repositorio privado de Maven puede ser más apropiada.


(El HR significa el punto de corte de la parte específica de Leiningen ... Continúe a continuación para obtener información sobre la historia general de herramientas de administración de compilación / dependencia en la tierra de Clojure, incluidos algunos enlaces que creo que podrían ser muy útiles en su situación).

Además, hasta el momento, no existe un acuerdo universal sobre la cuestión de cuál es la mejor herramienta de compilación para Clojure, y Leiningen, mientras gana en la mente compartida, también gana constantemente en las características de las áreas y el pulido, lo que significa, en particular, que aún no está completo. Aquí hay una cita de Stuart Halloway, el autor de "Programming Clojure" de Pragmatic Bookshelf: "My 2c: Leiningen es un paso importante, pero todavía hay mucho por hacer". Para la publicación completa y una discusión muy interesante sobre: ​​construir herramientas y similares en el espacio Clojure, vea el Leiningen, Clojure y bibliotecas: ¿qué me estoy perdiendo?hilo en el grupo de Google Clojure. Muchos participantes mencionan específicamente la necesidad de tener dependencias locales que no estén contenidas en ningún repositorio, local o de otro tipo, y detallan las soluciones que han encontrado para tales escenarios. ¿Quizás podría ver si hay algo allí que pueda resolver su problema ahora / podría resolverlo en el futuro, cuando los conjuntos de características maduren?

De todos modos, es posible que Leiningen no tenga una buena historia lista todavía para algunos escenarios complejos. Si cree que esto puede ser cierto en su caso (y me refiero después de considerar la idea del repositorio privado), aquí hay algunos enlaces a alternativas basadas en maven extraídas del hilo mencionado anteriormente: polyglot maven , clojure-maven-plugin ; esta publicación de blogpretende ser útil para las personas que intentan usar maven con Clojure. Según recuerdo, Meikel Brandmeyer (también en SO bajo su identificador en línea de kotarak) usa Gradle (un sistema de construcción Groovy) con un complemento para adaptarse a Clojure llamado Clojuresque; Nunca lo probé yo mismo, ya que no sé la primera cosa sobre Groovy, pero él dice hacer un acto de construcción muy agradable con él y creo que no tiene nada que ver con maven, algo que es una ventaja en sí mismo. para algunos de nosotros. :-)

Michał Marczyk
fuente
2
Re: "no hay un acuerdo universal sobre cuál es la mejor herramienta de compilación para Clojure" ... A partir de hoy, parece que Leiningen es el estándar de fuga. Resultados de la encuesta de 2013: lein-survey-2013.herokuapp.com/results
David J.
8
A partir de Leiningen v2, se ha eliminado la funcionalidad del directorio lib /. Ver: github.com/technomancy/leiningen/wiki/…
Jared314
A día de hoy, Leiningen sigue siendo probablemente el más popular, pero Boot también lo es.
Marte
64

Simplemente use : resource-path en su archivo project.clj. Lo uso, por ejemplo, para conectarme a servidores Siebel. Acabo de crear un directorio de recursos en el directorio de mi proyecto y copié los archivos jar allí. Pero, por supuesto, podría usar un directorio más genérico:

(defproject test-project "0.1.0-SNAPSHOT"
:description "Blah blah blah"
...
:resource-paths ["resources/Siebel.jar" "resources/SiebelJI_enu.jar"])

Luego, desde la respuesta de lein , puedo crear instancias de Siebel Data Bean, por ejemplo

(def sbl (com.siebel.data.SiebelDataBean.))
(.login sbl "siebelServer" "user" "password")
...

Si tiene una versión más reciente de Java, por supuesto, puede usar comodines en la especificación de su ruta como este para un directorio más general:

:resource-paths ["/tmp/SiebelJars/*"]
Hans-J.
fuente
Lein 2 no admite el globbing, pero el complemento github.com/dchelimsky/lein-expand-resource-paths está disponible si es necesario.
pondermático
2
Esta es la mejor respuesta que he visto hasta ahora. La instalación local de mvn parece que ya no me funciona.
David Williams
7
Esto no funciona con uberjar, ya que uberjar agregará los frascos de dependencia en el frasco, en lugar de agregar los archivos de clases de dependencias.
Tobias Domhan
50
  1. Crea un directorio en el proyecto:

    mkdir maven_repository

  2. Agregue jar locales a este repositorio:

    Por ejemplo, este comando agrega el jaad-0.8.3.jararchivo al repositorio de maven:

    mvn deploy:deploy-file -Dfile=jaad-0.8.3.jar -DartifactId=jaad -Dversion=0.8.3 -DgroupId=jaad -Dpackaging=jar -Durl=file:maven_repository

  3. Agregue lo siguiente a project.clj

    :repositories {"local" "file:maven_repository"}

  4. Ahora un habitual lein depsdebería funcionar:

    $ lein deps Downloading: jaad/jaad/0.8.3/jaad-0.8.3.pom from local Transferring 0K from local [WARNING] *** CHECKSUM FAILED - Error retrieving checksum file for jaad/jaad/0.8.3/jaad-0.8.3.pom - IGNORING

La advertencia se puede ignorar, ya que el archivo jar se registrará en el proyecto y no se descargará de Internet.

Fuente original: uso de JAR locales con Leiningen (modificado desde la copia)

Janus Troelsen
fuente
Buenos pasos en este enlace. Esto fue muy útil para mí.
goger
2
con versiones más recientes, es posible que desee usar mvn deploy: deploy-file en lugar de install: install-file y especificar -Durl = file: repo en lugar de -DlocalRepositoryPath = repo. En projects.clj puede usar:: repositories {"local" "file: maven_repository"} Ver: gist.github.com/stuartsierra/3062743 (Edité la pregunta, pero aún necesita ser aprobado)
Tobias Domhan
33

Encuentro que lein pom; lein jar; lein installfunciona bien al desarrollar bibliotecas.

Haga esto en la biblioteca que se está desarrollando y su aplicación que lo requiera lo usará sin necesidad de :repositoriesfoo.


Alternativamente, lein do pom, jar, installes un poco más conciso.


Esto permite llamar a la biblioteca como cualquier otra :dependencies [[project-name "version"]]

Greg B
fuente
3
En comparación con las otras soluciones, ¡esto es tan simple y funciona! No es necesario instalar maven. Gracias.
dkinzer
¿Cómo se hace referencia al jar resultante en un archivo de proyecto lein?
interestar
Como cualquier otro:dependencies [[project-name "version"]]
roboli
1
Esto también funciona muy bien en Windows. No es necesario instalar maven como ya se ha mencionado. Lo he probado con IntelliJ + Cursive en Windows y funciona perfectamente. Hizo un "lein pom; lein jar; lein install" en la línea de comandos de Windows.
finaliza el
4
Solo necesitas hacer lein install. Construirá el frasco y el pompón para ti.
neverfox
15

Creo que el enfoque "correcto" es crear un repositorio privado de Maven para que pueda almacenar los frascos en una única ubicación y todas sus sucursales, etc. recogerán los cambios. Esto puede ser excesivo para lo que estás haciendo. Tengo curiosidad por saber si esta es una forma más fácil.

Arthur Ulfeldt
fuente
5
Gracias, lo investigaré. Aunque tengo que decir que Maven infunde miedo en mi corazón. Si conoce algún ejemplo sencillo paso a paso para hacer eso, por favor indíquemelo. ¿Por qué las compilaciones son tan complicadas en el mundo de Java?
signalseeker
3

Ninguna de estas soluciones me funcionó. En su lugar, instalé un repositorio local y usé maven para instalar el archivo jar en el repositorio local, y agregué el repositorio local a mi project.clj

En línea de comando:

mvn deploy:deploy-file -DgroupId=local -DartifactId=bar \
    -Dversion=1.0.0 -Dpackaging=jar -Dfile=bar.jar \
    -Durl=file:repo

Y escribo mi project.clj así:

(defproject foo "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [local/bar "1.0.0"]]
  :repositories {"project" "file:repo"})

Espero eso ayude.

[REFERENCIA: https://gist.github.com/stuartsierra/3062743 ]

Roozbeh Zabihollahi
fuente
2

Tal vez eche un vistazo a esta respuesta anterior , proporciono instrucciones paso a paso para configurar un repositorio local para el proyecto (al que se accede a través file://) en el que podría instalar sus jar.

Pascal Thivent
fuente
0

La mejor opción es configurar un artefacto JFrog / Nexus privado e implementar sus instantáneas / versiones allí y luego agregar ese artefacto como repositorios en su proyecto.clj

Otras formas más sencillas son

HTTP estático El tipo más simple de repositorio privado es un servidor web que apunta a un directorio lleno de archivos estáticos. Puede usar una URL file: /// en sus: repositorios para implementar de esa manera si el directorio es local a la máquina en la que se ejecuta Leiningen.

SCP Si ya tiene un servidor configurado con sus claves públicas SSH, el transporte scp es una forma sencilla de publicar y consumir dependencias privadas. Coloque lo siguiente dentro de defproject:

:plugins [[org.apache.maven.wagon/wagon-ssh-external "2.6"]]
:repositories [["releases" "scp://somerepo.com/home/repo/"]]

Luego coloque lo siguiente fuera del defproject:

(cemerick.pomegranate.aether/register-wagon-factory!
 "scp" #(let [c (resolve 'org.apache.maven.wagon.providers.ssh.external.ScpExternalWagon)]
          (clojure.lang.Reflector/invokeConstructor c (into-array []))))

También es posible implementar en un repositorio utilizando el transporte scp y consumir desde él a través de http si configura nginx o algo similar para servir el directorio del repositorio a través de HTTP.

NB Las implementaciones de SCP en Clojars ya no son compatibles

La fuente original está aquí https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

Robin
fuente