2017-06-14 57 views
3

我使用leningen在我已經在src/some_project_name目錄保存CLJ文件(旁邊的自動生成core.clj文件)創建的項目。的Clojure - 啜文件相對於項目

還保存這些CLJ文件是我想從slurp他們身邊生活的CLJ文件中的文本文件。我的理解是,讀取文件是相對於工作目錄而言的,並且工作目錄將會在您開始從哪裏開始REPL。我從所有文件所在的src/some_project_name裏面開始了REPL,而不是root。 (System/getProperty "user.dir")確認這是活動目錄。

但是我也讀過slurp會查找與你的根目錄相關的文件,這顯然是發生了什麼,儘管從src/some_project_name中啓動了REPL。爲了找到它們,我必須列出相對於根目錄的文本文件路徑。 「src/some_project_name/foo.txt」而不僅僅是「foo.txt」。

之前設置項目,文件是相對於地方的REPL正在運行(如我所期望的)訪問。現在建立一個項目後,它們似乎只能相對於root進行訪問,而不管REPL的起始位置。

我有這個沒有問題,但我不明白。是否有一些由leningen完成的設置可以攔截REPL評估並告訴它從根目錄搜索而不是在活動目錄的位置?

回答

5

我相信Leiningen REPLs使用項目的根目錄作爲其工作目錄。 (如果沒有trampolined,他們使用一個子進程與預期的工作目錄 - 嘗試jps -l一個lein repl後,你會看到兩個clojure.main過程)

在一個單獨的說明,您可能需要使用clojure.java.io/resource加載使用classpath-文件相對路徑。這些文件通常會放在resources文件夾中 - 與Leiningen一起,這通常是src的兄弟。

例如,如果你把foo.txtresources/some_project_name,你應該能夠做到以下幾點:

(require '[clojure.java.io :as io]) 

(slurp (io/resource "some_project_name/foo.txt")) 
+0

感謝您的答覆 - 這重申我懷疑(REPL是相對於根),但不真的告訴我爲什麼如果你從根以外的地方開始它的原因。我很欣賞關於使用資源文件夾的提示 - 我很好奇,除常規之外,還有哪些優勢?我試圖掃描文檔,但圍繞資源/類路徑相對路徑的討論有點稀缺。再次感謝。 – Solaxun

+0

不確定您是在問這是如何實現的,或者爲什麼這樣設計。如果前者,REPL獲得他們自己的JVM進程,那麼Leiningen只需要在正確的目錄中啓動這些JVM。有一個名稱空間專門用於在leiningen-core子項目('leiningen.core.eval')中設置這些內容。如果是後者,我可能會推測這是爲了確保您的Leiningen命令的效果是一致的,無論您的shell的當前工作目錄有任何意外(只要它停留在項目中)。 –

相關問題