[英]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)
來切換到名稱空間,但是除非您之前使用過require
或use
或load-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.