2010-03-08 7 views
100

Quiero usar leiningen para construir y desarrollar mi proyecto clojure. ¿Hay alguna forma de modificar project.clj para que elija algunos tarros de los directorios locales?leiningen: cómo agregar dependencias para los contenedores locales?

Tengo algunos frascos de propiedad que no pueden cargarse en repositorios públicos.

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

Gracias

+1

Gracias a todos. Como se lo mencioné a todos, este es un tema espinoso sin una respuesta clara disponible todavía. – signalseeker

Respuesta

35

Puede poner sus jarras privadas en lib/ y estarían en el classpath con el propósito de lein swank y similares; esto parece frustrar el uso de una herramienta de administración de dependencias, aunque si no quiere querer esas dependencias administradas, podría tratar Leiningen como una "herramienta de administración de dependencias de código abierto" y quizás tenga cuidado con lein clean.

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


(El HR significa punto de parte cortada-Leiningen específica ... Sigue a continuación para obtener información sobre la historia de herramientas/Dirección de dependencia de construcción en Clojure tierra, incluyendo algunos enlaces que creo que podría venir en muy útil en su situación.)

Además, hasta el momento, no existe un acuerdo universal sobre cuál es la mejor herramienta de construcción para Clojure, y Leiningen, al mismo tiempo que gana en reconocimiento, también está ganando constantemente en las áreas características y polaco, lo que significa, en particular, que aún no está completo. Aquí hay una cita de Stuart Halloway, autor de "Programming Clojure" de Pragmatic Bookshelf: "Mi 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 las herramientas de construcción y similares en el espacio de Clojure, consulte el hilo Leiningen, Clojure and libraries: what am I missing? en el grupo Clojure Google. Muchos participantes mencionan específicamente la necesidad de tener dependencias locales no contenidas en repositorios, locales o de otro tipo, y detallan las soluciones que han surgido para dichos escenarios. ¿Tal vez 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 preparada aún para algunos escenarios complejos. Si cree que esto puede ser cierto en su caso (y me refiero a que después de considerar la idea del repositorio privado), aquí hay algunos enlaces a alternativas basadas en Maven tomadas del hilo anteriormente mencionado: polyglot maven, clojure-maven-plugin; this blog posting pretende ser útil para las personas que intentan usar maven con Clojure. Según recuerdo, Meikel Brandmeyer (también en SO bajo su control en línea de kotarak) usa Gradle (un sistema de compilación Groovy) con un complemento para acomodar Clojure llamado Clojuresque; Nunca lo intenté yo mismo, ya que no sé nada sobre Groovy, pero dice que tiene un muy buen acto de construcción y creo que no tiene nada que ver con maven, algo que es una ventaja en sí mismo. para algunos de nosotros:-)

+2

Re: "no hay un acuerdo universal sobre la pregunta de cuál es la mejor herramienta de construcción para Clojure" ... A partir de hoy, parece que Leiningen es el estándar de la fuga ahora. Resultados de la encuesta de 2013: https://lein-survey-2013.herokuapp.com/results –

+7

A partir de Leiningen v2, se ha eliminado la funcionalidad del directorio lib /. Ver: https://github.com/technomancy/leiningen/wiki/Repeatability#free-floating-jars – Jared314

+0

A partir de hoy, Leiningen es probablemente el más popular, pero Boot también es popular. – Mars

13

creo que el enfoque de "correcta" es create a private Maven Repository para que pueda almacenar los frascos en un solo lugar y todas sus ramas, etc va a recoger a los cambios. Esto puede ser excesivo para lo que estás haciendo. Tengo curiosidad si estas son una manera más fácil.

+5

Gracias, lo investigaré. Aunque tengo que decir que maven ataca el miedo en mi corazón. Si conoce ejemplos simples paso por paso para hacer eso, indíquemelo. ¿Por qué las compilaciones son tan complicadas en el mundo de Java? – signalseeker

+4

Disculpa, ¿te ayudará la simpatía? –

2

Tal vez echar un vistazo a este previous answer, proporciono instrucciones paso a paso para configurar un repositorio local para el proyecto (se accede a través de file://) en el que puede instalar sus jarras.

42
  1. Crear un directorio en el proyecto:

    mkdir maven_repository

  2. Añadir frascos locales a este repositorio:

    Por ejemplo, el comando agrega el archivo jaad-0.8.3.jar al repositorio 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 al project.clj

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

  4. ahora un habitual lein deps deberí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 puede ser ignorado, ya que el frasco será registrado en el proyecto y no descargado de internet.

Fuente original: Using local JAR's with Leiningen (cambiado desde la copia)

+0

Buenos pasos en este enlace. Esto fue muy útil para mí. – goger

+1

Opciones adicionales @ https://gist.github.com/3062743 – bostonou

+2

con las versiones más recientes es posible que desee usar mvn deploy: deploy-file en lugar de install: install-file y para especificar -Durl = file: repo en lugar de -DlocalRepositoryPath = repo En projects.clj puede usar: repositories {"local" "file: maven_repository"} Vea: https://gist.github.com/stuartsierra/3062743 (edité la pregunta, pero aún necesita aprobación) –

25

Me parece bien lein pom; lein jar; lein install trabajos en el desarrollo de las bibliotecas.

hacer esto en la biblioteca que se desarrollaron y su aplicación que requiera lo usará sin ningún :repositories foo requerido.


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


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

+2

Comparado con las otras soluciones, ¡esto es muy simple y funciona! No es necesario instalar maven. Gracias. – dkinzer

+0

¿Cómo referencia el jar resultante en un archivo de proyecto de lein? – interstar

+0

Como cualquier otro ': dependencias [[project-name" version "]]' – roboli

50

Sólo tiene que utilizar : recursos-caminos en su archivo project.clj. Lo uso, p. para conectarse a los servidores Siebel. Acabo de crear un directorio de recursos en el directorio de mi proyecto y copié los archivos jar allí.Pero, por supuesto, se puede utilizar un directorio de 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 de la repl Lein puedo crear instancias de datos de Siebel Bean, por ejemplo,

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

Si usted tiene una versión más reciente de Java se puede, por utilizar comodines curso en su especificación de ruta como esta para un directorio más general:

:resource-paths ["/tmp/SiebelJars/*"] 
+0

Lein 2 no admite globbing, pero el https://github.com/dchelimsky/lein-expand-resource-paths plugin está disponible si es necesario. – pondermatic

+2

Recibo errores de clase no encontrada. – divs1210

+1

Esta es la mejor respuesta que he visto hasta ahora. La instalación de mvn local ya no parece funcionar para mí. –

2

Ninguna de estas soluciones me funcionó. En su lugar he instalado un repositorio local, y se utiliza Maven para instalar el archivo jar en el repositorio local y añadido el repositorio local para mi project.clj

En la línea de comandos:

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 como este:

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

Espero que ayude.

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

0

mejor opción es configurar un privado Artifactory JFrog/Nexus y desplegar sus instantáneas/comunicados de allí y luego añadir que artifiactory como repositorios en que project.clj

Otras formas más simples son

Estático HTTP El tipo más simple de repositorio privado es un servidor web apuntando a un directorio lleno de archivos estáticos. Puede usar un archivo: /// URL en sus: repositorios para implementar de esa manera si el directorio es local para 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 para publicar y consumir dependencias privadas. Coloque el siguiente defproject interior:

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

coloque los siguientes 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 desplegar a un repositorio usando el transporte SCP y consumir de ella a través de HTTP si se configura nginx o algo similar para servir el directorio del repositorio a través de HTTP.

N. B. SCP despliega a Clojars ya no son compatibles

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

Cuestiones relacionadas