簡體   English   中英

leiningen REPL中的訪問庫函數

[英]access library functions in leiningen REPL

為了開發庫,我從一個lein項目開始,像這樣調用:

lein new mylib

如果現在調用lein install ,則可以在其他項目中訪問我的庫。 但是試圖立即測試我編寫的功能失敗了:

lein repl
...
(dir mylib.core)
Exception No namespace: mylib.core found  clojure.core/the-ns (core.clj:4008)

我是否必須在project.clj文件中添加一些內容?

為了使用庫,您必須使代碼被加載-僅放在類路徑上是不夠的。

您當然可以在文件的ns聲明中輕松地做到這一點,但是在repl中,它可以更容易使用(require '[my-lib.whatever :as w])之后可以調用(w/foo) (w/bar)等。 您也可以使用(in-ns 'my-lib.whatever)來切換到名稱空間,但是除非您之前使用過requireuseload-file等來獲取定義,否則這不會給您帶來良好的結果。第一。

您需要添加一個依賴項才能使用另一個項目中的庫。 為此,將一個向量(元組2)添加到向量中,該向量是project.clj文件中:dependencies鍵的值。 這是一個例子:

:dependencies [[org.clojure/clojure "1.7.0"]
               [org.clojure/clojurescript "1.7.170"]
               [org.clojure/core.async "0.2.371"]
               [default-db-format "0.1.0-SNAPSHOT"]
               [com.andrewmcveigh/cljs-time "0.3.14"]]

我自己的本地庫稱為default-db-format 確實與為com.andrewmcveigh/cljs-time添加依賴項沒有什么不同。

正如您所說,您已經可以執行此操作,但是在與庫本身的項目建立REPL連接時遇到了麻煩。 當您走(in-ns 'some-path) ,您需要在some-path前面加上單引號。 請注意, some-path與庫名稱不同。

除了使用lein repl您還可以使用figwheel repl-如果您的項目是使用figwheel設置的。 我的圖書館只有一個入口,那就是lein figwheel devcards 在那之后,我可以毫無疑問地進入一個命名空間並嘗試一個函數:

cljs.user=> (in-ns 'default-db-format.core)
nil
default-db-format.core=> (check 1 2)

正如Noisesmith所說,在IDE中安裝REPL是最好的設置。 只需輕按一下按鈕(或擊鍵)即可調出預先配置的REPL(每個名稱空間),這不是很麻煩的輸入。 Figwheel / Cursive設置說明在此處

假設您創建了一個名為clj-foo的新庫。

% lein new clj-foo

開始您的代表。

% cd clj-foo
% lein repl

在repl中,將主入口點加載到庫中並切換到其名稱空間。

(load-file "src/clj_foo/core.clj")
(ns clj-foo.core)

現在,您位於clj-foo.core命名空間中,請確保在repl ns中重新添加以使諸如doc可用。

(use 'clojure.repl)

而已。 您已經准備好開始在庫中調用函數。 請注意,如果其他庫文件是通過clj_foo/core.clj頂部的命名空間聲明加載的,則可以從clj-foo.core命名空間獲得它們。 如果不是,那么您還需要調用load-file及其路徑。

如果您在core.clj進行更改。 您可以再次調用load-file以獲取新代碼。 隨着您的前進,您可以使用蘋果酒來促進單個功能和文件的加載。 但這是另一個問題。 :)

我還面臨以下配置的相同問題:

Leiningen 2.9.0 on Java 1.8.0_201 Java HotSpot(TM) 64-Bit Server VM

我的文件如下所示,從REPL中我想調用foo函數

 (ns cljtest.test
  (:gen-class))

(defn foo [input]
  (assoc {} "a" 123)) 

這兩種方法對我來說都很好。

1)切換到適當的名稱空間:

cljtest.core=> (in-ns 'cljtest.test)
#object[clojure.lang.Namespace 0x90175dd "cljtest.test"]
cljtest.test=> (foo nil)
{"a" 123}
cljtest.test=>

2)要求適當的名稱空間:

cljtest.core=> (require '[cljtest.test :as test])
nil
cljtest.core=> (test/foo nil)
{"a" 123}
cljtest.core=>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM