在《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)已经多年没有活动,甚至没有作为“待办事项”进行版本控制。看到那里有些活动将会很好,否则可能 look 含有被放弃的或简单忽视的。

6 个答案

+2

在 Metabase 我们有一些特定的用例,这是使过渡到 deps.edn 变得困难的事情之一。以下是我们面临的问题的简化版本

在 Metabase 中,我们发布了一个自由及开源软件版(遵循 AGPL),以及一个商业许可证下的企业版。我们不能在 FOSS 版本中发布 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 这个特性可以解决我面临的一个问题
+1 投票

评论者:borkdude

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

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

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

+1 投票

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

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

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

目前子项目(个别库)中定义的别名没有被考虑。如果它们被考虑,我们可以为每个有: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,并只为此项目使用本地的修补版本。

...