4

~/src/proj/{foo,bar}.clj私はemacs、cider、nREPLでハッキングしている小さなプロジェクトを持っています。で、コードで のを参照するbar.clj必要があります。どうすればいいですか?(def base-13-joke 42)foo.cljbar.cljbase-13-joke


現在のクラスパス ( ~/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

(add-classpath "file:///jonas/src/mine/code/move-the-box")効果がないように見えるものと、(cider.nrepl.middleware.util.java/add-classpath! "file:///home/jonas/src/mine/code/move-the-box")をスローするものを試しましたIllegalArgumentException array element type mismatch java.lang.reflect.Array.set (Array.java:-2)。何が起こっているのですか?

4

1 に答える 1

4

複数の Clojure ソース ファイルを 1 つのプロジェクトとして使用している場合、LeiningenBootなどのビルド ツールを使用すると、多くのメリットが得られます。たとえば、myproject複数のソース ファイルで呼び出される単純な Boot プロジェクトを作成する方法を次に示します。

まず、次myprojectの内容でディレクトリを作成します (場所はどこでもかまいません)。

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

Boot は、他のbuild.boot処理を行う前にファイルを実行します (たとえば、コードの実行、JAR の作成、REPL の開始など)。今のところ、Boot に伝える必要があるのは、ソース ファイルがsrcディレクトリにあることだけなので、次の行を に追加するだけbuild.bootです。

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

bar.clj、他のコードからアクセスする定義を入力します。

(ns myproject.bar)

(def base-13-joke 42)

次に、宣言で句を使用してfoo.clj参照できます。bar.clj:requirens

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

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

それだけです。もちろん、今書いたばかりのコードを実際に使いたいと思うでしょう。ブートは、タスクを通じて「実行」を処理します。プロジェクト内の関数の 1 つを単純に実行するものを書きましょう。

Boot で実行するタスクを定義する場合は、そのタスクを定義するコードをbuild.bootファイルに追加することで実行できます。ただし、最初に、メイン コードの一部 (この場合は名前空間make-joke内の関数) を呼び出すので、そのコードが必要になります。この行を に追加します。myproject.foorequirebuild.boot

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

これで、関数を実行する単純なrunタスク (再び)を定義できます。build.boot

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

このwith-pass-thruビジネスは、Boot のタスクの詳細の一部と関係があるだけです。詳細については、こちらを参照してください。

タスクの実行は非常に簡単です。プロジェクト ルートからコマンド ラインでこれを実行します。

$ boot run
33

Boot にはいくつかのタスクが組み込まれています。たとえば、 を実行すると、名前空間boot replでおなじみの REPL プロンプトが表示されます。boot.user

boot.user=>

この名前空間は、Boot がbuild.bootスクリプトを実行するものと同じです。そのため、requirefor myproject.fooinがあるためbuild.boot、REPL でその名前空間を使用できます。

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

もちろん、require他の名前空間も可能です:

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

Boot Wikiですべてを読むことができるコードのリロードや CIDER との対話など、Boot でできることは他にもたくさんあります。

于 2016-04-16T17:04:34.743 に答える