PowerShell 命令提取`<ProjectReference Include=(...)` from all `.csproj` files in a directory and its subdirectories

问题描述 投票:0回答:1

获取
.csproj
的目录和子目录中的
D:\repos\M\Test

列表

[1]

PS D:\repos\M\Test> ls -r -filter "*.csproj" | select Directory, Name

样本输出

Directory                       Name
---------                       ----
D:\repos\M\Test\M.Common        M.Common.csproj
D:\repos\M\Test\M.Mocks         M.Mocks.csproj
D:\repos\M\Test\M.StateMachines M.StateMachines.csproj

获取目录和子目录中包含与
<ProjectReference\s*Include="([^"]+)"
匹配的行的文件列表

[2]

PS D:\repos\M\Test> ls | sls '<ProjectReference\s*Include="([^"]+)"' | ForEach-Object {New-Object PSObject -Property @{Project=$_.Filename; DirectDep=$_.Matches.Groups[1].Value}}

输出示例

Project                DirectDeps
-------                ----------
dirs.proj              D:\repos\M\Test\M.Common
dirs.proj              D:\repos\M\Test\M.Mocks.csproj
dirs.proj              D:\repos\M\Test\M.StateMachines.csproj
M.Common.csproj        D:\repos\S\Common\Common.csproj
M.Common.csproj        D:\repos\Q\Contracts\Contracts.csproj
M.Mocks.csproj         D:\repos\S\Controller\Controller.csproj
M.StateMachines.csproj D:\repos\M\Common\Common.csproj
M.StateMachines.csproj D:\repos\T\Auth\Auth.csproj

问题

Q1:如何将 [1] 的输出提供给 [2],以将 [2] 的搜索限制为

.csproj
文件(即排除
dirs.proj
)以获得以下输出

Project                DirectDeps
-------                ----------
M.Common.csproj        D:\repos\S\Common\Common.csproj
M.Common.csproj        D:\repos\Q\Contracts\Contracts.csproj
M.Mocks.csproj         D:\repos\S\Controller\Controller.csproj
M.StateMachines.csproj D:\repos\M\Common\Common.csproj
M.StateMachines.csproj D:\repos\T\Auth\Auth.csproj

Q2:然后如何获取[2]的输出并按项目/文件名分组?获得以下输出(或类似输出)

M.Common.csproj, D:\repos\S\Common\Common.csproj, D:\repos\Q\Contracts\Contracts.csproj
M.Mocks.csproj, D:\repos\S\Controller\Controller.csproj
M.StateMachines.csproj, D:\repos\M\Common\Common.csproj, D:\repos\T\Auth\Auth.csproj

尝试

尝试@Q1

  • ls -r -filter "*.csproj" | ForEach-Object {"$_.Directory\$_.Name"}
  • ls -r -filter "*.csrpoj" | select Path
  • 答案:
    ls -r -filter "*.csproj" | [2]

尝试@Q2

  • ls | sls '<ProjectReference\s*Include="([^"]+)"' | ForEach-Object {New-Object PSObject -Property @{Project=$_.Filename; DirectDep=$_.Matches.Groups[1].Value}} | group Project
  • ls | sls '<ProjectReference\s*Include="([^"]+)"' | ForEach-Object {New-Object PSObject -Property @{Project=$_.Filename; DirectDep=$_.Matches.Groups[1].Value}} | group Project | select Name, Group
  • ls | sls '<ProjectReference\s*Include="([^"]+)"' | ForEach-Object {New-Object PSObject -Property @{Project=$_.Filename; DirectDep=$_.Matches.Groups[1].Value}} | group Project | select Name, Group.DirectDep

三个中的第二个的输出最接近我正在寻找的输出

Name                   Group
----                   -----
dirs.proj              {@{Project=dirs.proj; DirectDep=...M.Common.csproj}, {Project=dirs.proj; DirectDep=...M.Mocks.csproj}, {Project=dirs.proj; DirectDep=...M.StateMachines.csproj}
M.Common.csproj        {@{Project=M.Common.csproj; DirectDep=...Common.csproj}, {Project=M.Common.csproj; DirectDep=...Contracts.csproj}}
M.Mocks.csproj         {@{Project=M.Mocks.csproj; DirectDep=...Controller.csproj}
M.StateMachines.csproj {@{Project=M.StateMachines.csproj; DirectDep=...Common.csproj}, {Project=M.StateMachines.csproj; DirectDep=...Auth.csproj}}
powershell csproj select-string
1个回答
0
投票

因此,假设您确实安装了 .NET SDK,您只需使用

dotnet list reference
命令即可获取所有参考项目。

代码类似于:

Get-ChildItem -Recurse -Filter *.csproj | ForEach-Object {
    $references = dotnet list $_.FullName reference
    if ($references.Count -gt 2) {
        # When there are references found the first 2 lines will be:

        # Project reference(s)
        # --------------------

        # you can choose to skip them here if you want to or just remove this condition
        $references = $references | Select-Object -Skip 2
    }

    [pscustomobject]@{
        ProjectName       = $_.BaseName
        ProjectPath       = $_.FullName
        PackageReferences = $references
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.