如何将一个 shadow-cljs 项目导入另一个具有不同配置的 shadow-cljs 项目

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

我目前有 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 Aproject 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 不编译。

有没有一种干净的方法可以将一个项目导入另一个项目,同时考虑到它们的不同配置?

webpack clojurescript reagent shadow-cljs clojurescript-javascript-interop
1个回答
1
投票

你的做法不对。您永远不会在另一个 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 中构建所有内容。

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