【问题标题】:On a Clojure/Clojurescript project, does it make sense to have dependencies declared on a "shadow-cljs.edn" and a "deps.edn" file?在 Clojure/Clojurescript 项目中,在 \"shadow-cljs.edn\" 和 \"deps.edn\" 文件上声明依赖关系有意义吗?
【发布时间】:2022-12-24 11:27:56
【问题描述】:

我一直在使用 Clojure、ClojureScript、lein、shadow-cljs、re-frame、reagent、Emacs 和 CIDER 来处理 Clojure/ClojureScript 动态 Web 应用程序项目。

在其中一个私有存储库中,有一个包含以下内容的 deps.edn 文件:

{:deps
 {org.clojure/clojure {:mvn/version "1.10.3"},
  reagent {:mvn/version "0.10.0"},
  org.clojure/tools.logging {:mvn/version "1.1.0"},
  org.clojure/clojurescript {:mvn/version "1.10.866"}, 
  ring {:mvn/version "1.9.0"}, 
  garden {:mvn/version "1.3.10"}, 
  metosin/malli {:mvn/version "0.5.1"}, 
  hiccup {:mvn/version "1.0.5"}, 
  metasoarous/oz {:mvn/version "1.6.0-alpha35"}, 
  re-frame {:mvn/version "0.12.0"}}

同时还有一个文件shadow-cljs.edn,其定义如下:

 :dependencies
 [[reagent "1.1.0"]
  [re-frame "1.2.0"]
  [day8.re-frame/tracing "0.6.2"]
  [garden "1.3.10"]
  [metosin/malli "0.8.3"]
  [binaryage/devtools "1.0.3"]
  [day8.re-frame/re-frame-10x "1.1.11"]]

如您所见,reagent 等内容出现在两个文件中,并且它们使用不同的版本!

这让我觉得很奇怪。但该项目似乎运行良好。

为什么会这样? reagentused 的每个版本在哪里?有没有更好的方法来声明依赖关系?

;;更新

用户@EugenePakhomov 对这篇文章给出了很好的回答。该代码是尝试实现他的建议。

因此,我做了:

{:deps
 {reagent {:mvn/version "0.10.0"},
  re-frame {:mvn/version "0.12.0"},
  garden {:mvn/version "1.3.10"},
  metosin/malli {:mvn/version "0.5.1"},
  org.clojure/tools.logging {:mvn/version "1.1.0"},
  org.clojure/clojurescript {:mvn/version "1.10.866"}, 
  ring {:mvn/version "1.9.0"}, 
  hiccup {:mvn/version "1.0.5"}, 
  metasoarous/oz {:mvn/version "1.6.0-alpha35"}, 
  org.clojure/clojure {:mvn/version "1.10.3"},

  {:alias {:cljs-only-dependencies
             reagent {:mvn/version "1.1.0"},
             re-frame {:mvn/version "1.2.0"},
             day8.re-frame/tracing {:mvn/version "0.6.2"},
             garden {:mvn/version "1.3.10"},
             metosin/malli {:mvn/version "0.8.3"},
             binaryage/devtools {:mvn/version "1.0.3"},
             day8.re-frame/re-frame-10x} {:mvn/version "1.1.11"}}}

 :source-paths ["src" "test"]}

这是您建议的正确实施吗?

【问题讨论】:

    标签: clojure dependencies clojurescript leiningen shadow-cljs


    【解决方案1】:

    Shadow-cljs 使用这些依赖项来构建您的 CLJS 代码。 deps.edn 依赖项用于运行您的 CLJ 代码。

    这两件事不一定相互排斥。例如。您可以使用一些用 CLJ 编写并依赖于某些依赖项的宏来编写一些 CLJS 代码——在这种情况下,必须在两个文件中指定此类依赖项。

    避免重复的布局的替代方法是在shadow-cljs.edn 中指定:deps true,并将所有依赖项从那里移至deps.edn。更好的是,将所有 CLJS-only 依赖项移动到某个特定别名下并使用 :deps {:aliases [:that-alias]} - 这样,您的 CLJ 代码甚至不知道 CLJS-only 依赖项,因此它们不会污染类路径。

    【讨论】:

    • 谢谢你。我更新了问题以显示我对您的建议的实施。如果您有时间检查我的理解是否正确,那就太棒了。
    • @PedroDelfino Almost - deps.edn 有 3 个相关的顶级键::deps:aliases:paths。此外,每个别名都是一个类似于您在顶层拥有的键的映射,尽管通常 :deps 被替换为 :extra-deps。喜欢这里:clojure.org/guides/deps_and_cli#extra_deps
    猜你喜欢
    • 2022-12-24
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多