diff --git a/build/repo.targets b/build/repo.targets index 578368867c..e5bfffddc4 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -38,6 +38,24 @@ $(CodeSignDependsOn);RemoveSharedFrameworkOnlyRefsFromNuspec + + + + + + + + + + + + + ) and we are working with them for a solution. See also to track progress on this. -**The workaround** for now is to add all projects to the solution. +**The workaround** for now is to add all projects to the solution. You can either do this one by one using `dotnet sln` dotnet sln add C:\src\AspNetCore\src\Hosting\Abstractions\src\Microsoft.AspNetCore.Hosting.Abstractions.csproj +Or you can use this script to automatically traverse the project reference graph, which then invokes `dotnet sln` for you: [eng/scripts/AddAllProjectRefsToSolution.ps1](/eng/scripts/AddAllProjectRefsToSolution.ps1). + + ./eng/scripts/AddAllProjectRefsToSolution.ps1 -WorkingDir src/Mvc/ #### PATH diff --git a/eng/scripts/AddAllProjectRefsToSolution.ps1 b/eng/scripts/AddAllProjectRefsToSolution.ps1 new file mode 100644 index 0000000000..274c098fba --- /dev/null +++ b/eng/scripts/AddAllProjectRefsToSolution.ps1 @@ -0,0 +1,60 @@ +<# +.SYNOPSIS +This adds the complete closure of project references to a .sln file + +.EXAMPLE +Let's say you have a folder of projects in src/Banana/, and a file src/Banana/Banana.sln. +To traverse the ProjectReference graph to add all dependency projects, run this script: + + ./eng/scripts/AddAllProjectRefsToSolution.ps1 -WorkingDir ./src/Banana/ + +.EXAMPLE +If src/Banana/ has multiple .sln files, use the -sln parameter. + + ./eng/scripts/AddAllProjectRefsToSolution.ps1 -WorkingDir ./src/Banana/ -SolutionFile src/Banana/Solution1.sln +#> +[CmdletBinding(PositionalBinding = $false)] +param( + [string]$WorkingDir, + [Alias('sln')] + [string]$SolutionFile +) + +$ErrorActionPreference = 'Stop' +$repoRoot = Resolve-Path "$PSScriptRoot/../../" +$listFile = New-TemporaryFile + +if (-not $WorkingDir) { + $WorkingDir = Get-Location +} + +Push-Location $WorkingDir +try { + if (-not $SolutionFile) { + + $slnCount = Get-ChildItem *.sln | Measure + + if ($slnCount.count -eq 0) { + Write-Error "Could not find a solution in this directory. Specify one with -sln " + exit 1 + } + if ($slnCount.count -gt 1) { + Write-Error "Multiple solutions found in this directory. Specify which one to modify with -sln " + exit 1 + } + $SolutionFile = Get-ChildItem *.sln | select -first 1 + } + + & "$repoRoot\build.ps1" -projects "$(Get-Location)\**\*.*proj" /t:ShowProjectClosure "/p:ProjectsReferencedOutFile=$listFile" + + foreach ($proj in (Get-Content $listFile)) { + & dotnet sln $SolutionFile add $proj + if ($lastexitcode -ne 0) { + Write-Warning "Failed to add $proj to $SolutionFile" + } + } +} +finally { + Pop-Location + rm $listFile -ea ignore +} diff --git a/eng/targets/ResolveReferences.targets b/eng/targets/ResolveReferences.targets index d9e04521b1..149ec43822 100644 --- a/eng/targets/ResolveReferences.targets +++ b/eng/targets/ResolveReferences.targets @@ -169,4 +169,30 @@ + + + + <_CustomCollectProjectReferenceDependsOn Condition="'$(TargetFramework)' != ''">ResolveProjectReferences + + + + <_TargetFrameworks Include="$(TargetFrameworks)" /> + + + + + + + +