Skip to content

NikiforovAll/dependify

Repository files navigation

Dependify

Build NuGet contributionswelcome Conventional Commits License

Dependify is a tool to visualize dependencies in your .NET application. You can start dependify in serve mode to visualize dependencies in a browser or use the CLI if you prefer the terminal.

Package Version Description
Dependify.Cli Nuget CLI
Dependify.Core Nuget Core library
Dependify.Aspire.Hosting Nuget Aspire support

Blogs:

Install

dotnet tool install -g Dependify.Cli

Usage

dependify serve $dev/path-to-folder/

You will see something like the following output in the terminal.

serve-terminal

Features

  • Workbench ⚙️
  • Dependency Explorer 🔎
  • Chat (AI) 🤖

Workbench gives you high level overview of the dependencies in the solution.

workbench-demo.mp4

You can open the mermaid diagram right in the browser.

serve-graph-view

Dependency Explorer allows you to select the dependencies you want to see.

dependency-explorer-demo.mp4

Chat (AI) allows you to ask questions about the dependencies.

serve-graph-view

Here is how to run the Dependify with the OpenAI GPT-4 model.

dependify serve $dev/cap-aspire/ \
    --endpoint https://api.openai.azure.com/ \
    --deployment-name gpt-4o-mini \
    --api-key <api-key>
dependify-ai-chat-demo.mp4

Aspire support

You can add Dependify.Web as resource to your Aspire project.

Add the package to AppHost:

dotnet add package Dependify.Aspire.Hosting

Register via IDistributedApplicationBuilder. Add the following code to your Program.cs:

var builder = DistributedApplication.CreateBuilder(args);

var apiService = builder.AddProject<Projects.aspire_project_ApiService>("apiservice");

builder.AddProject<Projects.aspire_project_Web>("webfrontend")
    .WithExternalHttpEndpoints()
    .WithReference(apiService);

builder.AddDependify().ServeFrom("../../aspire-project/"); // <-- location of .sln file

builder.Build().Run();

See the samples/aspire-project for more details.

CLI

You can use the CLI for the automation or if you prefer the terminal.

dependify graph --help
USAGE:
    dependify graph [OPTIONS] <COMMAND>

EXAMPLES:
    dependify graph scan ./path/to/folder --framework net8
    dependify graph show ./path/to/project --framework net8

OPTIONS:
    -h, --help    Prints help information

COMMANDS:
    scan <path>    Scans for projects and solutions and retrives their dependencies
    show <path>    Shows the dependencies of a project or solution located in the specified path

The command scan will scan the folder for projects and solutions and retrieve their dependencies. The ouput can be in tui or mermaid format. The tui or terminal user interface is the default output format.

dependify graph scan $dev/keycloak-authorization-services-dotnet/

tui-demo1

Here is how to change the output format to mermaid.

dependify graph scan \
    $dev/keycloak-authorization-services-dotnet/ \
    --exclude-sln \
    --format mermaid \
    --output ./graph.md
graph LR
    Keycloak.AuthServices.Authentication.csproj:::project
    Keycloak.AuthServices.Templates.csproj:::project
    Blazor.Server.csproj:::project
    GettingStarted.csproj:::project
    AuthorizationGettingStarted.csproj:::project
    AuthorizationAndCleanArchitecture.csproj:::project
    Blazor.Client.csproj:::project
    TestWebApi.csproj:::project
    Keycloak.AuthServices.Authorization.csproj:::project
    Keycloak.AuthServices.Common.csproj:::project
    TestWebApiWithControllers.csproj:::project
    Keycloak.AuthServices.Sdk.csproj:::project
    WebApp.csproj:::project
    Keycloak.AuthServices.Sdk.Tests.csproj:::project
    AuthGettingStarted.csproj:::project
    Keycloak.AuthServices.Common.Tests.csproj:::project
    Keycloak.AuthServices.Authentication.Tests.csproj:::project
    Keycloak.AuthServices.Aspire.Hosting.csproj:::project
    ResourceAuthorization.csproj:::project
    Keycloak.AuthServices.OpenTelemetry.csproj:::project
    Keycloak.AuthServices.Authorization.Tests.csproj:::project
    Keycloak.AuthServices.IntegrationTests.csproj:::project
    Keycloak.AuthServices.Sdk.Kiota.csproj:::project
    Blazor.Shared.csproj:::project
    Keycloak.AuthServices.IntegrationTests.csproj --> Keycloak.AuthServices.Sdk.csproj
    Keycloak.AuthServices.Common.Tests.csproj --> Keycloak.AuthServices.Common.csproj
    AuthGettingStarted.csproj --> Keycloak.AuthServices.Authorization.csproj
    ResourceAuthorization.csproj --> Keycloak.AuthServices.OpenTelemetry.csproj
    Keycloak.AuthServices.Authorization.Tests.csproj --> Keycloak.AuthServices.Authentication.csproj
    AuthGettingStarted.csproj --> Keycloak.AuthServices.Sdk.csproj
    Keycloak.AuthServices.Authorization.csproj --> Keycloak.AuthServices.Common.csproj
    WebApp.csproj --> Keycloak.AuthServices.Authorization.csproj
    GettingStarted.csproj --> Keycloak.AuthServices.Authentication.csproj
    ResourceAuthorization.csproj --> Keycloak.AuthServices.Sdk.Kiota.csproj
    WebApp.csproj --> Keycloak.AuthServices.Common.csproj
    Keycloak.AuthServices.Sdk.Kiota.csproj --> Keycloak.AuthServices.Common.csproj
    AuthorizationGettingStarted.csproj --> Keycloak.AuthServices.Authentication.csproj
    Keycloak.AuthServices.Authorization.Tests.csproj --> Keycloak.AuthServices.Authorization.csproj
    ResourceAuthorization.csproj --> Keycloak.AuthServices.Authentication.csproj
    Keycloak.AuthServices.Authorization.Tests.csproj --> Keycloak.AuthServices.Common.csproj
    Keycloak.AuthServices.IntegrationTests.csproj --> Keycloak.AuthServices.Sdk.Kiota.csproj
    Keycloak.AuthServices.Sdk.csproj --> Keycloak.AuthServices.Common.csproj
    Blazor.Client.csproj --> Blazor.Shared.csproj
    Blazor.Server.csproj --> Blazor.Shared.csproj
    Keycloak.AuthServices.Authentication.Tests.csproj --> Keycloak.AuthServices.Authentication.csproj
    Blazor.Server.csproj --> Keycloak.AuthServices.Authentication.csproj
    AuthorizationAndCleanArchitecture.csproj --> Keycloak.AuthServices.Authentication.csproj
    AuthorizationGettingStarted.csproj --> Keycloak.AuthServices.Authorization.csproj
    Keycloak.AuthServices.Authentication.csproj --> Keycloak.AuthServices.Common.csproj
    Keycloak.AuthServices.Sdk.Tests.csproj --> Keycloak.AuthServices.Sdk.csproj
    ResourceAuthorization.csproj --> Keycloak.AuthServices.Authorization.csproj
    Keycloak.AuthServices.IntegrationTests.csproj --> Keycloak.AuthServices.Authentication.csproj
    AuthorizationGettingStarted.csproj --> Keycloak.AuthServices.Sdk.csproj
    ResourceAuthorization.csproj --> Keycloak.AuthServices.Common.csproj
    ResourceAuthorization.csproj --> Keycloak.AuthServices.Sdk.csproj
    Blazor.Server.csproj --> Blazor.Client.csproj
    Blazor.Server.csproj --> Keycloak.AuthServices.Authorization.csproj
    TestWebApi.csproj --> Keycloak.AuthServices.Authorization.csproj
    AuthGettingStarted.csproj --> Keycloak.AuthServices.Authentication.csproj
    AuthorizationAndCleanArchitecture.csproj --> Keycloak.AuthServices.Authorization.csproj
    Keycloak.AuthServices.Authentication.Tests.csproj --> Keycloak.AuthServices.Common.csproj
    Keycloak.AuthServices.IntegrationTests.csproj --> TestWebApi.csproj
    TestWebApiWithControllers.csproj --> Keycloak.AuthServices.Authorization.csproj
    Keycloak.AuthServices.IntegrationTests.csproj --> Keycloak.AuthServices.Authorization.csproj
    AuthorizationAndCleanArchitecture.csproj --> Keycloak.AuthServices.Sdk.csproj
    WebApp.csproj --> Keycloak.AuthServices.Authentication.csproj
    Keycloak.AuthServices.IntegrationTests.csproj --> Keycloak.AuthServices.Common.csproj
    Keycloak.AuthServices.IntegrationTests.csproj --> TestWebApiWithControllers.csproj
    classDef project fill:#74200154;
    classDef package fill:#22aaee;
Loading

API

You can use the API to build your own tools.

dotnet add package Dependify.Core
var services = new ServiceCollection()
    .AddLogging()
    .AddSingleton<ProjectLocator>()
    .AddSingleton<MsBuildService>();

var provider = services.BuildServiceProvider();

var locator = provider.GetRequiredService<ProjectLocator>();
var msBuildService = provider.GetRequiredService<MsBuildService>();

var nodes = locator.FullScan("C:\\Users\\joel\\source\\repos\\Dependify");

var solution = nodes.OfType<SolutionReferenceNode>().FirstOrDefault();

var graph = msBuildService.AnalyzeReferences(solution, MsBuildConfig.Default);

var subgraph = graph.SubGraph(n => n.Id.Contains("AwesomeProjectName"));

Build and Development

dotnet cake --target build

dotnet cake --target test

dotnet cake --target pack

dotnet tool install --global --add-source ./Artefacts Dependify.Cli --prerelease

dotnet tool uninstall Dependify.Cli -g

dotnet watch run --project ./src/Dependify.Cli/ -- \
    serve $dev/cap-aspire/ \
    --endpoint "http://localhost:1234/v1/chat/completions" \
    --model-id "LM Studio Community/Meta-Llama-3-8B-Instruct-GGUF" \
    --api-key "lm-studio" \
    --log-level "Information"
dotnet watch run --project ./src/Dependify.Cli/ -- \
    serve $dev/cap-aspire/ \
    --endpoint "" \
    --deployment-name "gpt-35-turbo" \
    --api-key "" \
    --log-level "Information"

Set the API key for the AppHost with the following command:

dotnet user-secrets set "Parameters:api-key" "<api-key>"
dotnet user-secrets set "Parameters:endpoint" "<endpoint>"