.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}}
因此,假设您确实安装了 .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
}
}