2024 Clojure 状态调查中分享您的想法!

欢迎!请在关于页面上了解更多这个网站的工作方式。

0
IO
编辑

可能这是一个非常新手的问题,对此表示歉意。我有一个这样的monorepo结构:

api/ 
 |-deps.edn
 |-src/
   |-api/
     |-core.clj
     |-resource_1.csv
library/
 |-deps.edn
 |-src/
   |-library/
     |-core.clj
     |-resource_2.csv

api的deps.edn使用library作为本地依赖。它们都使用来自相应csv文件中的静态信息。

我的问题是,在编译api uberjar时,我应该如何正确包含静态文件,以及如何在代码中正确使用静态文件?

api没有提供用于提供静态文件的服务端点。它们仅用于代码中的计算。

1 答案

+1

选中
 
最佳答案

您打算将csv文件作为类路径上的资源加载,还是作为文件系统的文件加载?

如果资源已经在src目录中,您通常不需要执行任何其他操作——它们将位于类路径中。然后您可以通过(clojure.java.io/resource "api/resource_1.csv")(例如,在JDK中还有其他方法)来访问它们。

如果是在文件系统中,您需要安排一些方法让它们在最终部署中可用(在那个阶段这已经不再是deps.edn或Clojure的问题了)。

我想将它们作为资源使用。读取内容并将内容存储在常量中,以便在计算中使用。目前我有一个辅助函数用于打开它们

(defn load-csv [filename]
  (with-open [reader (io/reader filename)]
    (doall
     (csv/read-csv reader))))

我想知道我是否需要将其更改为使用io/resource而不是reader?
尽管如此,您仍然需要一个reader,但我认为它可以使用返回资源的URL工作

(defn load-csv [filename]
  (with-open [reader (io/reader (io/resource filename))]
    (doall
     (csv/read-csv reader))))
是的,这有效,非常感谢您,Alex!我现在正等待您的书,所以您对我的帮助我感到非常感动!
...