2016-04-16 18 views
2

Ich habe ein kleines Projekt mit ~/src/proj/{foo,bar}.clj, dass ich mit Emacs, Apfelwein und NREPL hacken. In bar.clj mache ich (def base-13-joke 42) und ich möchte den Code in foo.clj auf bar.clj 's base-13-joke verweisen. Wie mache ich das?Wie importiere ich Zeug aus Geschwisterdateien in clojure/cider/nrepl?


Mein aktueller Classpath (mit ~/src/proj = /jonas/src/mine/code/move-the-box)

/home/jonas/src/mine/code/move-the-box/target/classes 
/home/jonas/.m2/repository/cider/cider-nrepl/0.11.0/cider-nrepl-0.11.0.jar 
/home/jonas/.m2/repository/org/tcrawley/dynapath/0.2.3/dynapath-0.2.3.jar 
/home/jonas/.m2/repository/org/clojure/tools.nrepl/0.2.12/tools.nrepl-0.2.12.jar 
/home/jonas/.m2/repository/clojure-complete/clojure-complete/0.2.4/clojure-complete-0.2.4.jar 
/home/jonas/.m2/repository/org/clojure/clojure/1.8.0/clojure-1.8.0.jar 
/usr/lib/jvm/java-7-openjdk-amd64/lib/tools.jar 

Ich habe (add-classpath "file:///jonas/src/mine/code/move-the-box") versucht, die keine Wirkung zu haben schien, sowie (cider.nrepl.middleware.util.java/add-classpath! "file:///home/jonas/src/mine/code/move-the-box") die IllegalArgumentException array element type mismatch java.lang.reflect.Array.set (Array.java:-2) wirft. Was ist da los?

Antwort

3

Wenn Sie mit mehreren Clojure-Quelldateien als einzelnes Projekt arbeiten, können Sie mit einem Build-Tool wie Leiningen oder Boot viel Zeit sparen. Zum Beispiel könnten Sie hier ein einfaches Boot-Projekt namens myproject mit mehreren Quelldateien erstellen.

Erstellen Sie zunächst ein myproject Verzeichnis mit diesen Inhalten (es ist nicht, wo keine Rolle):

myproject 
├── build.boot 
└── src 
    └── myproject 
     ├── bar.clj 
     └── foo.clj 

Stiefel werden Ihre build.boot-Datei ausführen, bevor er etwas anderes tut (zB einige Code ausgeführt wird, eine zu schaffen JAR oder Starten einer REPL). Vorerst alles was Sie brauchen Stiefel zu sagen ist, dass Ihre Quelldateien im src Verzeichnis sein, so fügen Sie einfach diese Zeile build.boot:

(set-env! :source-paths #{"src"}) 

In bar.clj, legen Sie die Definition, die Sie von Ihrem anderen zugreifen möchten Code:

(ns myproject.foo 
    (:require [myproject.bar :as bar])) 

(defn make-joke [] 
    (println (Long/toString bar/base-13-joke 13))) 
:

(ns myproject.bar) 

(def base-13-joke 42) 

Dann in foo.clj Sie bar.clj mit einer :require Klausel in Ihrer ns Erklärung verweisen können

Und das ist alles! Natürlich möchten Sie wahrscheinlich tatsächlich tun Zeug mit dem Code, den Sie gerade geschrieben haben. Boot behandelt "Dinge zu tun" durch Aufgaben. Lassen Sie uns eines schreiben, das einfach eine der Funktionen in Ihrem Projekt ausführt.

Wenn Sie eine Aufgabe definieren möchten, die mit Boot ausgeführt werden soll, können Sie den Code hinzufügen, um diese Aufgabe für Ihre build.boot-Datei zu definieren. Zuerst müssen wir jedoch unseren Hauptcode aufrufen (in diesem Fall die make-joke-Funktion im Namespace myproject.foo). Diesen Code benötigen wir dann require. Fügen Sie diese Zeile zu build.boot:

(require '[myproject.foo :as foo]) 

Jetzt können wir eine einfache run Aufgabe definieren (auch hier in build.boot), die unsere Funktion ausgeführt wird:

(deftask run [] 
    (with-pass-thru _ 
    (foo/make-joke))) 

Die with-pass-thru Unternehmen haben gerade mit einigen zu tun von die Besonderheiten der Aufgaben in Boot, über die Sie im Detail lesen können here.

Die Ausführung von Aufgaben ist recht einfach. Führen Sie dies in der Befehlszeile von Ihrem Projektstamm:

$ boot run 
33 

Boot ist auch mit einigen Aufgaben eingebaut.

boot.user=> 

Dieser Namespace ist das gleiche, in dem Stiefel führt das build.boot Skript, so da haben wir ein require: Zum Beispiel, wenn Sie boot repl ausführen, werden Sie mit einer vertrauten REPL Aufforderung im boot.user Namespace vorgestellt für myproject.foo in build.boot, können wir diesen Namespace in der REPL verwenden:

boot.user=> (foo/make-joke) 
33 
nil 

natürlich können Sie require anderen Namespaces zu:

boot.user=> (require '[myproject.bar :as bar]) 
nil 
boot.user=> bar/base-13-joke 
42 

Es gibt eine ganze Menge mehr, die Sie mit dem Boot tun können, wie das Neuladen von Code und die Interaktion mit CIDER, über die Sie alles über die Boot Wiki lesen können.

Verwandte Themen