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

Oracle 驱动本身是较大梅塔数据库核心库中的一个子项目。
我们希望有一个顶级 :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/<更多文件> - 我希望这些文件被包括在构建和运行过程中

目前子项目(单个库)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工作空间时偶然发现了这个非常古老的问题,当时我决定将一些子项目抽离成它们自己的Polylith工作空间。但是,由于Poly有一个将所有开发时间依赖关系放在 :dev 别名下的惯例,情况并没有明显改善,所以我不得不在 :deps 键下复制它们。

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

...