请分享您的想法,参加 2024 Clojure 状态调查!

欢迎!请查看 关于 页面以获取更多关于如何工作的信息。

+2
工具
重新标记

clojure.tools.cli.api/tree 以“人类友好树”(:format :print,默认)或格式化后的 edn 数据(:format :edn)的形式打印分层依赖数据

要获取数据结果,可以使用 with-out-stredn/read-string

(-> (deps/tree {:project deps-map, 
                :format :edn})
      (with-out-str)
      (edn/read-string))

效果很好。话虽如此,从 cli/tree 内部的 pprint 进行往返和重新解析让我怀疑我在做错什么。如果能直接以数据形式获取 edn 会很方便。

2 个答案

0

这是一个想法(在 clojure.tools.deps 仓库内部调用)

% clj -e "(require 'clojure.tools.cli.api)(->> (clojure.tools.cli.api/tree {:format :tree}) :children count prn)"
20

没有看到附加补丁的方式,但这里有一个为了完整性(尽管变更相当直接和简单)。

From 7cc05b1913af8ee9982852fd618b775a1c339b0e Mon Sep 17 00:00:00 2001
From: Michael Glaesemann <[email protected]>
Date: Wed, 6 Apr 2022 07:28:28 -0500
Subject: [PATCH] Add :tree format option to cli.api/tree to return tree as
 data.

----
 src/main/clojure/clojure/tools/cli/api.clj | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git src/main/clojure/clojure/tools/cli/api.clj src/main/clojure/clojure/tools/cli/api.clj
index 931df53..96d8835 100644
--- src/main/clojure/clojure/tools/cli/api.clj
+++ src/main/clojure/clojure/tools/cli/api.clj
@@ -114,7 +114,7 @@
   )
 
 (defn tree
-  "Print deps tree for the current project's deps.edn built from either the
+  "Return deps tree for the current project's deps.edn built from either the
   a basis, or if provided, the trace file.
 
   This program accepts the same basis-modifying arguments from the `basis` program.
@@ -122,7 +122,7 @@
   Sources are merged in the order - :root, :user, :project, :extra.
 
   By default, :format will :print to the console in a human friendly tree. Use
-  :edn mode to print the tree to edn.
+  :edn mode to print the tree to edn. Use :tree mode to return the tree as data.
 
   In print mode, deps are printed with prefix of either . (included) or X (excluded).
   A reason code for inclusion/exclusion may be added at the end of the line.
@@ -138,7 +138,7 @@
     :file      Path to trace.edn file (from clj -Strace) to use in computing the tree
 
   Output mode:
-    :format    :print (default) or :edn
+    :format    :print (default), :edn (pretty-printed edn), or :tree (data)
 
   Print output mode modifiers:
     :indent    Indent spacing (default = 2)
@@ -157,6 +157,7 @@
       (case format
         :print (tree/print-tree tree opts)
         :edn (pprint/pprint tree)
+        :tree tree
         (throw (ex-info (str "Unknown format " format) {}))))
     (catch Throwable t
       (printerrln "Error generating tree:" (.getMessage t))
-- 
2.32.0 (Apple Git-132)
clojure.tools.cli.api 中的函数主要是为了从命令行界面使用而设计的,并不是用于编程式的使用,所以我不太可能将这个功能放在 cli.api/tree 上,而更可能是扩展 clojure.tools.deps.alpha.*(不确定具体位置,需要查看更多)。
这很有道理。感谢你指给我的https://clojure.atlassian.net/browse/TDEPS-225,我会跟进那里的事情。
0
最初的 Slack 帖子提到了 monorepos,而且我们自己在工作中的尝试也导致我们需要程序性地使用树。显然,这个树将帮助我们在提及的[这篇帖子](https://ask.clojure.org/index.php/11644/re-building-without-internet-access-with-nix)中与 Nix 重建 Clojure CLI

因此,TDEPS-225 欢迎如此方便地获得树,而不需要那么复杂的解决方案。
补充Adam的评论

我们发现,在 (:libs deps/create-basis) 中包含的信息不足以预先获取所有需要完全离线运行类路径解析所需的东西。

问题是,在解析过程中没有遇到已替代库版本的任何痕迹。
听起来不错,因为最终的基数不会用它们,但在尝试生成类路径时,t.d.a仍然至少会想查看这些替代依赖项的POM文件。
我在 clojure.tools.deps.alpha.tree/calc-trace 中提取出了一个计算跟踪的新函数,它可以与现有的 ctda.tree/trace->tree 组合使用来获取数据。将在下一个版本中提供。
...