Skip to content

Commit

Permalink
[release/8.2] Fix RID regression by adding a task that calculates the…
Browse files Browse the repository at this point in the history
… best matching RID for platform (#5807)

* Fix RID regression by adding a task that calculates the best matching RID for each platform.

* Use out-of-proc instead of MSBuild task

* Do not show the output of running the tool as 'High' importance

* PR Feedback

* PR Feedback

* Fix package authoring

* Fix TFM on rid tool

* Fix issues with wrong variable names

* Address PR feedback
  • Loading branch information
joperezr authored Sep 21, 2024
1 parent b33f321 commit ccaa58a
Show file tree
Hide file tree
Showing 13 changed files with 311 additions and 10 deletions.
14 changes: 14 additions & 0 deletions Aspire.sln
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aspire.Hosting.Dapr.Tests",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aspire.Hosting.AWS.Tests", "tests\Aspire.Hosting.AWS.Tests\Aspire.Hosting.AWS.Tests.csproj", "{6F71BC73-B703-4E64-98E0-801781302E7A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aspire.Hosting.Sdk.Tests", "tests\Aspire.Hosting.Sdk.Tests\Aspire.Hosting.Sdk.Tests.csproj", "{ABDC7DF8-7ACA-430C-9C91-983693DBBCB9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aspire.RuntimeIdentifier.Tool", "src\Aspire.Hosting.Sdk\Aspire.RuntimeIdentifier.Tool\Aspire.RuntimeIdentifier.Tool.csproj", "{100A7A22-2517-41AD-8649-68E3E289F537}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -1537,6 +1541,14 @@ Global
{6F71BC73-B703-4E64-98E0-801781302E7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6F71BC73-B703-4E64-98E0-801781302E7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6F71BC73-B703-4E64-98E0-801781302E7A}.Release|Any CPU.Build.0 = Release|Any CPU
{ABDC7DF8-7ACA-430C-9C91-983693DBBCB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ABDC7DF8-7ACA-430C-9C91-983693DBBCB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ABDC7DF8-7ACA-430C-9C91-983693DBBCB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ABDC7DF8-7ACA-430C-9C91-983693DBBCB9}.Release|Any CPU.Build.0 = Release|Any CPU
{100A7A22-2517-41AD-8649-68E3E289F537}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{100A7A22-2517-41AD-8649-68E3E289F537}.Debug|Any CPU.Build.0 = Debug|Any CPU
{100A7A22-2517-41AD-8649-68E3E289F537}.Release|Any CPU.ActiveCfg = Release|Any CPU
{100A7A22-2517-41AD-8649-68E3E289F537}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -1818,6 +1830,8 @@ Global
{091EA540-355B-4763-9980-5F83F0BB6F11} = {15966C27-17FA-4A46-A172-55985411540A}
{C60C5CFA-5B6D-4432-BFCD-54D1BEEC7DBE} = {830A89EC-4029-4753-B25A-068BAE37DEC7}
{6F71BC73-B703-4E64-98E0-801781302E7A} = {830A89EC-4029-4753-B25A-068BAE37DEC7}
{ABDC7DF8-7ACA-430C-9C91-983693DBBCB9} = {4981B3A5-4AFD-4191-BF7D-8692D9783D60}
{100A7A22-2517-41AD-8649-68E3E289F537} = {F534D4F8-5E3A-42FC-BCD7-4C2D6060F9C8}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6DCEDFEC-988E-4CB3-B45B-191EB5086E0C}
Expand Down
2 changes: 2 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@
<PackageVersion Include="Microsoft.Extensions.Primitives" Version="$(MicrosoftExtensionsPrimitivesPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="$(MicrosoftExtensionsHttpResiliencePackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.TimeProvider.Testing" Version="$(MicrosoftExtensionsTimeProviderTestingVersion)" />
<!-- NuGet dependencies -->
<PackageVersion Include="NuGet.ProjectModel" Version="6.11.0" />
<!-- external dependencies -->
<PackageVersion Include="Confluent.Kafka" Version="2.5.3" />
<PackageVersion Include="Dapper" Version="2.1.44" />
Expand Down
6 changes: 3 additions & 3 deletions eng/dashboardpack/Common.projitems
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<PackageType />
<SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<EnableDefaultNoneItems>false</EnableDefaultNoneItems>
<IncludeBuildOutput>false</IncludeBuildOutput>
<PackageOutputPath Condition=" '$(PackageOutputPath)' == '' ">$(ArtifactsShippingPackagesDir)</PackageOutputPath>
</PropertyGroup>
Expand All @@ -24,7 +25,7 @@
</ItemGroup>

<ItemGroup>
<None Include="build*/*.props;**/*.targets" Pack="true" PerformTextReplacement="true" PackagePath="%(RecursiveDir)$(AssemblyName)%(Extension)" />
<None Include="build*/*.props;build*/*.targets" Pack="true" PerformTextReplacement="true" PackagePath="%(RecursiveDir)$(AssemblyName)%(Extension)" />
</ItemGroup>

<Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" />
Expand Down Expand Up @@ -56,8 +57,7 @@

<ItemGroup>
<None Include="Sdk.props" Pack="true" PackagePath="build/$(AssemblyName).props" />
<None Include="Sdk.in.targets" Pack="true" PerformTextReplacement="true"
PackagePath="build/$(AssemblyName).targets" />
<None Include="Sdk.targets" Pack="true" PackagePath="build/$(AssemblyName).targets" />
<None Include="UnixFilePermissions.xml" Pack="true" PackagePath="data/"
Condition=" '$(DashboardPlatformType)' == 'Unix' " />
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

<!-- *** BEGIN *** -->

<PropertyGroup Condition="'$(NETCoreSdkRuntimeIdentifier)' == '@PlatformRuntime@'">
<PropertyGroup>
<AspireDashboardDir Condition=" '$(AspireDashboardDir)' == '' ">$([MSBuild]::NormalizeDirectory($(MSBuildThisFileDirectory), '..', 'tools'))</AspireDashboardDir>
<AspireDashboardDir>$([MSBuild]::EnsureTrailingSlash('$(AspireDashboardDir)'))</AspireDashboardDir>
<AspireDashboardPath Condition=" '$(AspireDashboardPath)' == '' ">$([MSBuild]::NormalizePath($(AspireDashboardDir), 'Aspire.Dashboard'))</AspireDashboardPath>
<AspireDashboardPath Condition=" '$(OS)' == 'Windows_NT' and !$(AspireDashboardPath.EndsWith('.exe')) ">$(AspireDashboardPath).exe</AspireDashboardPath>
<AspireDashboardPath Condition="$([MSBuild]::IsOsPlatform('OSX')) and !$(AspireDashboardPath.EndsWith('.dll'))">$(AspireDashboardPath).dll</AspireDashboardPath>
</PropertyGroup>

<ItemGroup Condition="'$(NETCoreSdkRuntimeIdentifier)' == '@PlatformRuntime@'">
<ItemGroup>
<ProjectCapability Include="AspireDashboard" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>

<PropertyGroup Condition="'$(NETCoreSdkRuntimeIdentifier)' == '@PlatformRuntime@'">
<PropertyGroup>
<DcpDir Condition=" '$(DcpDir)' == '' ">$([MSBuild]::NormalizeDirectory($(MSBuildThisFileDirectory), '..', 'tools'))</DcpDir>
<DcpDir>$([MSBuild]::EnsureTrailingSlash('$(DcpDir)'))</DcpDir>
<DcpExtensionsDir Condition=" '$(DcpExtensionsDir)' == '' ">$([MSBuild]::NormalizeDirectory($(DcpDir), 'ext'))</DcpExtensionsDir>
Expand Down
5 changes: 3 additions & 2 deletions eng/dcppack/Common.projitems
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<IncludeBuildOutput>false</IncludeBuildOutput>
<EnableDefaultNoneItems>false</EnableDefaultNoneItems>
<PackageOutputPath Condition=" '$(PackageOutputPath)' == '' ">$(ArtifactsShippingPackagesDir)</PackageOutputPath>
<TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);AddPackageFiles</TargetsForTfmSpecificContentInPackage>
</PropertyGroup>
Expand All @@ -30,7 +31,7 @@
</ItemGroup>

<ItemGroup>
<None Include="build*/*.props;**/*.targets" Pack="true" PerformTextReplacement="true" PackagePath="%(RecursiveDir)$(AssemblyName)%(Extension)" />
<None Include="**/*.targets" Pack="true" PerformTextReplacement="true" PackagePath="%(RecursiveDir)$(AssemblyName)%(Extension)" />
</ItemGroup>

<!-- Package downloads to DCP packages as we need to repack the binaries from them -->
Expand Down Expand Up @@ -75,7 +76,7 @@
</Target>

<ItemGroup>
<None Include="Aspire.Hosting.Orchestration.in.targets" PerformTextReplacement="True" pack="true" PackagePath="build/$(PackageId).targets" />
<None Update="Aspire.Hosting.Orchestration.targets" PerformTextReplacement="" pack="true" PackagePath="build/$(PackageId).targets" />
<None Include="UnixFilePermissions.xml" Pack="true" PackagePath="data/" Condition=" '$(DcpPlatformType)' == 'Unix' " />
</ItemGroup>

Expand Down
28 changes: 28 additions & 0 deletions src/Aspire.Hosting.Sdk/Aspire.Hosting.Sdk.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,45 @@
<PropertyGroup>
<PackageTags>aspire hosting sdk</PackageTags>
<Description>.NET Aspire Hosting SDK. Enabled via &lt;IsAspireHost&gt;true&lt;/IsAspireHost&gt;.</Description>
<TargetsForTfmSpecificContentInPackage>_PublishAndPackRIDTool;$(TargetsForTfmSpecificContentInPackage)</TargetsForTfmSpecificContentInPackage>
</PropertyGroup>

<PropertyGroup>
<MinCodeCoverage>100</MinCodeCoverage>
</PropertyGroup>

<ItemGroup>
<TextReplacementValue Include="DefaultTargetFramework" NewValue="$(NetCurrent)" />
</ItemGroup>

<ItemGroup>
<None Include="..\Aspire.Hosting\build\*.targets" Link="SDK\%(Filename)%(Extension)" Pack="true" PackagePath="Sdk\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
<None Update="SDK\AutoImport.props;SDK\*.targets" Pack="true" PackagePath="Sdk\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
<None Update="SDK\Sdk.in.props" Pack="true" PerformTextReplacement="True" PackagePath="Sdk\Sdk.props" CopyToOutputDirectory="PreserveNewest" />
<None Update="SDK\Sdk.in.targets" Pack="true" PerformTextReplacement="True" PackagePath="Sdk\Sdk.targets" />

<!-- Adding a project reference to the tool to avoid MSBuild having clashes when building this project before the other. -->
<ProjectReference Include="Aspire.RuntimeIdentifier.Tool\Aspire.RuntimeIdentifier.Tool.csproj"
ReferenceOutputAssembly="false"
SkipTargetFrameworkProperties="true"
ExcludeAssets="all"
Private="false" />
</ItemGroup>

<Target Name="_PublishAndPackRIDTool">
<MSBuild Projects="$(MSBuildThisFileDirectory)Aspire.RuntimeIdentifier.Tool\Aspire.RuntimeIdentifier.Tool.csproj"
Targets="Publish"
Properties="Configuration=$(Configuration);Platform=$(Platform)" />

<ItemGroup>
<_publishContentToPackage Include="$(DotNetOutputPath)Aspire.RuntimeIdentifier.Tool/$(Configuration)/$(NetCurrent)/publish/**/*" />
</ItemGroup>

<ItemGroup>
<TfmSpecificPackageFile Include="@(_publishContentToPackage)"
PackagePath="tools/$(NetCurrent)/%(_publishContentToPackage.RecursiveDir)" />
</ItemGroup>

</Target>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>$(NetCurrent)</TargetFramework>
<RollForward>Major</RollForward>
<UsePublicApiAnalyzers>false</UsePublicApiAnalyzers>
<IsPackable>false</IsPackable>
<UseAppHost>false</UseAppHost>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="System.CommandLine" />
<PackageReference Include="NuGet.ProjectModel" />
</ItemGroup>

</Project>
50 changes: 50 additions & 0 deletions src/Aspire.Hosting.Sdk/Aspire.RuntimeIdentifier.Tool/NuGetUtils.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using NuGet.RuntimeModel;

namespace Aspire.Hosting.Sdk;

/*
* These utility methods were copied from the sdk repository to mimic the behavior used when selecting the best matching RID
* for a given runtime identifier. For more information, please see the original source code at:
* https://github.com/dotnet/sdk/blob/e6da8ca6de3ec8f392dc87b8529415e1ef59b7ea/src/Tasks/Microsoft.NET.Build.Tasks/NuGetUtils.NuGet.cs#L76-L109
*/

internal static class NuGetUtils
{
public static string? GetBestMatchingRid(RuntimeGraph runtimeGraph, string runtimeIdentifier,
IEnumerable<string> availableRuntimeIdentifiers, out bool wasInGraph)
{
return GetBestMatchingRidWithExclusion(runtimeGraph, runtimeIdentifier,
runtimeIdentifiersToExclude: null,
availableRuntimeIdentifiers, out wasInGraph);
}

public static string? GetBestMatchingRidWithExclusion(RuntimeGraph runtimeGraph, string runtimeIdentifier,
IEnumerable<string>? runtimeIdentifiersToExclude,
IEnumerable<string> availableRuntimeIdentifiers, out bool wasInGraph)
{
wasInGraph = runtimeGraph.Runtimes.ContainsKey(runtimeIdentifier);

string? bestMatch = null;

HashSet<string> availableRids = new(availableRuntimeIdentifiers, StringComparer.Ordinal);
HashSet<string>? excludedRids = runtimeIdentifiersToExclude switch { null => null, _ => new HashSet<string>(runtimeIdentifiersToExclude, StringComparer.Ordinal) };
foreach (var candidateRuntimeIdentifier in runtimeGraph.ExpandRuntime(runtimeIdentifier))
{
if (bestMatch == null && availableRids.Contains(candidateRuntimeIdentifier))
{
bestMatch = candidateRuntimeIdentifier;
}

if (excludedRids != null && excludedRids.Contains(candidateRuntimeIdentifier))
{
// Don't treat this as a match
return null;
}
}

return bestMatch;
}
}
87 changes: 87 additions & 0 deletions src/Aspire.Hosting.Sdk/Aspire.RuntimeIdentifier.Tool/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.CommandLine;
using System.CommandLine.Parsing;
using System.Diagnostics;
using System.Reflection;
using Aspire.Hosting.Sdk;
using NuGet.RuntimeModel;

namespace Aspire.RuntimeIdentifier.Tool;

sealed class Program
{
static int Main(string[] args)
{
CliRootCommand rootCommand = new("Aspire.RuntimeIdentifier.Tool v" + FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion)
{
TreatUnmatchedTokensAsErrors = true
};

CliOption<string?> runtimeGraphPathOption = new("--runtimeGraphPath")
{
Description = "Path to runtime graph path to use for RID mapping.",
Required = true
};

CliOption<string?> netcoreSdkRuntimeIdentifierOption = new("--netcoreSdkRuntimeIdentifier")
{
Description = "RID to use for finding the best applicable RID from mapping.",
Required = true
};

CliOption<string[]> supportedRidsOption = new("--supportedRids")
{
Description = "List of RIDs that are supported. Comma-separated.",
Required = true,
Arity = ArgumentArity.OneOrMore,
CustomParser = ParseSupportedRidsArgument
};

rootCommand.Options.Add(runtimeGraphPathOption);
rootCommand.Options.Add(netcoreSdkRuntimeIdentifierOption);
rootCommand.Options.Add(supportedRidsOption);
rootCommand.SetAction((ParseResult parseResult) =>
{
string rgp = parseResult.GetValue(runtimeGraphPathOption) ?? throw new InvalidOperationException("The --runtimeGraphPath argument is required.");

if (!File.Exists(rgp))
{
Console.WriteLine($"File {rgp} does not exist. Please ensure the runtime graph path exists.");
return -1;
}

RuntimeGraph graph = JsonRuntimeFormat.ReadRuntimeGraph(rgp);

var ridToUse = parseResult.GetValue(netcoreSdkRuntimeIdentifierOption);

var supportedRids = parseResult.GetValue(supportedRidsOption);

string? bestRidForPlatform = NuGetUtils.GetBestMatchingRid(graph, ridToUse!, supportedRids!, out bool wasInGraph);

if (!wasInGraph)
{
Console.WriteLine("Unable to find the best rid to use");
return -1;
}

Console.WriteLine(bestRidForPlatform);
return 0;
});

return rootCommand.Parse(args).Invoke();
}

private static string[]? ParseSupportedRidsArgument(ArgumentResult result)
{
List<string> args = new();

foreach (var token in result.Tokens)
{
args.AddRange(token.Value.Split(','));
}

return args.ToArray();
}
}
53 changes: 51 additions & 2 deletions src/Aspire.Hosting.Sdk/SDK/Sdk.in.targets
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@
<Warning Code="ASPIRE003" Text="$(MSBuildProjectName) is a .NET Aspire AppHost project that requires Visual Studio version 17.10 or above to work correctly. You are using version $(MSBuildVersion)." />
</Target>

<PropertyGroup>
<AspireRidToolRoot>$(MSBuildThisFileDirectory)..\tools\@DefaultTargetFramework@\</AspireRidToolRoot>
<AspireRidToolDirectory>$([MSBuild]::NormalizePath('$(AspireRidToolRoot)\'))</AspireRidToolDirectory>
<AspireRidToolExecutable>$(AspireRidToolDirectory)Aspire.RuntimeIdentifier.Tool.dll</AspireRidToolExecutable>
</PropertyGroup>

<!-- This target extracts the version of Aspire.Hosting.AppHost referenced by the project, and adds
a reference to Aspire.Dashboard.Sdk and Aspire.Hosting.Orchestration for the build-time platform using
the same version. This is done here dynamically to avoid having to pull in DCP and Dashboard packages
Expand Down Expand Up @@ -83,10 +89,53 @@
<Error Condition="'$(_AppHostVersion)' == ''"
Text="$(MSBuildProjectName) is a .NET Aspire AppHost project that needs a package reference to Aspire.Hosting.AppHost version 8.2.0 or above to work correctly." />

<!--The following is the list of the RIDs that we currently multitarget for DCP and Dashboard packages-->
<ItemGroup>
<_DashboardAndDCPSupportedTargetingRIDs Include="win-x64" />
<_DashboardAndDCPSupportedTargetingRIDs Include="win-x86" />
<_DashboardAndDCPSupportedTargetingRIDs Include="win-arm64" />
<_DashboardAndDCPSupportedTargetingRIDs Include="linux-x64" />
<_DashboardAndDCPSupportedTargetingRIDs Include="linux-arm64" />
<_DashboardAndDCPSupportedTargetingRIDs Include="osx-x64" />
<_DashboardAndDCPSupportedTargetingRIDs Include="osx-arm64" />
</ItemGroup>

<!-- If running in .NET Core, DOTNET_HOST_PATH is set to point to the dotnet executable being used
for the build. -->
<PropertyGroup>
<_DotNetHostPath>$(DOTNET_HOST_PATH)</_DotNetHostPath>
</PropertyGroup>

<!-- If running on .NET Framework MSBuild, then DOTNET_HOST_PATH won't be set, so we need to construct
the path using well-known properties. -->
<PropertyGroup Condition="'$(_DotNetHostPath)' == ''">
<_DotNetHostDirectory>$(NetCoreRoot)</_DotNetHostDirectory>
<_DotNetHostFileName>dotnet</_DotNetHostFileName>
<_DotNetHostFileName Condition="'$(OS)' == 'Windows_NT'">dotnet.exe</_DotNetHostFileName>

<_DotNetHostPath>$(_DotNetHostDirectory)\$(_DotNetHostFileName)</_DotNetHostPath>
</PropertyGroup>

<!-- Call Aspire.RuntimeIdentifier.Tool to get the RIDs for Dashboard and DCP packages -->
<Exec Command="&quot;$(_DotNetHostPath)&quot; exec &quot;$(AspireRidToolExecutable)&quot; --runtimeGraphPath &quot;$(BundledRuntimeIdentifierGraphFile)&quot; --supportedRids &quot;@(_DashboardAndDCPSupportedTargetingRIDs -> '%(Identity)', ',')&quot; --netcoreSdkRuntimeIdentifier &quot;$(NETCoreSdkRuntimeIdentifier)&quot;"
ConsoleToMSBuild="true"
StandardOutputImportance="Low"
IgnoreExitCode="true">
<Output TaskParameter="ExitCode" PropertyName="_AspireRidToolExitCode" />
<Output TaskParameter="ConsoleOutput" ItemName="_AspireRidToolOutput" />
</Exec>

<Error Condition="$(_AspireRidToolExitCode) != 0" Text="Failed to run Aspire.RuntimeIdentifier.Tool. Exit code: $(_AspireRidToolExitCode). Output: @(_AspireRidToolOutput)" />

<PropertyGroup>
<_DashboardAndDcpRID>@(_AspireRidToolOutput)</_DashboardAndDcpRID>
</PropertyGroup>


<!-- Now that we have the version, we add the package references -->
<ItemGroup>
<PackageReference Include="Aspire.Dashboard.Sdk.$(NETCoreSdkRuntimeIdentifier)" Version="$(_AppHostVersion)" IsImplicitlyDefined="true" />
<PackageReference Include="Aspire.Hosting.Orchestration.$(NETCoreSdkRuntimeIdentifier)" Version="$(_AppHostVersion)" IsImplicitlyDefined="true" />
<PackageReference Include="Aspire.Dashboard.Sdk.$(_DashboardAndDcpRID)" Version="$(_AppHostVersion)" IsImplicitlyDefined="true" />
<PackageReference Include="Aspire.Hosting.Orchestration.$(_DashboardAndDcpRID)" Version="$(_AppHostVersion)" IsImplicitlyDefined="true" />
</ItemGroup>
</Target>

Expand Down
Loading

0 comments on commit ccaa58a

Please sign in to comment.