2010-09-21 7 views
6

Angenommen, ich habe eine Clojure-Bibliothek geändert (z. B. einen Parameter zum Anfrage-Token in clj-oauth hinzugefügt) und möchte diese geänderte Bibliothek in meinem Projekt verwenden. Was ist der beste Weg, dies zu tun, kurz, die neue Bibliothek als JAR zu kompilieren und das in meine Projektbibliothek zu kopieren?Wie benutze ich meine eigenen Versionen von Clojure-Bibliotheken?

Ich möchte in der Lage sein, die Bibliothek und mein Projekt gleichzeitig zu optimieren (vorzugsweise in der REPL). Wenn ich das in Ruby machen würde, würde ich das Juwel herunterladen und "erfordern", dann öffne diese Klasse in meiner eigenen Projektquelle und füge die Methoden hinzu oder übergehe sie wie benötigt.

Antwort

6

Sie können direkt an der REPL hacken. Angenommen, Sie haben Ihren Klassenpfad schneller. Starten Sie eine REPL. Das erste, was wir tun müssen, ist, die Brennerklassen hineinzubringen.

user> (require 'incanter.core) 
nil 

Jetzt können wir die Funktion incanter.core/matrix sehen?

user> (incanter.core/matrix? 2) 
false 

Wir an der ursprünglichen Quellcode aussehen:

user> (require 'clojure.repl) 
nil 
user> (clojure.repl/source incanter.core/matrix?) 
(defn matrix? 
    " Test if obj is 'derived' incanter.Matrix." 
    ([obj] (is-matrix obj))) 
nil 

Lassen Sie uns gehen und es vermasseln:

Erste Änderung des incanter.core Namespace:

user> (in-ns 'incanter.core) 
#<Namespace incanter.core> 

Dann können wir es unter Verwendung des alten Quellcodes als Krippe neu definieren:

incanter.core> (defn matrix? [obj] "hello") 
#'incanter.core/matrix? 

Unit-Test:

incanter.core> (matrix? 2) 
"hello" 

Wechseln Sie zurück an den Benutzer-Namensraum:

incanter.core> (in-ns 'user) 
#<Namespace user> 

Probieren Sie es aus:

user> (matrix? 2) 
; Evaluation aborted. 

Es gibt keine Definition von Benutzer/Matrix. Wir haben es im incanter.core-Namespace neu definiert.

user> (incanter.core/matrix? 2) 
"hello" 

Für am repl experimentiert, es ist nur ok Quelldateien und neu kompilieren, die einzelne Datei (CC Ck in Emacs) zu ändern, oder wenn Sie in den richtigen Namespace sind, nur die Definition neu bewerten .

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Wenn wir nun unsere wertvolle Veränderung dauerhaft und für andere Projekte verfügbar machen wollen, kommt es darauf an, wie alles eingerichtet ist.

Ich benutze Maven für die Abhängigkeitsverwaltung, es wäre also eine Frage der Quelldatei ändern und dann den Build-Prozess für die Bibliothek neu kompilieren die neue Version zu kompilieren und in das lokale Maven-Repository zu installieren.

Mit einem Maven-Projekt, das als

$ mvn install 

einer Notiz Versionsnummern so einfach sein sollte:

Wenn Sie dauerhafte Änderungen vornehmen zu tun und Abhängigkeitsmanagement verwenden, um die Unterschiede zu koordinieren, dann sollten Sie Ändern Sie die Versionsnummer Ihrer Bibliothek, von vielleicht 1.2.0 zu 1.2.0-johnshack-SNAPSHOT, oder etwas, das nicht mit der echten Sache kollidieren wird, wenn Sie eine nicht vervollkommnete Version in einem anderen Projekt verwenden möchten. Sie möchten nicht, dass eine modifizierte Version in Projekte einfließt, in denen dies nicht erwünscht ist.

Dann ändern Sie Ihre eigenen Projektdateien, um sicherzustellen, dass Sie die gehackte Version verwenden, wo Sie wollen, und das nächste Mal, wenn Sie Ihre Repl beginnen, sollte es den letzten Hack, den Sie installiert haben, ziehen.

Sie müssen jedes Mal neu installieren, wenn Sie möchten, dass Ihre Änderungen in das Repository gelangen, aber das ist wahrscheinlich eine gute Sache.

Leider (und an diesem Punkt begann ich zu wünschen, dass ich ein anderes Beispiel gewählt hätte) Incaster entpuppt sich als ein Leiningen-Projekt, das in einer ad-hoc-Skript-Art in Untermodule aufgeteilt wird Also müssen wir herausfinden, wie es installiert werden soll. Das Herausfinden erwies sich als ziemlich schwierig, obwohl die Antwort einfach ist. Leiningen zündet meine Haare an.

Sie können Beschwörens Quelle hier:

$ git clone http://github.com/liebke/incanter.git

und die entsprechende Quelldatei:

~/incanter/modules/incanter-core/src/incanter/Kern. clj

Ändern Sie es, um die Matrix zu brechen? Funktion, und dann stellt sich heraus, dass, was Sie tun müssen, ist:

Ändern Sie die Versionsnummern sowohl in der obersten Ebene project.clj, als auch im Submodul project.clj.

Dann starten Sie lein install im incanter-core-Verzeichnis und dann wieder im obersten Verzeichnis, und Sie müssen es in dieser Reihenfolge tun. Ich verstehe nicht ganz warum.

Im Moment scheint das alles unnötig kompliziert zu sein. Ich bin (ziemlich) sicher, dass es sich mit der Reife der Werkzeuge beruhigen wird.

4

Wenn Sie (cake) verwenden (oder nichts dagegen haben), lesen Sie den Teilprojekt Abhängigkeiten Abschnitt der README. Ich denke, es könnte genau das sein, wonach Sie suchen.

-1

Sie laden es auf Clojars unter einem anderen Namen hängen davon ab.

+1

Oder verwenden Sie ein lokales Maven-Repository – Greg

+0

Mit Leiningen kann dies mit 'lein install' geschehen. – Mars

Verwandte Themen