gpt4 book ai didi

clojure - 在与 Clojure 中运行代码相同的目录中打开文件

转载 作者:行者123 更新时间:2023-12-04 01:44:46 24 4
gpt4 key购买 nike

我正在尝试用 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之间缺少组件。因此,连接这两个路径会导致不正确的目录路径。

所以,我的问题是,有没有可靠的方法来获取当前执行的代码文件的绝对路径?如果这是不可能的,那么这个习语的替代方法是什么,即我如何解析位于相对于测试文件的位置的文件?

最佳答案

因为 clojure 代码和相关资源可以在 jar 中结束,并且即使您正在访问的文件最终作为 jar 的一部分而不是真正的文件系统,您也希望代码运行,所以执行此操作的可靠方法是使用 io/resource,并确保有问题的文件在资源路径中。

例如,我在当前项目中将以下内容作为目录结构的一部分:

|-- project.clj
|-- resources
| |-- caribou.properties
| |-- config
| | |-- boot.clj
| | |-- development.clj
| | |-- local-dumped.clj
| | |-- local.clj
| | |-- production.clj
| | |-- staging.clj
| | `-- test.clj
| `-- logging.properties

我的 project.clj 中有以下内容:
  :resource-paths ["shared" "resources"]

然后我可以在我的 repl 中执行以下操作:
user> (do (require '[clojure.java.io :as io]) (io/resource "config/boot.clj"))
#<URL file:/Users/me/this-project/resources/config/boot.clj>
user> (slurp *1)
"(use '[caribou.config :only (read-config configure environment)])\n(require '[clojure.java.io :as io])\n..."

如您所见,io/resource 返回一个 URL,然后我可以传递该 URL 以获取我要求的文件(在配置的资源路径中查找路径片段)。如果整个应用程序被打包到一个用于部署的 uberjar 中,此代码仍然有效,而在这种情况下制作 io/file 和调用 getParent 失败。

关于clojure - 在与 Clojure 中运行代码相同的目录中打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15875859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com