leiningen - wie füge ich Abhängigkeiten für lokale Gläser hinzu?

117

Ich möchte mit leiningen mein clojure-projekt aufbauen und entwickeln. Gibt es eine Möglichkeit, project.clj so zu ändern, dass es einige Gläser aus lokalen Verzeichnissen auswählt?

Ich habe einige proprietäre Gläser, die nicht in öffentliche Repos hochgeladen werden können.

Kann leiningen auch verwendet werden, um ein "lib" -Verzeichnis für Clojure-Projekte zu verwalten? Wenn einige meiner Clojure-Projekte dieselben Gläser verwenden, möchte ich nicht für jedes eine separate Kopie verwalten.

Vielen Dank

Signalgeber
quelle
1
Vielen Dank an alle. Wie ich alle darauf hingewiesen habe, ist dies ein heikles Thema, für das noch keine klare Antwort verfügbar ist.
Signalsucher

Antworten:

38

Sie könnten Ihre privaten Gläser hineinstellen lib/und sie würden für Zwecke lein swankund dergleichen auf dem Klassenpfad sein ; Dies scheint den Sinn der Verwendung eines Abhängigkeitsverwaltungstools zu zunichte zu machen. Wenn Sie jedoch nicht möchten, dass diese Abhängigkeiten verwaltet werden, können Sie Leiningen als "Open-Source-Abhängigkeitsverwaltungstool" behandeln und möglicherweise vorsichtig sein lein clean.

Wenn die Situation komplexer wird - es gibt eine größere Anzahl von privaten Gläsern, die sich weiterentwickeln und Sie müssen einige Versionsinformationen dazu berücksichtigen -, ist Arthurs Idee, ein privates Maven-Repo zu erstellen, möglicherweise angemessener.


(Die Personalabteilung kennzeichnet den Leiningen-spezifischen Teileschnittpunkt ... Weiter unten finden Sie Informationen zur allgemeinen Geschichte der Build- / Abhängigkeitsmanagement-Tools in Clojure Land, einschließlich einiger Links, die meiner Meinung nach in Ihrer Situation sehr nützlich sein könnten.)

Außerdem gibt es noch keine allgemeine Einigung darüber, welches das beste Build-Tool für Clojure ist, und Leiningen gewinnt zwar an Mindshare, gewinnt aber auch in den Bereichen Features und Politur ständig an - was insbesondere bedeutet es ist noch nicht vollständig. Hier ist ein Zitat von Stuart Halloway, dem Autor von Pragmatic Bookshelfs "Programming Clojure": "Mein 2c: Leiningen ist ein wichtiger Schritt, aber es gibt noch viel zu tun." Die vollständige Veröffentlichung und eine sehr interessante Diskussion zum Erstellen von Tools und Ähnlichem im Clojure-Bereich finden Sie in der Leiningen, Clojure und Bibliotheken: Was fehlt mir?Thread auf der Clojure Google-Gruppe. Viele Teilnehmer erwähnen ausdrücklich die Notwendigkeit lokaler Abhängigkeiten, die weder lokal noch anderweitig in Repositorys enthalten sind, und erläutern die Lösungen, die sie für solche Szenarien entwickelt haben. Vielleicht könnten Sie sehen, ob es dort drüben etwas gibt, das Ihr Problem jetzt / in Zukunft lösen kann, wenn die Funktionssätze ausgereift sind?

Auf jeden Fall ist es möglich, dass Leiningen für einige komplexe Szenarien noch keine gute Geschichte parat hat. Wenn Sie der Meinung sind, dass dies für Ihren Fall zutrifft (und ich meine, nachdem Sie die Idee eines privaten Repos in Betracht gezogen haben), finden Sie hier einige Links zu Maven-basierten Alternativen aus dem oben genannten Thread: Polyglot Maven , Clojure-Maven-Plugin ; dieser Blogeintragzielt darauf ab, für Leute nützlich zu sein, die versuchen, Maven mit Clojure zu verwenden. Soweit ich mich erinnere, verwendet Meikel Brandmeyer (ebenfalls auf SO unter seinem Online-Handle von Kotarak) Gradle (ein Groovy-Build-System) mit einem Plugin, um Clojure namens Clojuresque unterzubringen. Ich habe es nie selbst versucht, da ich nicht das erste über Groovy weiß, aber er behauptet, damit einen sehr schönen Bau-Act zu machen, und ich glaube, es hat nichts mit Maven zu tun - etwas, das an und für sich ein Plus ist für einige von uns. :-)

Michał Marczyk
quelle
2
Betreff: "Es gibt keine allgemeine Einigung darüber, welches das beste Build-Tool für Clojure ist" ... Ab heute scheint Leiningen der Ausreißer-Standard zu sein. Umfrageergebnisse 2013: lein-survey-2013.herokuapp.com/results
David J.
8
Ab Leiningen v2 wurde die lib / directory-Funktionalität entfernt. Siehe: github.com/technomancy/leiningen/wiki/…
Jared314
Bis heute ist Leiningen wahrscheinlich immer noch das beliebteste, aber Boot ist auch beliebt.
Mars
64

Verwenden Sie einfach : Ressourcenpfade in Ihrer Datei project.clj. Ich benutze es zB, um eine Verbindung zu Siebel-Servern herzustellen. Ich habe gerade ein Ressourcenverzeichnis in meinem Projektverzeichnis erstellt und die JAR-Dateien dort kopiert. Aber natürlich könnten Sie ein allgemeineres Verzeichnis verwenden:

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

Dann kann ich aus der lein repl Siebel Data Bean-Instanzen erstellen, z

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

Wenn Sie eine neuere Java-Version haben, können Sie in Ihrer Pfadspezifikation natürlich Platzhalter wie diese für ein allgemeineres Verzeichnis verwenden:

:resource-paths ["/tmp/SiebelJars/*"]
Hans-J.
quelle
Lein 2 unterstützt kein Globbing, aber das Plugin github.com/dchelimsky/lein-expand-resource-paths ist bei Bedarf verfügbar.
pondermatischer
2
Dies ist die beste Antwort, die ich bisher gesehen habe. Die lokale MVN-Installation scheint für mich nicht mehr zu funktionieren.
David Williams
7
Dies funktioniert nicht mit uberjar, da uberjar die Abhängigkeitsgläser im JAR hinzufügt, anstatt die Abhängigkeitsklassendateien hinzuzufügen.
Tobias Domhan
50
  1. Erstellen Sie ein Verzeichnis im Projekt:

    mkdir maven_repository

  2. Fügen Sie diesem Repository lokale Gläser hinzu:

    Mit diesem Befehl wird die jaad-0.8.3.jarDatei beispielsweise zum Maven-Repository hinzugefügt:

    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. Fügen Sie Folgendes hinzu: project.clj

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

  4. Jetzt sollte ein Stammgast lein depsfunktionieren:

    $ 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

Die Warnung kann ignoriert werden, da das Glas in das Projekt eingecheckt und nicht aus dem Internet heruntergeladen wird.

Originalquelle: Verwendung lokaler JARs mit Leiningen (seit dem Kopieren geändert)

Janus Troelsen
quelle
Schöne Schritte unter diesem Link. Das war sehr hilfreich für mich.
Goger
2
Bei neueren Versionen möchten Sie möglicherweise mvn deploy: deploy-file anstelle von install: install-file verwenden und -Durl = file: repo anstelle von -DlocalRepositoryPath = repo angeben. In projects.clj können Sie dann :: repositories {"local" "file: maven_repository"} verwenden. Siehe: gist.github.com/stuartsierra/3062743 (Ich habe die Frage bearbeitet, muss aber noch genehmigt werden)
Tobias Domhan
33

Ich finde, lein pom; lein jar; lein installfunktioniert gut bei der Entwicklung von Bibliotheken.

Tun Sie dies in der Bibliothek, die gerade entwickelt wird, und Ihre Anwendung, die dies erfordert, wird es ohne :repositoriesFoo verwenden.


Alternativ lein do pom, jar, installist etwas prägnanter.


Dies ermöglicht das Aufrufen der Bibliothek wie jedes andere :dependencies [[project-name "version"]]

Greg B.
quelle
3
Im Vergleich zu den anderen Lösungen ist dies so einfach und es funktioniert! Maven muss nicht installiert werden. Vielen Dank.
Dkinzer
Wie verweisen Sie auf das resultierende Glas in einer Lein-Projektdatei?
Interstar
Wie jeder andere:dependencies [[project-name "version"]]
Roboli
1
Dies funktioniert auch unter Windows hervorragend. Maven muss nicht installiert werden, wie bereits erwähnt. Ich habe es mit IntelliJ + Cursive unter Windows versucht und es funktioniert perfekt. Hat in der Windows-Befehlszeile ein "lein pom; lein jar; lein install" ausgeführt.
Ende
4
Sie müssen nur tun lein install. Es wird das Glas und den Bommel für Sie bauen.
Neverfox
15

Ich glaube, der "richtige" Ansatz besteht darin , ein privates Maven-Repository zu erstellen, damit Sie die Gläser an einem einzigen Ort aufbewahren können und alle Ihre Filialen usw. die Änderungen übernehmen. Dies kann für das, was Sie tun, übertrieben sein. Ich bin gespannt, ob dies ein einfacher Weg ist.

Arthur Ulfeldt
quelle
5
Danke, ich werde mich darum kümmern. Obwohl ich sagen muss, dass Maven Angst in meinem Herzen hat. Wenn Sie einfache Schritt-für-Schritt-Beispiele dafür kennen, weisen Sie mich bitte darauf hin. Warum sind Builds in der Java-Welt so verdammt kompliziert?
Signalsucher
3

Keine dieser Lösungen hat mir geholfen. Stattdessen habe ich ein lokales Repository installiert und maven verwendet, um die JAR-Datei im lokalen Repo zu installieren, und das lokale Repo zu meiner project.clj hinzugefügt

In der Kommandozeile:

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

Und ich schreibe meine project.clj so:

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

Ich hoffe es hilft.

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

Roozbeh Zabihollahi
quelle
2

Vielleicht werfen Sie einen Blick auf diese vorherige Antwort . Ich gebe Schritt für Schritt Anweisungen zum Einrichten eines lokalen Repositorys für das Projekt (Zugriff über file://), in dem Sie Ihre Jars installieren können.

Pascal Thivent
quelle
0

Die beste Option ist, eine private JFrog / Nexus-Artifactory einzurichten und Ihre Snapshots / Releases dort bereitzustellen und diese Artifiactory dann als Repositorys in Ihrer project.clj hinzuzufügen

Andere einfachere Wege sind

Statisches HTTP Die einfachste Art von privatem Repository ist ein Webserver, der auf ein Verzeichnis voller statischer Dateien verweist. Sie können eine file: /// URL in Ihren: Repositorys verwenden, um auf diese Weise bereitzustellen, wenn das Verzeichnis lokal für den Computer ist, auf dem Leiningen ausgeführt wird.

SCP Wenn Sie bereits einen Server mit Ihren öffentlichen SSH-Schlüsseln eingerichtet haben, ist der scp-Transport eine einfache Möglichkeit, private Abhängigkeiten zu veröffentlichen und zu nutzen. Platzieren Sie das folgende Innenprojekt:

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

Platzieren Sie dann Folgendes außerhalb des Defrojekts:

(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 []))))

Es ist auch möglich, mithilfe des scp-Transports in einem Repository bereitzustellen und von dort über http zu konsumieren, wenn Sie nginx oder ähnliches einrichten, um das Repository-Verzeichnis über HTTP bereitzustellen.

NB SCP-Bereitstellungen in Clojars werden nicht mehr unterstützt

Die Originalquelle ist hier https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

Robin
quelle