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

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

0
REPL

我正在通过《The Clojure Workshop - Packt》这本书学习clojure,我在这个练习中卡住了好几天。

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

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

1. 在您的电脑上创建一个方便的文件夹。

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

在这里选择Leiningen或Deps有什么不同吗?我大部分时间都在使用Leiningen,但我是否应该使用Deps,因为我将使用一个deps.edn文件?

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中运行项目时,我猜测它使用了project.clj,其中没有包含data.csv依赖关系(可能是clojure)。

您可以在终端中进入包含deps.edn的项目文件夹,并运行clj,这样会基于deps.edn文件提供一个repl,并且应该能够正确评估require

您也可以将data.csv的依赖放入Leiningen项目.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 上询问并回答:[创建 deps.edn 文件时的problems](https://stackoverflow.com/questions/65543714/problems-while-creating-a-deps-edn-file)(这样人们可以了解问题的历史以及已经提出的建议)。

...