我正在尝试用 Clojure 编写一些测试。其中一项测试涉及在与正在运行的测试文件相同的目录中打开一个 html 文件,以将内容用作测试输入(Python 中广泛使用的习惯用法)。我认为*file*
var 可以完成这项工作,但事实并非如此,因为它是相对的。
假设我的项目使用默认的 leiningen 布局,名为demoproj
. 然后我的测试在~/projects/demoproj/test
. 这个目录再次复制了项目命名空间,我不是很喜欢,但无论如何。所以测试core.clj
在~/projects/demoproj/test/demoproj/test/core.clj
. small_page.html
我在同一目录中也有一个文件。如果我将以下内容放入test/core.clj
:
(println (-> (java.io.File. *file*)
.getPath))
这是我得到的:
demoproj/test/readibility.clj
这是相对于test
项目库的目录的。我尝试仅使用此相对路径读取示例 html 页面,如下所示:
(slurp (-> (java.io.File. *file*)
.getParent
(java.io.File. "small_page.html")
.getPath))
这会导致 IO 错误,因为无法在该位置读取文件。我的下一个想法是获取当前工作目录并将其与相对路径连接。这是我获取工作目录的方式:
(println (-> (java.io.File. ".")
.getCanonicalPath))
它返回了一个绝对路径:
/Path-to-home/projects/demoproj
不好的是,这两个没有加入到文件的正确路径;中间缺少一个test
组件。因此,连接这两个路径会导致不正确的目录路径。
所以,我的问题是,有没有一种可靠的方法来获取当前执行的代码文件的绝对路径?如果这是不可能的,那么这个习语的替代方法是什么,即我如何解析位于相对于测试文件的位置的文件?