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)和一个企业版版(商业许可证)。由于JDBC驱动程序的许可证条款与AGPL不兼容,我们不能在开源版本中发布Oracle JDBC驱动程序。然而,我们可以将其与企业版一起发布。

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
by

评论者:borkdude

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

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

细微差别:也许 :aliases 应该包含关键字而不是字符串?

+1
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 中为每个子项目定义别名,以便每个别名都有额外的依赖和路径
2. 让每个子项目在其 deps.edn 中包括测试文件夹的路径
- 这种方法的一个副作用是测试可能包含不应该进入构建的依赖项

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

by
仅作参考,Polylith在运行测试时解决了一个问题(针对Clojure)。
0 投票
by
参考: https://clojure.atlassian.net/browse/TDEPS-116(由alex+import报告)
0 投票
by

是的,请这样做!能够使用别名或别名在git依赖中提供了将单个项目的不同方面连接起来的机会。一个单一的项目可能包含对不同架构级别的别名,如核心库或服务器实现等。该项目的客户可以按需选择使用这些不同的方面。当前的替代方案是使用多个git仓库。

0 投票
by

我最近在将一些子项目分解为Polylith自己的工作区时遇到了这个非常旧的 tools.deps 问题,当时我决定将几个子项目因子化。但由于poly的约定是将所有开发时依赖放在:dev别名下,所以事情没有明显起作用,所以我不得不在:deps键下重复它们。

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

...