Skip to content

Commit 9cf2539

Browse files
authored
Fix versioned sdk imports in file-based programs (#49008)
2 parents 3aa9493 + ae2638a commit 9cf2539

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -510,9 +510,7 @@ public static void WriteProjectFile(
510510
{
511511
if (isVirtualProject)
512512
{
513-
writer.WriteLine($"""
514-
<Import Project="Sdk.props" Sdk="{EscapeValue(sdk.ToSlashDelimitedString())}" />
515-
""");
513+
WriteImport(writer, "Sdk.props", sdk);
516514
}
517515
else if (sdk.Version is null)
518516
{
@@ -629,9 +627,7 @@ public static void WriteProjectFile(
629627

630628
foreach (var sdk in sdkDirectives)
631629
{
632-
writer.WriteLine($"""
633-
<Import Project="Sdk.targets" Sdk="{EscapeValue(sdk.ToSlashDelimitedString())}" />
634-
""");
630+
WriteImport(writer, "Sdk.targets", sdk);
635631
}
636632

637633
if (!sdkDirectives.Any())
@@ -679,6 +675,22 @@ Override targets which don't work with project files that are not present on dis
679675
""");
680676

681677
static string EscapeValue(string value) => SecurityElement.Escape(value);
678+
679+
static void WriteImport(TextWriter writer, string project, CSharpDirective.Sdk sdk)
680+
{
681+
if (sdk.Version is null)
682+
{
683+
writer.WriteLine($"""
684+
<Import Project="{EscapeValue(project)}" Sdk="{EscapeValue(sdk.Name)}" />
685+
""");
686+
}
687+
else
688+
{
689+
writer.WriteLine($"""
690+
<Import Project="{EscapeValue(project)}" Sdk="{EscapeValue(sdk.Name)}" Version="{EscapeValue(sdk.Version)}" />
691+
""");
692+
}
693+
}
682694
}
683695

684696
/// <param name="reportAllErrors">

test/dotnet.Tests/CommandTests/Run/RunFileTests.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,25 @@ public void PackageReference_CentralVersion()
973973
""");
974974
}
975975

976+
[Fact] // https://github.com/dotnet/sdk/issues/48990
977+
public void SdkReference()
978+
{
979+
var testInstance = _testAssetsManager.CreateTestDirectory();
980+
File.WriteAllText(Path.Join(testInstance.Path, "Program.cs"), """
981+
#:sdk Microsoft.NET.Sdk
982+
#:sdk Aspire.AppHost.Sdk 9.2.1
983+
984+
985+
var builder = DistributedApplication.CreateBuilder(args);
986+
builder.Build().Run();
987+
""");
988+
989+
new DotnetCommand(Log, "build", "Program.cs")
990+
.WithWorkingDirectory(testInstance.Path)
991+
.Execute()
992+
.Should().Pass();
993+
}
994+
976995
[Fact]
977996
public void UpToDate()
978997
{
@@ -1176,7 +1195,7 @@ public void Api()
11761195
11771196
<!-- We need to explicitly import Sdk props/targets so we can override the targets below. -->
11781197
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
1179-
<Import Project="Sdk.props" Sdk="Aspire.Hosting.Sdk/9.1.0" />
1198+
<Import Project="Sdk.props" Sdk="Aspire.Hosting.Sdk" Version="9.1.0" />
11801199
11811200
<PropertyGroup>
11821201
<OutputType>Exe</OutputType>
@@ -1207,7 +1226,7 @@ public void Api()
12071226
</ItemGroup>
12081227
12091228
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
1210-
<Import Project="Sdk.targets" Sdk="Aspire.Hosting.Sdk/9.1.0" />
1229+
<Import Project="Sdk.targets" Sdk="Aspire.Hosting.Sdk" Version="9.1.0" />
12111230
12121231
<!--
12131232
Override targets which don't work with project files that are not present on disk.

0 commit comments

Comments
 (0)