我目前有 2 个 shadow-cljs 项目,有 2 种不同的方式来管理它们的对 npm 库的依赖性。
一个使用默认的shadow-cljs.edn配置
:js-options {:js-provider :shadow}
,我们将其称为project A.
另一个,我们称之为项目B,使用外部配置,在shadow-cljs.edn文件中使用webpack
:js-options {:js-provider :external :external-index "target/index.js"}
如下文所述现在webpack怎么样?
本地我可以独立运行这些project A和project B而不会出错。
但是,我现在想将project A导入project B,并使用project_A.core中的
my-function
方法。
(ns project_A.core)
(defn ^:export my-function [] ...)
我尝试通过将 shadow-cljs.edn 文件的 :target
字段指定为值
:npm-module
.来发布project A
项目 A > shadow-cljs.edn :
{
[...]
:builds {:app {:target :npm-module
:output-dir "release/"
:entries [project_A.core]
:js-options {:js-provider :external :external-index "target/index.js"}}}
[...]
}}
然后我将它安装在project B我做了一个
npm install path/to/project_A
,作为一个经典的npm包并以与其他包相同的方式使用它。
我试着像这样添加本地依赖:
项目 B > package.json :
{
"scripts": {[...]},
"devDependencies": {[...]},
"dependencies": {
[...]
"project_A": "file:path/to/project_A",
[...]
},
"name": "projet B",
}
我尝试在 ns require 字段中导入包。但是项目 B 不编译。
有没有一种干净的方法可以将一个项目导入另一个项目,同时考虑到它们的不同配置?
你的做法不对。您永远不会在另一个 CLJS 库/项目中包含构建输出。您总是直接包含源代码,然后仅在您要使用它的地方构建正确的最终输出。您不能通过
npm
package.json
包含 CLJS 库,您也不应该这样做。
因此,出于此解释的目的,A 中的构建配置完全无关紧要。它不需要构建,我们只想访问源代码。
在 B 中你有几个使用它的选项。假设您拥有
~/code/project-a
和~/code/project-b
中的所有内容。
在
~/code/project-b/shadow-cljs.edn
你可以指定:source-paths ["src/main" "../project-a/src/main"]
。这将使构建 B 时可以直接访问 A 的所有源。但是,它确实需要手动将:dependencies
从 A 传输到 B。
另一个选项是使用本地安装(或 maven 安装),但为此您需要
lein
或 deps.edn
来构建 .jar
。 shadow-cljs
本身不支持发布“库”。
另一种选择是使用 clojure 工具
deps.edn
和 :local/root
.
;; ~/code/project-a/deps.edn
{:paths ["src/main"]
:deps {...}
:aliases
{:dev {:extra-deps {thheller/shadow-cljs {:mvn/version "2.22.8"}}}}}
;; ~/code/project-b/deps.edn
{:paths ["src/main"]
:deps {my.company/project-a {:local/root "../project-a"}}
:aliases
{:dev {:extra-deps {thheller/shadow-cljs {:mvn/version "2.22.8"}}}}}
;; ~/code/project-b/shadow-cljs.edn
{:deps {:aliases [:dev]}
:builds ...}
还要确保您确实首先需要拆分项目。非常好,甚至鼓励从一个项目中构建多个输出。所以,我经常看到人们因为“最佳实践”而分裂事物。这通常是不必要的,只会无缘无故地使事情变得复杂。恕我直言,YMMV。如果你真的必须,
deps.edn
是最灵活的选择。
就
npm
依赖关系而言,您 project-a
可以通过类路径上的 deps.cljs
文件来表达它们。因此,使用上述配置~/code/project-a/src/main/deps.cljs
和{:npm-deps {"the-dep" "the-version"}}
。这些必须手动添加,因为 package.json
不是“继承的”。当您在 B 中开始 shadow-cljs
时,它会选择那些 :npm-deps
并将它们转移到 B 中的 package.json
。然后您像往常一样在 B 中构建所有内容。