dependency-graph 是一个命令行工具,可以可视化包的依赖关系。该工具接受 Xcode 项目或 Package.swift 文件的路径作为输入,并输出一个图,显示项目或包中包的依赖关系。
以下图表是 dependency-graph 可以输出的图表的示例。第一个图表是通过向 dependency-graph 提供 Package.swift 文件的路径构建的,第二个图表是通过向 dependency-graph 提供 .xcodeproj 文件的路径作为输入而生成的。
Swift 包 | Xcode 项目 |
---|---|
![]() |
![]() |
椭圆形节点代表产品,例如 Swift 包中的库,方形节点代表目标。
首先使用 Homebrew 安装该工具。
brew tap simonbs/dependency-graph https://github.com/simonbs/dependency-graph.git
brew install dependency-graph
注意 如果在尝试安装 dependency-graph 时遇到以下错误
Error: Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)! To rerun under ARM use: arch -arm64 brew install ... To install under x86_64, install Homebrew into /usr/local.
您可以使用以下命令安装 dependency-graph
arch -arm64 brew install dependency-graph
您现在可以运行以下命令来验证该工具是否已正确安装。以下命令应打印有关如何使用该工具的信息。
dependency-graph --help
运行 dependency-graph
命令,并提供包含 .xcodeproj 或 Package.swift 文件的文件夹路径。
dependency-graph ~/Developer/Example
您也可以传递 .xcodeproj 或 Package.swift 文件的完整路径,如下所示。
dependency-graph ~/Developer/Example/Example.xcodeproj
dependency-graph
命令将输出图表的文本表示形式。默认情况下,该工具将使用 DOT 语法 输出图表。例如,如果 Xcode 项目或 Package.swift 文件包含以下依赖关系
Library A in Package A depends on Target A
Library B in Package B depends on Target B
Library A in Package A depends on Library B in Package B
该工具的输出将是如下所示的图表
digraph g {
subgraph cluster_packageA {
label="Package A"
libraryA [label="LibraryB", shape=ellipse]
targetA [label="TargetA", shape=box]
}
subgraph cluster_packageB {
label="Package B"
libraryB [label="LibraryB", shape=ellipse]
targetB [label="TargetB", shape=box]
}
libraryA -> targetA
libraryB -> targetB
libraryA -> libraryB
}
可以通过将其管道传输到渲染器来将输出渲染为图像。有关支持的渲染器的详细信息,请参阅以下部分。
默认情况下,dependency-graph 将使用 DOT 语法,该语法可以由 dot CLI 渲染,它是 Graphviz 的一部分。
安装 Graphviz 并运行 dependency-graph
,并将输出传递给新安装的 dot
CLI。
brew install graphviz
dependency-graph ~/Developer/Example | dot -Tsvg -o graph.svg
将图表渲染为 PNG 时,您可能需要指定输出的大小,以确保其可读性。要使用 dot 生成宽度正好为 6000 像素或高度正好为 8000 像素但不一定两者兼有的图像,请执行以下操作
dependency-graph ~/Developer/Example | dot -Tpng -Gsize=60,80\! -Gdpi=100 -o graph.png
您可能需要调整 --node-spacing
和 --rank-spacing
的值,以提高图表的可读性。
dependency-graph --node-spacing 50 --rank-spacing 150 ~/Developer/Example | dot -Tsvg -o graph.svg
对于大型项目,图表可能会变得难以阅读。通过 Graphviz 的 unflatten 命令传递输出可能会改善结果。
dependency-graph ~/Developer/Example | unflatten -l 100 -c 100 -f | dot -Tpng -o graph.png
指定 --syntax mermaid
选项,使 dependency-graph 使用 Mermaid 图表语法 输出图表。
可以使用 mermaid cli 将输出渲染为图像。
npm install -g @mermaid-js/mermaid-cli
dependency-graph --syntax mermaid ~/Developer/Example | mmdc -o graph.svg
要在宽度为 6000 像素的页面上使用 mermaid 生成图像,请执行以下操作
dependency-graph --syntax mermaid ~/Developer/Example | mmdc -o graph.png -w 6000
您可能还想调整 --node-spacing
和 --rank-spacing
的值,以提高图表的可读性。
dependency-graph --syntax mermaid --node-spacing 50 --rank-spacing 150 ~/Developer/Example | mmdc -o graph.png
指定 --syntax d2
选项,使 dependency-graph 使用 d2 脚本语言 输出图表。
可以使用 d2 cli 将输出渲染为图像。
curl -fsSL https://d2lang.com/install.sh | sh -s --
dependency-graph --syntax d2 ~/Developer/Example | d2 - graph.png
ELK 布局引擎渲染出一些非常整洁的图表,如下例所示。
传递 --packages-only
标志以仅在图表中包含 Xcode 项目和 Swift 包。这将省略 Xcode 项目和 Swift 包中的库和目标。
当我将我的 iOS 和 macOS 应用程序拆分为包含多个小型目标的 Swift 包时,我开始希望有一种方法可以可视化我的 Swift 包中产品和目标之间的关系。这就是我构建此工具的原因。
其他几种工具可以可视化 Swift 包,但是,我想要一个可以同时接受 Swift 包和 Xcode 项目作为输入的工具。
本 README 顶部的示例显示了 Swift 包的可视化,下图显示了 Xcode 项目的可视化。请注意,最左侧的子图表示名为 ScriptUIEditor.xcodeproj 的 Xcode 项目,它有三个目标:ScriptUIEditor、ScriptBrowserFeature 和 ScriptBrowserFeatureUITests。其中两个依赖于其余子图表示的 Swift 包。
这些图表提供了一种很好的方法来概览包或多个包之间的关系。有时,生成多个图表以获得良好的概览可能会有所帮助,例如,整个项目的图表和选定包的图表。幸运的是,dependency-graph
CLI 使这变得容易,因为它可以接受 Xcode 项目和 Package.swift 文件作为输入。
dependency-graph 使用 XcodeProj 解析 Xcode 项目,并使用 swift package dump-package
命令的输出解释 Package.swift 文件。
这意味着 dependency-graph 不执行任何包解析或构建项目,这使得运行 dependency-graph
命令非常快速,但也产生不如依赖包解析的工具那样详细的输出。
该工具的重点是可视化本地依赖关系,即本地存储在项目中的 Swift 包。dependency-graph 将在可视化中包含远程依赖关系,但它不会克隆这些依赖关系以确定其依赖关系图。从技术上讲,包含此功能是可能的,但对于我的用例来说没有必要。