2016-02-14 63 views
0

因爲我從雷音項目開始了圖書館的發展,調用就像這樣:訪問庫函數leiningen REPL

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文件也許嗎?

+1

在哪個命名空間是REPL開始?我通常通過'(in-ns NAME)'切換。 –

+0

dir也應該從其他命名空間中運行。然而,試圖(in-ns ..)喚起上面提到的同樣的錯誤...... –

+0

如果在加載該名稱空間的代碼之前運行,'in-ns'會給你看似不可用的repl。 '(clojure.core/refer-clojure)'將從這個狀態btw搶救repl。 – noisesmith

回答

0

您需要添加依賴項才能使用其他項目的庫。爲此,向vector.clj文件中:dependencies鍵的值向量添加一個向量(一個元組-2)。這裏有一個例子:

: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前面的單引號。請注意,某些路徑與庫的名稱不同。

而不是使用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 /草書設置說明here

+0

不幸的是,如你的例子中所描述的,我將自己的lib添加到依賴關係之後,我不斷收到相同的錯誤。 –

+0

是的 - 我真的不喜歡/使用'lein repl'。在像往常一樣測試之前回答這個問題!我正在調查用figwheel做這也給你一個'repl'。 –

+0

lein安裝工程/不會給我錯誤。如果依賴關係有問題,它會這樣做。 Figwheel是一件很酷的事情,但是對於web開發/或nodejs應用程序 - 至少我是這麼想的。 –

1

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

您可以在過程中的一個文件的ns聲明很容易地做到這一點,但在REPL它可以更容易使用(require '[my-lib.whatever :as w])之後,一個可以稱之爲(w/foo)(w/bar)等預期。您也可以使用(in-ns 'my-lib.whatever)來切換到命名空間,但這不會給您一個好的結果,除非您先前使用requireuseload-file等等來首先獲取定義。

+0

有趣的是,使用Figwheel(in-ns'my-lib.whatever)'就是你所需要做的。見[這裏](https://github.com/bhauman/lein-figwheel#using-the-clojurescript-repl)。 –

+0

這是因爲figwheel正在爲您預加載ns。你不能保證每一個配置都能做到這一點(即使你的配置是正確的,ns表單中的拼寫錯誤也可能會破壞)。 – noisesmith

0

比方說,您創建了一個名爲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_foo/core.clj頂部的命名空間聲明加載的。如果沒有,那麼你需要調用load-file以及它們的路徑。

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