如果我想用 clojure 开发一个独立的 jar,应该把要处理的文件放在哪里?
Where to place the files to be processed if I want to develop a standalone jar with clojure?
我想编写一个独立的 clojure 程序来处理当前工作目录下的所有 html 文件。
(println file-seq (io/file "."))
如果我使用上面的代码,它在打包为 jar 时有效。但是在开发过程中,我应该把 html 文件放在哪里?在 src/../core.clj
文件夹内?我没有检查文件是否有效等。所以如果我放在 src
下,它也会尝试处理 clj
文件。有没有什么逻辑上没有太大变化的更好的方法?
这取决于您启动 Java 处理 运行 您的 Clojure 代码的目录。
如果使用构建工具(例如 lein 或 boot)的 运行 REPL 或代码或测试,它是项目的顶级目录(例如带有 project.clj 或 [=23 的目录) =]).
您也可以通过记录“.”的绝对路径来查看。文件:
(println (.getAbsolutePath (io/file ".")))
至于对文件操作代码的测试,最好使用基本目录参数对函数进行参数化,并在调用应用程序时使用当前目录 (.
) 调用该函数 (例如,通过 -main
函数)或传递为测试准备的存根目录。您可以在项目中的 test-resources
下为不同的测试场景(如空目录、嵌套目录等)配置多个测试目录,并使用特定场景目录作为参数调用您的函数。
我建议使用“.”从命令行读取根目录。作为默认值:
(ns clj.core
(:require
[clojure.java.io :as io]
)
(:gen-class))
(defn -main [& args]
(let [search-path (or (first args) ".")
file-seq (file-seq (io/file search-path))
]
(doseq [curr-file file-seq]
(println curr-file))))
~/clj > lein run src # search-path => "src"
#object[java.io.File 0x5adc71e7 src]
#object[java.io.File 0x7fc5a558 src/clj]
#object[java.io.File 0x42fd8f2f src/clj/.core.clj.swp]
#object[java.io.File 0x7eea934d src/clj/core.clj]
~/clj > lein run # search-path => "."
#object[java.io.File 0x1fc4483f .]
#object[java.io.File 0x1d7af82 ./README.md]
#object[java.io.File 0x5adc71e7 ./.lein-failures]
#object[java.io.File 0x7fc5a558 ./project.clj]
.....
我想编写一个独立的 clojure 程序来处理当前工作目录下的所有 html 文件。
(println file-seq (io/file "."))
如果我使用上面的代码,它在打包为 jar 时有效。但是在开发过程中,我应该把 html 文件放在哪里?在 src/../core.clj
文件夹内?我没有检查文件是否有效等。所以如果我放在 src
下,它也会尝试处理 clj
文件。有没有什么逻辑上没有太大变化的更好的方法?
这取决于您启动 Java 处理 运行 您的 Clojure 代码的目录。
如果使用构建工具(例如 lein 或 boot)的 运行 REPL 或代码或测试,它是项目的顶级目录(例如带有 project.clj 或 [=23 的目录) =]).
您也可以通过记录“.”的绝对路径来查看。文件:
(println (.getAbsolutePath (io/file ".")))
至于对文件操作代码的测试,最好使用基本目录参数对函数进行参数化,并在调用应用程序时使用当前目录 (.
) 调用该函数 (例如,通过 -main
函数)或传递为测试准备的存根目录。您可以在项目中的 test-resources
下为不同的测试场景(如空目录、嵌套目录等)配置多个测试目录,并使用特定场景目录作为参数调用您的函数。
我建议使用“.”从命令行读取根目录。作为默认值:
(ns clj.core
(:require
[clojure.java.io :as io]
)
(:gen-class))
(defn -main [& args]
(let [search-path (or (first args) ".")
file-seq (file-seq (io/file search-path))
]
(doseq [curr-file file-seq]
(println curr-file))))
~/clj > lein run src # search-path => "src"
#object[java.io.File 0x5adc71e7 src]
#object[java.io.File 0x7fc5a558 src/clj]
#object[java.io.File 0x42fd8f2f src/clj/.core.clj.swp]
#object[java.io.File 0x7eea934d src/clj/core.clj]
~/clj > lein run # search-path => "."
#object[java.io.File 0x1fc4483f .]
#object[java.io.File 0x1d7af82 ./README.md]
#object[java.io.File 0x5adc71e7 ./.lein-failures]
#object[java.io.File 0x7fc5a558 ./project.clj]
.....