在 Clojure/Clojurescript 项目中,在“shadow-cljs.edn”和“deps.edn”文件上声明依赖项是否有意义?

问题描述 投票:0回答:1

我一直在使用 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
之类的内容,并且它们使用不同的版本!

这对我来说感觉很奇怪。但该项目似乎运行良好。

为什么会出现这种情况?例如,

reagent
的每个版本都用在哪里?有没有更好的方法来声明依赖关系?

;;更新

用户@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个回答
2
投票

Shadow-cljs 使用这些依赖项来构建 CLJS 代码。

deps.edn
依赖项用于运行 CLJ 代码。

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

避免重复的布局的替代方案是在

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

© www.soinside.com 2019 - 2024. All rights reserved.