我一直在使用 Clojure、ClojureScript、lein、shadow-cljs、re-frame、reagent、Emacs 和 CIDER 来开发 Clojure/ClojureScript 动态 Web 应用程序项目。
目前,正在
project.clj
、shadow-cljs.edn
和 deps.edn
上声明依赖关系。
0 - 我想放弃
deps.edn
1 - 我想避免 Boot 并针对
lein
进行优化
2 - 我想避免重复依赖声明。 理想情况下,我希望将所有依赖项都声明在一个文件中,也许在另一个文件中声明一个指针!如果不可能只在一个文件中声明,请使用两个 - 不带
deps.edn
。
(i) - 对
project.clj
的依赖性:
:dependencies
[[org.clojure/clojure "1.11.1"]
[org.clojure/tools.logging "1.2.4"]
[org.clojure/clojurescript "1.11.60"]
[reagent "0.10.0"]
[re-frame "0.12.0"]
[garden "1.3.10"]
[metosin/malli "0.8.4"]
[metasoarous/oz "1.6.0-alpha35"]
[hiccup "1.0.5"]] ; html parsing and manipulation
(ii) - 对
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"]]
(iii) - 对
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"}}
:source-paths ["src" "test"]}
你会怎么做?
一般来说,我建议将 CLJS 依赖项保留在
shadow-cljs.edn
中,将 CLJ 依赖项保留在 project.clj
中。它避免了一些陷阱和步枪。不过,把所有内容都保留在project.clj
中就可以了,只是需要小心避免一些错误。
您更改
shadow-cljs.edn
以添加 :lein true
,但完全删除 :dependencies
和 :source-paths
。然后添加 :dependencies
中尚未存在的所有 project.clj
,并另外添加 thheller/shadow-cljs
(最新版本 "2.20.10"
)。就是这样。
执行此操作时,您必须确保将来不会引入依赖冲突。因此,一个常见的问题是尝试更新
shadow-cljs
但保留旧的 clojurescript
版本,反之亦然。这样做的问题是 shadow-cljs
将继承 CLJ 端的所有 CLJ 依赖项,这在尝试运行 Shadow-cljs 时可能会或可能不会导致冲突/问题。这些都是可以解决的问题,但是你需要解决的问题,因为shadow-cljs
不再能解决。仅当通过 shadow-cljs.edn
管理依赖项时才可以。
如果需要,您还可以选择将 CLJS 依赖项移至 lein 别名中。然后,您将
shadow-cljs.edn
更改为 :lein {:aliases [:cljs]}
(或您选择的任何别名)。