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中,我们同时提供了FOSS版(AGPL许可下)和商业许可的Enterprise版。我们无法将Oracle JDBC驱动程序包含在FOSS版中,因为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"}}}}}
赞!这个特性将正好解决我遇到的问题

评论者:borkdude

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

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

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

我认为这个问题可以解决的一个更多用例

我们有一个包含各种子目录中各个库的单个仓库结构,每个子目录都有自己的 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 并仅为此项目在本地上使用修补后的版本。

...