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

欢迎!有关如何工作的更多信息,请参阅关于页面。

0 投票
REPL

我通过《The Clojure Workshop - Packt》这本书学习Clojure,并在几个练习中遇到了困难。

(我的IDE是IntelliJ,我在Windows上使用)。

练习4.10:从CSV文件导入数据

1. 在您的计算机上的合适位置创建一个文件夹。

由于我尝试了很多次,所以我决定创建一个全新的项目。

在Leiningen和Deps之间选择时有什么区别?我大多数时间使用Leiningen,但因为我将使用deps.edn文件,我应该使用Deps吗?

image

2. 将match_scores_1991-2016_UNINDEXED.csv文件下载到您创建的文件夹中。(在这里在GitHub上

我应该在项目中创建的src文件内部或任何文件中下载此文件?这之间有什么区别?

我决定保存在src中。

print

3. 在您的编辑器中,在同一文件夹下创建一个deps.edn文件,其内容如下

{:deps
 {org.clojure/data.csv {:mvn/version "0.1.4"}
  semantic-csv {:mvn/version "0.2.1-alpha1"}}}

所以我创建了一个deps.edn文件。

deps.edn

4. 通过在REPL中评估以下表达式来验证一切是否正常

user> (require '[clojure.data.csv :as csv])
nil
user> (require '[clojure.java.io :as io])
nil
user> (with-open [r (io/reader "match_scores_1991-2016_unindexed_csv.csv")]
         (first (csv/read-csv r)))

在创建REPL时,我应该选择“使用IntelliJ项目类路径运行”,对吗?

https://i.imgur.com/1ZTvirB.png

但是当我打算评估测试表达式时,它显示出评估第二个和第三个表达式时的错误。

error

评估"clojure.data.csv :as csv"时的错误如下

Execution error (FileNotFoundException) at csv-example.core/eval1549 (form-init2604783929697477049.clj:1).
Could not locate clojure/data/csv__init.class, clojure/data/csv.clj or clojure/data/csv.cljc on classpath.

我遗漏了什么?我已经尝试了几天来解决此问题,但没有发现任何答案。

谢谢!

3 答案

+1 投票

已选择
 
最佳答案

看起来data.csv依赖没有被正确识别。我的猜测是你在项目中创建了Leiningen项目(因为项目文件夹中有一个project.clj文件)。然后你创建了deps.edn文件,并将其中的依赖项放入其中。默认情况下,Leiningen不会识别deps.edn(但有插件可以实现此功能)。所以,当你从IDE中运行项目时,我猜测它使用的是没有data.csv依赖项的project.clj文件(可能只包含clojure)。

你可以尝试在终端进入deps.edn所在的项目文件夹,并运行clj命令,这将根据deps.edn文件启动一个REPL,并且应当能够正确评估require命令。

你也可以直接将data.csv的依赖项放入Leiningen项目的project.clj文件的:dependencies键中。另一种选择是让clj解析依赖关系,但仍使用Leiningen。例如,lein-tools-deps插件可以实现这一点。

我个人建议继续使用Leiningen,或者如果教程推荐使用clj,则严格遵循其说明。

谢谢Tom!我通过添加以下内容解决了问题:

[org.clojure/data.csv     "1.0.0"]
[semantic-csv                                                     "0.2.1-alpha1"]

到project.clj文件中的:dependencies键中。
0 投票

无论你使用什么项目工具,我建议将以下文件放入项目中的相应位置

csv_example/                    ;; project root
csv_example/deps.edn            ;; if using Deps
csv_example/project.clj         ;; if using Leiningen
csv_example/src                 ;; src root
csv_example/src/csv_example/core.clj
csv_example/match_scores_1991-2016_unindexed_csv.csv

问题 #1 - 项目配置文件(deps.edn 或 project.clj)应始终位于根目录下(不在 src 目录下)。我以为只有将项目作为 Deps 或 Leiningen 项目导入时,IntelliJ 的类路径才能正常工作(在这种情况下,您需要将 deps.edn 或 project.clj 放在项目根目录下)。在这些情况下,如果一切正常,您应该在“外部库”下看到 clojure、data.csv 和 semantic-csv 作为项目树中的库。

问题 #2 - 代码中的相对文件路径(如您的 reader 调用)将相对于当前目录解析(您的 IDE 默认为项目根目录,因此请勿将其放在 src 目录下)。

by
感谢你的答案,Alex!
0 投票
by

在StackOverflow上提问和回答: https://stackoverflow.com/questions/65543714/problems-while-creating-a-deps-edn-file(这样人们可以阅读该问题的一些历史和相关建议)。

...