.NET C#导出解决方案的NuGet依赖关系

前言

公司项目需要写DS设计文档,文档需要标识出来你的解决方案文件下的所有项目都使用了NuGet哪些第三方依赖,我们都知道sln下面的所有.csproj文件中的节点下会标识出对应的依赖,但一个一个对比又太麻烦(主要是懒),有时候一个sln能有10几个project项目,能不能写脚本一键导出这些依赖关系呢?
效果如下图:

实现思路

  1. 首先根据dotnet命令可以直接导出对应依赖关系

dotnet list "$solutionPath" package --format json > dependencies.json

json中的结构如下图

  1. 转csv格式

json格式中我们需要项目名称,依赖名称,和依赖版本
可以通过powershell脚本直接将json文件读取为csv格式。

具体代码

# 定义解决方案路径
$solutionPath = "E:\Develop\src\gitee-open-source\dya-wechat-connect\Dya.Wechat.Connect\Dya.Wechat.Connect.sln"

# 定义 JSON 文件路径
$jsonFilePath = Join-Path -Path (Split-Path $solutionPath) -ChildPath "dependencies.json"

# 使用 dotnet list 命令生成解决方案依赖信息,并输出到 JSON 文件中
dotnet list "$solutionPath" package --format json > dependencies.json

# 读取 JSON 文件内容
$jsonContent = Get-Content $jsonFilePath | ConvertFrom-Json


# 初始化 CSV 行数组
$csvRows = @()

# 遍历项目
foreach ($project in $jsonContent.projects) {
    $projectPath = $project.path
    $projectFramework = $project.frameworks[0].framework
    $projectName = [System.IO.Path]::GetFileNameWithoutExtension($projectPath)
    # 检查是否有顶级包
    if ($project.frameworks[0].topLevelPackages) {
        # 遍历顶级包
        foreach ($package in $project.frameworks[0].topLevelPackages) {
            $packageId = $package.id
            $packageResolvedVersion = $package.resolvedVersion

            # 创建 CSV 行
            $csvRow = [PSCustomObject]@{
                'projectName' = $projectName
                'path'        = $projectPath
                'framework'   = $projectFramework
                'package'     = $packageId
                'version'     = $packageResolvedVersion
            }

            # 添加到 CSV 行数组
            $csvRows += $csvRow
        }
    }
    else {
        # 如果没有顶级包,创建包含空值的 CSV 行
        $csvRow = [PSCustomObject]@{
            'projectName'       = $projectName
            'path'              = $projectPath
            'framework'         = $projectFramework
            'package' = $null
            'version'   = $null
        }

        # 添加到 CSV 行数组
        $csvRows += $csvRow
    }
}

# 拼接输出 CSV 文件路径
$outputFilePath = Join-Path -Path (Split-Path $jsonFilePath) -ChildPath "dependencies.csv"

# 将数据导出为 CSV 文件
$csvRows | Export-Csv -Path $outputFilePath -NoTypeInformation

Write-Host "CSV 文件已生成:$outputFilePath"

如果需要运行的时候,直接使用ps传参即可。如下代码:

.\your_script.ps1 -solutionPath "C:\project\yourSolution.sln"

posted @ 2024-03-28 21:49  Dyhuang  阅读(82)  评论(0编辑  收藏  举报