2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请查看 关于页面以获取更多关于如何使用本站的信息。

+29
tools.deps

添加依赖时,我想能够在使用 deps.edn 的库的坐标中指定别名,例如:

{:deps {org.clojure/clojure {:mvn/version "1.10.0"}
        org.openjfx/javafx-base {:mvn/version "12-ea+10"}}
 :aliases {:web {:extra-deps {org.openjfx/javafx-web {:mvn/version "12-ea+10"}}
                 :extra-paths ["src/web"]}
           :controls {:extra-deps {org.openjfx/javafx-controls {:mvn/version "12-ea+10"}}
                      :extra-paths ["src/controls"]}}
 :paths ["src/base"]}

使用

{:deps {git/lib {:git/url "..." 
                 :sha "..."
                 :aliases ["controls"]}}}

这样,我们就能创建更细粒度的库,这些库可能有可选的代码/依赖,不需要时不会膨胀类路径。

我最近发现了这个话题,并在 Slack 上联系了 Alex。相应的工单(https://clojure.atlassian.net/browse/TDEPS-116)已经多年没有任何活动,甚至没有被标记为“待办事项”。看到那里的活动会是件好事,否则它看起来像是一件被抛弃或简单忽视的事情。

6 个答案

+2

在 Metabase 我们有一个具体的用例,这是让我们难以过渡到 deps.edn 的原因之一。以下是我们在面临的问题的简化版本

在 Metabase 我们提供了两种版本:一个开源版(遵循 AGPL 协议)和一个企业版(商业许可证)。我们无法在开源版中提供 Oracle JDBC 驱动程序,因为 JDBC 驱动程序的许可证条款使其与 AGPL 不兼容。然而,我们可以将其包含在 EE 版本中。

Oracle 驱动程序本身是更大 Metabase-core 仓库中的一个子项目。
我们希望能够有一个顶级 :ee 别名,该别名将合并从它所拉取的 :local/root 中的 :ee 别名。例如:

;; ./deps.edn
{:deps
 {:local/root "oracle-driver"}
 :aliases 
 {:ee
  {:extra-deps {:local/root "oracle-driver", :alias :ee}}}}

;; oracle-driver/deps.edn
{:aliases
 {:ee
  {:extra-deps
   {com.oracle.ojdbc/ojdbc8 {:mvn/version "19.3.0.0"}}}}}
+1 这个功能将完全解决我面临的问题

由 borkdude 提出的评论:

有趣的是,我认为这也实现了某些人一直请求的功能,即管理依赖项。

libs/deps.edn 可以是一个空项目,它只通过别名描述依赖项组(管理依赖项)。
app/deps.edn 可以像上面例子中那样消费这些组。

细节问题:也许 :aliases 应该包含关键词而不是字符串?

我认为这还可以解决另一个用例

我们有一个包含各种库子文件夹的 monorepo 结构,每个子文件夹都有自己的 deps.edn

  1. /deps.edn - 定义 :deps {is.mad/server-web3 {:local/root "./server/web3"}}
  2. /server/web3/deps.edn - 定义 :test 别名,附带 {:extra-paths ["test"]}
  3. /server/web3/src/<更多文件>
  4. /server/web3/test/<更多文件> - 我希望它们能被包含在构建和运行中

目前,在子项目的(单个库)deps.edn中定义的别名没有被考虑在内。如果它们被考虑在内,就可以为每个具有 :extra-paths 且包含测试文件夹的项目定义 :test 别名(尽管测试文件夹在项目中的相对路径必须从定义它的 deps.edn 开始解析)。

这样就可以从顶层运行一个或多个子项目的测试。
例如:clj -A:shadow:test watch test-node

目前要实现这一点有两个选项,这些选项会引入重复或其他不希望出现的副作用:
1. 在顶层的 deps.edn 中为每个子项目定义别名,使得每个别名都有额外的依赖项和路径
2. 让每个子项目在其 deps.edn 路径中包含测试文件夹
- 这个导致的副作用是测试可以依赖不应该放入构建中的依赖项

在 Clojurians Slack 中的相关线程 https://clojurians.slack.com/archives/C03S1KBA2/p1662484004746779

仅供参考,这是 Polylith 在运行测试时解决的问题(针对 Clojure)。
0 投票
参考:https://clojure.atlassian.net/browse/TDEPS-116(由 alex+import 提出)
0 投票

是的,请!能够在 git 依赖中使用别名,或多个别名,为我们提供了一个将单个项目不同方面编织在一起的机会。一个项目可能包含用于不同架构级别的别名,比如核心库或服务器实现等。该项目的客户端可以选择根据需要使用这些不同的方面。当前的替代方案是使用多个 git 仓库。

0 投票

我最近在一个 Polylith 工作空间中偶然遇到了与这个非常旧的 tools.deps 问题非常相似的问题,当时我决定将几个子项目分解成它们自己的 Polylith 工作空间。但是,因为 poly 有一个在 :dev 别名下保留所有开发时间依赖项的惯例,所以事情并没有立即明朗起来,所以我不得不在 :deps 键下将它们复制。

我现在正在考虑修补 tools.deps,并仅为此项目使用修补版本本地化。

...