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上ping了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"}}}}}
by
+1 这个特性将解决我遇到的问题
+1 chick
by

评论:borkdude

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

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

小细节:也许:aliases应包含关键字而不是字符串?

+1 chick
by

这是一个我认为可以用这个特性解决的用例

我们有一个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 中为每个子项目定义别名,以便每个别名都有额外依赖项和extra-paths
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,并仅为这个项目在本地使用修补后的版本。

...