请在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 驱动程序。然而,我们可以在 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

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

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

...