我一直在使用 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"]}
这是您建议的正确实施吗?
Shadow-cljs 使用这些依赖项来构建 CLJS 代码。
deps.edn
依赖项用于运行 CLJ 代码。
这两件事不一定是相互排斥的。例如。您可以使用一些用 CLJ 编写的宏来编写一些 CLJS 代码,这些宏依赖于某些依赖项 - 在这种情况下,必须在两个文件中指定此类依赖项。
避免重复的布局的替代方案是在
:deps true
中指定 shadow-cljs.edn
,并将所有依赖项从那里移至 deps.edn
。更好的是,将所有仅 CLJS 依赖项移到某个特定别名下并使用 :deps {:aliases [:that-alias]}
- 这样,您的 CLJ 代码甚至不会知道仅 CLJS 依赖项,因此它们不会污染类路径。