web-dev-qa-db-fra.com

leiningen - comment ajouter des dépendances pour les pots locaux?

Je veux utiliser leiningen pour construire et développer mon projet de clojure. Existe-t-il un moyen de modifier project.clj pour lui demander de choisir des bocaux dans des répertoires locaux?

J'ai des bocaux propriétaires qui ne peuvent pas être téléchargés sur des dépôts publics.

De même, leiningen peut-il être utilisé pour maintenir un répertoire "lib" pour les projets de clojure? Si plusieurs de mes projets de clojure partagent les mêmes bocaux, je ne souhaite pas conserver une copie distincte pour chacun d'eux.

Merci

106
signalseeker

Vous pouvez placer vos bocaux privés dans lib/ et ils seraient sur le chemin de classe aux fins de lein swank et autres; cela semble aller à l'encontre de l'utilisation d'un outil de gestion des dépendances, bien que si vous ne tenez pas réellement ces dépendances gérées, vous pourriez considérer Leiningen comme un «outil de gestion des dépendances open source» et peut-être faire attention à lein clean.

Au fur et à mesure que la situation devient plus complexe - un grand nombre de jarres privées sont impliquées, elles évoluent et vous devez prendre en compte certaines informations de gestion des versions - l'idée d'Arthur de créer un dépôt Maven privé peut être plus appropriée.


(Les ressources humaines indiquent le point de coupure de pièce spécifique à ... Suite Continuer ci-dessous pour des informations sur l'historique général des outils de gestion de la construction/des dépendances en pays Clojure, y compris certains liens qui, selon moi, pourraient s'avérer très utiles dans votre situation.)

En outre, il n’existe pas encore d’accord universel sur la question de savoir quel est le meilleur outil de construction pour Clojure, et Leiningen, bien que gagnant en esprit, partage également de plus en plus de points dans les domaines des fonctionnalités et de la finition, ce qui signifie notamment: ce n'est pas encore complet. Voici une citation de Stuart Halloway, auteur de "Programming Clojure" de Pragmatic Bookshelf: "Mon 2c: Leiningen est une étape importante, mais il reste encore beaucoup à faire." Pour l'affichage complet et une discussion très intéressante sur la construction d'outils et autres éléments similaires dans l'espace Clojure, voir le Leiningen, Clojure et les bibliothèques: que me manque-t-il? thread sur le groupe Google Clojure. De nombreux participants ont mentionné en particulier la nécessité de disposer de dépendances locales qui ne figurent dans aucun référentiel, local ou autre, et ont expliqué les solutions qu'ils ont proposées pour de tels scénarios. Peut-être pourriez-vous voir s'il y a quelque chose là-bas qui pourrait résoudre votre problème maintenant/pourrait le résoudre à l'avenir, lorsque les ensembles de fonctionnalités arriveront à maturité?

Quoi qu'il en soit, il est possible que Leiningen ne dispose pas encore d'une bonne histoire pour certains scénarios complexes. Si vous pensez que cela peut être vrai de votre cas (et je veux dire après avoir pris en compte l'idée du dépôt privé), voici quelques liens vers des alternatives basées sur le maven tirées du fil de discussion mentionné ci-dessus: polyglot maven , clojure-maven -brancher ; cet article de blog a pour but d’être utile aux personnes qui tentent d’utiliser maven avec Clojure. Si je me souviens bien, Meikel Brandmeyer (également sur SO sous le pseudonyme de kotarak en ligne) utilise Gradle (un système de compilation Groovy) avec un plugin pour héberger Clojure appelé Clojuresque; Je ne l'ai jamais essayé moi-même, car je ne connais pas la première chose à propos de Groovy, mais il prétend diriger un très bel acte de construction et je pense que cela n'a rien à voir avec Maven - ce qui est un avantage en soi. pour certains d'entre nous. :-)

36
Michał Marczyk

Utilisez simplement: ressources-cheminsdans votre fichier project.clj. Je l'utilise, par exemple pour vous connecter aux serveurs Siebel. Vient de créer un répertoire resources dans le répertoire de mon projet et d'y copier les fichiers jar. Mais bien sûr, vous pouvez utiliser un répertoire plus générique:

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

Ensuite, à partir de lein repl, je peux créer des instances Siebel Data Bean, par exemple.

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

Si vous avez une version Java plus récente, vous pouvez bien sûr utiliser des caractères génériques dans votre spécification de chemin comme ceci pour un répertoire plus général: 

:resource-paths ["/tmp/SiebelJars/*"]
59
Hans-J.
  1. Créez un répertoire dans le projet:

    mkdir maven_repository

  2. Ajoutez des jars locaux à ce référentiel:

    Par exemple, cette commande ajoute le fichier jaad-0.8.3.jar au maven Repository:

    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. Ajouter ce qui suit à project.clj

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

  4. Maintenant, un lein deps normal devrait fonctionner:

    $ 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

L'avertissement peut être ignoré, car le fichier jar sera archivé dans le projet et non téléchargé à partir d'Internet.

Source d'origine: Utilisation de fichiers JAR locaux avec Leiningen (modifié depuis la copie)

46
Janus Troelsen

Je trouve que lein pom; lein jar; lein install fonctionne bien lors du développement de bibliothèques. 

Faites cela dans la bibliothèque en cours de développement et votre application le nécessitant l’utilisera sans aucun :repositories foo requis.


Sinon, lein do pom, jar, install est légèrement plus concis.


Cela permet d’appeler la bibliothèque comme tout autre :dependencies [[project-name "version"]]

26
Greg B

Je crois que l’approche "correcte" consiste à créer un référentiel Maven privé afin que vous puissiez stocker les bocaux dans un emplacement unique et que toutes vos succursales, etc., enregistrent les modifications. Cela peut être exagéré pour ce que vous faites. Je suis curieux de savoir si c'est un moyen plus facile.

14
Arthur Ulfeldt

Vous pouvez utiliser le plugin lein-localrepo: https://github.com/kumarshantanu/lein-localrepo

9
Shantanu Kumar

Un développement récent est le plugin s3-wagon-private de Phil pour Leiningen: https://github.com/technomancy/s3-wagon-private

Cela devrait vous permettre de publier des artefacts sur un dépôt distant privé.

4
phyzome

Regardez peut-être cette réponse précédente , je donne des instructions étape par étape pour configurer un référentiel local pour le projet (accessible via file://) dans lequel vous pourrez installer vos fichiers JAR.

2
Pascal Thivent

Aucune de ces solutions ne m'a fonctionné. Au lieu de cela, j'ai installé un référentiel local et utilisé maven pour installer le fichier jar dans le référentiel local et ajouté le référentiel local à mon projet.clj.

En ligne de commande:

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

Et j'écris mon projet.clj comme ceci:

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

J'espère que ça aide.

[REFERENCE: https://Gist.github.com/stuartsierra/3062743 ]

2

La meilleure option consiste à configurer un artificiel privé JFrog/Nexus et à y déployer vos instantanés/versions, puis à ajouter cet artifiactory en tant que référentiels dans votre projet.clj

D'autres moyens plus simples sont

HTTP statique Le type de référentiel privé le plus simple est un serveur Web dirigé vers un répertoire contenant des fichiers statiques. Vous pouvez utiliser une URL file: /// dans vos référentiels pour le déployer de cette manière si le répertoire est local sur la machine sur laquelle Leiningen est exécuté.

SCP Si vous avez déjà un serveur configuré avec vos clés publiques SSH, le transport scp est un moyen simple de publier et de consommer des dépendances privées. Placez les éléments suivants dans defproject:

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

Ensuite, placez les éléments suivants en dehors du 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 []))))

Il est également possible de déployer dans un référentiel à l'aide du transport scp et d'en consommer via http si vous configurez nginx ou quelque chose de similaire pour desservir le répertoire du référentiel via HTTP.

N.B. Les déploiements de SCP vers Clojars ne sont plus pris en charge 

La source originale est ici https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

0
Robin