From d1702fee6326e3e3516a2ecea34fba99de08d6d6 Mon Sep 17 00:00:00 2001 From: Jason Zhai Date: Mon, 7 Nov 2022 22:38:43 -0800 Subject: [PATCH 1/9] Update the target framework for the desktop test projects --- .../MultiTFMXunitProject/XUnitProject/XUnitProject.csproj | 2 +- .../MultiTFMTestApp/MultiTFMTestApp.csproj | 2 +- .../dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs | 6 +++--- .../GivenDotnetPublishPublishesProjects.cs | 2 +- src/Tests/dotnet-run.Tests/GivenDotnetRunRunsCsProj.cs | 6 +++--- ...enDotnetTestBuildsAndRunsTestFromCsprojForMultipleTFM.cs | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Assets/DesktopTestProjects/MultiTFMXunitProject/XUnitProject/XUnitProject.csproj b/src/Assets/DesktopTestProjects/MultiTFMXunitProject/XUnitProject/XUnitProject.csproj index ffcaeed17268..665690317bd7 100644 --- a/src/Assets/DesktopTestProjects/MultiTFMXunitProject/XUnitProject/XUnitProject.csproj +++ b/src/Assets/DesktopTestProjects/MultiTFMXunitProject/XUnitProject/XUnitProject.csproj @@ -2,7 +2,7 @@ - net461;netcoreapp3.1 + net461;$(CurrentTargetFramework) diff --git a/src/Assets/DesktopTestProjects/NETFrameworkReferenceNETStandard20/MultiTFMTestApp/MultiTFMTestApp.csproj b/src/Assets/DesktopTestProjects/NETFrameworkReferenceNETStandard20/MultiTFMTestApp/MultiTFMTestApp.csproj index f6826cd79119..09ab1fbdef44 100644 --- a/src/Assets/DesktopTestProjects/NETFrameworkReferenceNETStandard20/MultiTFMTestApp/MultiTFMTestApp.csproj +++ b/src/Assets/DesktopTestProjects/NETFrameworkReferenceNETStandard20/MultiTFMTestApp/MultiTFMTestApp.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1;net461 + $(CurrentTargetFramework);net461 diff --git a/src/Tests/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs b/src/Tests/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs index 0c3944ae7b18..172a7fa426ca 100644 --- a/src/Tests/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs +++ b/src/Tests/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs @@ -87,7 +87,7 @@ public void ItCanBuildAMultiTFMProjectWithImplicitRestore() string projectDirectory = Path.Combine(testInstance.Path, "MultiTFMTestApp"); new DotnetBuildCommand(Log, projectDirectory) - .Execute("--framework", "netcoreapp3.1") + .Execute("--framework", ToolsetInfo.CurrentTargetFramework) .Should().Pass(); } @@ -183,7 +183,7 @@ public void It_warns_on_rid_without_self_contained_options() { var testInstance = _testAssetsManager.CopyTestAsset("HelloWorld") .WithSource() - .WithTargetFrameworkOrFrameworks("net6.0", false) + .WithTargetFrameworkOrFrameworks("net7.0", false) .Restore(Log); new DotnetBuildCommand(Log) @@ -223,7 +223,7 @@ public void It_does_not_warn_on_rid_with_self_contained_options(string commandNa { var testInstance = _testAssetsManager.CopyTestAsset("HelloWorld", identifier: commandName) .WithSource() - .WithTargetFrameworkOrFrameworks("net6.0", false) + .WithTargetFrameworkOrFrameworks(ToolsetInfo.CurrentTargetFramework, false) .Restore(Log); new DotnetCommand(Log) diff --git a/src/Tests/dotnet-publish.Tests/GivenDotnetPublishPublishesProjects.cs b/src/Tests/dotnet-publish.Tests/GivenDotnetPublishPublishesProjects.cs index 33c26c162735..5d03dba8679a 100644 --- a/src/Tests/dotnet-publish.Tests/GivenDotnetPublishPublishesProjects.cs +++ b/src/Tests/dotnet-publish.Tests/GivenDotnetPublishPublishesProjects.cs @@ -64,7 +64,7 @@ public void ItImplicitlyRestoresAProjectWhenPublishing() .Should().Pass(); } - [Fact(Skip = "https://github.com/dotnet/sdk/issues/19487")] + [Fact] public void ItCanPublishAMultiTFMProjectWithImplicitRestore() { var testInstance = _testAssetsManager.CopyTestAsset( diff --git a/src/Tests/dotnet-run.Tests/GivenDotnetRunRunsCsProj.cs b/src/Tests/dotnet-run.Tests/GivenDotnetRunRunsCsProj.cs index 1373c5e749a9..2d36491024bd 100644 --- a/src/Tests/dotnet-run.Tests/GivenDotnetRunRunsCsProj.cs +++ b/src/Tests/dotnet-run.Tests/GivenDotnetRunRunsCsProj.cs @@ -72,7 +72,7 @@ public void ItCanRunAMultiTFMProjectWithImplicitRestore() new DotnetCommand(Log, "run") .WithWorkingDirectory(projectDirectory) - .Execute("--framework", "netcoreapp3.1") + .Execute("--framework", ToolsetInfo.CurrentTargetFramework) .Should().Pass() .And.HaveStdOutContaining("This string came from the test library!"); } @@ -127,7 +127,7 @@ public void ItBuildsTheProjectBeforeRunning() .And.HaveStdOutContaining("Hello World!"); } - [Fact(Skip = "https://github.com/dotnet/sdk/issues/19487#issuecomment-898765210")] + [Fact] public void ItCanRunAMSBuildProjectWhenSpecifyingAFramework() { var testAppName = "MSBuildTestApp"; @@ -138,7 +138,7 @@ public void ItCanRunAMSBuildProjectWhenSpecifyingAFramework() new DotnetCommand(Log, "run") .WithWorkingDirectory(testProjectDirectory) - .Execute("--framework", "netcoreapp3.1") + .Execute("--framework", ToolsetInfo.CurrentTargetFramework) .Should().Pass() .And.HaveStdOut("Hello World!"); } diff --git a/src/Tests/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestFromCsprojForMultipleTFM.cs b/src/Tests/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestFromCsprojForMultipleTFM.cs index 5ce49ac40997..f9207c625f7f 100644 --- a/src/Tests/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestFromCsprojForMultipleTFM.cs +++ b/src/Tests/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestFromCsprojForMultipleTFM.cs @@ -142,7 +142,7 @@ public void ItCanTestAMultiTFMProjectWithImplicitRestore() new DotnetTestCommand(Log, ConsoleLoggerOutputNormal) .WithWorkingDirectory(projectDirectory) - .Execute("--framework", "netcoreapp3.0") + .Execute("--framework", ToolsetInfo.CurrentTargetFramework) .Should().Pass(); } From c672bf996c90e1485d321ab5e2309d7173aec98b Mon Sep 17 00:00:00 2001 From: Jason Zhai Date: Mon, 7 Nov 2022 22:42:39 -0800 Subject: [PATCH 2/9] Fix a typo --- src/Tests/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tests/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs b/src/Tests/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs index 172a7fa426ca..1a2cb5aa95da 100644 --- a/src/Tests/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs +++ b/src/Tests/dotnet-build.Tests/GivenDotnetBuildBuildsCsproj.cs @@ -183,7 +183,7 @@ public void It_warns_on_rid_without_self_contained_options() { var testInstance = _testAssetsManager.CopyTestAsset("HelloWorld") .WithSource() - .WithTargetFrameworkOrFrameworks("net7.0", false) + .WithTargetFrameworkOrFrameworks(ToolsetInfo.CurrentTargetFramework, false) .Restore(Log); new DotnetBuildCommand(Log) From 2eb9439b97f54c72dcfe4c81add4bd3dfe4c77f6 Mon Sep 17 00:00:00 2001 From: Marc Paine Date: Fri, 11 Nov 2022 14:34:53 -0800 Subject: [PATCH 3/9] Migrate the nuget state from earlier SDKs --- .../DotnetFirstTimeUseConfigurer.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs b/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs index d583a660b066..6c04aeb99b33 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs +++ b/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs @@ -58,6 +58,9 @@ public void Configure() if (ShouldPrintFirstTimeUseNotice()) { Stopwatch beforeFirstTimeUseNotice = Stopwatch.StartNew(); + // Migrate the nuget state from earlier SDKs + NuGet.Common.Migrations.MigrationRunner.Run(); + if (!_dotnetFirstRunConfiguration.NoLogo) { PrintFirstTimeMessageWelcome(); From fc349cb8ccb6fa8dcc3f05af91a009e1b091ab38 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 19:43:24 +0000 Subject: [PATCH 4/9] [release/6.0.4xx] Update dependencies from dotnet/arcade (#29038) * Update dependencies from https://github.com/dotnet/arcade build 20221108.7 Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.Helix.Sdk , Microsoft.DotNet.SignTool , Microsoft.DotNet.XUnitExtensions From Version 6.0.0-beta.22558.2 -> To Version 6.0.0-beta.22558.7 * Update dependencies from https://github.com/dotnet/arcade build 20221110.1 Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.Helix.Sdk , Microsoft.DotNet.SignTool , Microsoft.DotNet.XUnitExtensions From Version 6.0.0-beta.22558.2 -> To Version 6.0.0-beta.22560.1 Co-authored-by: dotnet-maestro[bot] --- NuGet.config | 8 -- eng/Version.Details.xml | 16 +-- eng/Versions.props | 4 +- eng/common/dotnet-install.sh | 4 +- global.json | 4 +- ...GivenThatWeWantToBuildASelfContainedApp.cs | 105 +++++++++--------- 6 files changed, 68 insertions(+), 73 deletions(-) diff --git a/NuGet.config b/NuGet.config index 6b68af12cb30..adc36228c667 100644 --- a/NuGet.config +++ b/NuGet.config @@ -4,20 +4,16 @@ - - - - @@ -37,16 +33,12 @@ - - - - diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index c608c1e585f6..52d62ec5b458 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -287,22 +287,22 @@ - + https://github.com/dotnet/arcade - 841e1fe0d2498a7ac6445e458ae521511ec226ca + 0967701e5527a1be21d9473821077c3f4be7f9dc - + https://github.com/dotnet/arcade - 841e1fe0d2498a7ac6445e458ae521511ec226ca + 0967701e5527a1be21d9473821077c3f4be7f9dc - + https://github.com/dotnet/arcade - 841e1fe0d2498a7ac6445e458ae521511ec226ca + 0967701e5527a1be21d9473821077c3f4be7f9dc - + https://github.com/dotnet/arcade - 841e1fe0d2498a7ac6445e458ae521511ec226ca + 0967701e5527a1be21d9473821077c3f4be7f9dc https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 39aa1440329b..dfea3fd0bcdd 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -28,7 +28,7 @@ $(NewtonsoftJsonPackageVersion) 4.0.0 6.0.0 - 6.0.0-beta.22558.2 + 6.0.0-beta.22561.1 3.1.0 4.3.0 4.3.0 @@ -172,7 +172,7 @@ 4.19.2 4.19.0 - 6.0.0-beta.22558.2 + 6.0.0-beta.22561.1 4.8.2 6.0.0-beta.22262.1 diff --git a/eng/common/dotnet-install.sh b/eng/common/dotnet-install.sh index fdfeea66e7d4..b09ea669f9c0 100755 --- a/eng/common/dotnet-install.sh +++ b/eng/common/dotnet-install.sh @@ -52,7 +52,7 @@ done # Use uname to determine what the CPU is, see https://en.wikipedia.org/wiki/Uname#Examples cpuname=$(uname -m) case $cpuname in - aarch64) + arm64|aarch64) buildarch=arm64 ;; amd64|x86_64) @@ -61,7 +61,7 @@ case $cpuname in armv*l) buildarch=arm ;; - i686) + i[3-6]86) buildarch=x86 ;; *) diff --git a/global.json b/global.json index 483dfb94f02d..c2f4713f153e 100644 --- a/global.json +++ b/global.json @@ -11,7 +11,7 @@ } }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.22558.2", - "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.22558.2" + "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.22561.1", + "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.22561.1" } } diff --git a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildASelfContainedApp.cs b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildASelfContainedApp.cs index 68c9dc91114c..63e1e698dd8f 100644 --- a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildASelfContainedApp.cs +++ b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildASelfContainedApp.cs @@ -99,21 +99,21 @@ public void It_errors_out_when_RuntimeIdentifier_architecture_and_PlatformTarget const string PlatformTarget = "x86"; var testAsset = _testAssetsManager - .CopyTestAsset("HelloWorld") - .WithSource() - .WithProjectChanges(project => - { - var ns = project.Root.Name.Namespace; - var propertyGroup = project.Root.Elements(ns + "PropertyGroup").First(); - propertyGroup.Add(new XElement(ns + "RuntimeIdentifier", RuntimeIdentifier)); + .CopyTestAsset("HelloWorld") + .WithSource() + .WithProjectChanges(project => + { + var ns = project.Root.Name.Namespace; + var propertyGroup = project.Root.Elements(ns + "PropertyGroup").First(); + propertyGroup.Add(new XElement(ns + "RuntimeIdentifier", RuntimeIdentifier)); propertyGroup.Add(new XElement(ns + "PlatformTarget", PlatformTarget)); - }); + }); - var buildCommand = new BuildCommand(testAsset); + var buildCommand = new BuildCommand(testAsset); - buildCommand - .Execute() - .Should() + buildCommand + .Execute() + .Should() .Fail() .And.HaveStdOutContaining(string.Format( Strings.CannotHaveRuntimeIdentifierPlatformMismatchPlatformTarget, @@ -121,41 +121,41 @@ public void It_errors_out_when_RuntimeIdentifier_architecture_and_PlatformTarget PlatformTarget)); } - [Fact] - public void It_succeeds_when_RuntimeIdentifier_and_PlatformTarget_mismatch_but_PT_is_AnyCPU() - { - var targetFramework = ToolsetInfo.CurrentTargetFramework; - var runtimeIdentifier = EnvironmentInfo.GetCompatibleRid(targetFramework); - var testAsset = _testAssetsManager - .CopyTestAsset("HelloWorld") - .WithSource() - .WithProjectChanges(project => - { - var ns = project.Root.Name.Namespace; - var propertyGroup = project.Root.Elements(ns + "PropertyGroup").First(); - propertyGroup.Add(new XElement(ns + "RuntimeIdentifier", runtimeIdentifier)); - propertyGroup.Add(new XElement(ns + "PlatformTarget", "AnyCPU")); - }); - - var buildCommand = new BuildCommand(testAsset); - - buildCommand - .Execute() - .Should() - .Pass(); - - var outputDirectory = buildCommand.GetOutputDirectory(targetFramework, runtimeIdentifier: runtimeIdentifier); - var selfContainedExecutable = $"HelloWorld{Constants.ExeSuffix}"; - - string selfContainedExecutableFullPath = Path.Combine(outputDirectory.FullName, selfContainedExecutable); + [Fact] + public void It_succeeds_when_RuntimeIdentifier_and_PlatformTarget_mismatch_but_PT_is_AnyCPU() + { + var targetFramework = ToolsetInfo.CurrentTargetFramework; + var runtimeIdentifier = EnvironmentInfo.GetCompatibleRid(targetFramework); + var testAsset = _testAssetsManager + .CopyTestAsset("HelloWorld") + .WithSource() + .WithProjectChanges(project => + { + var ns = project.Root.Name.Namespace; + var propertyGroup = project.Root.Elements(ns + "PropertyGroup").First(); + propertyGroup.Add(new XElement(ns + "RuntimeIdentifier", runtimeIdentifier)); + propertyGroup.Add(new XElement(ns + "PlatformTarget", "AnyCPU")); + }); + + var buildCommand = new BuildCommand(testAsset); + + buildCommand + .Execute() + .Should() + .Pass(); + + var outputDirectory = buildCommand.GetOutputDirectory(targetFramework, runtimeIdentifier: runtimeIdentifier); + var selfContainedExecutable = $"HelloWorld{Constants.ExeSuffix}"; + + string selfContainedExecutableFullPath = Path.Combine(outputDirectory.FullName, selfContainedExecutable); new RunExeCommand(Log, selfContainedExecutableFullPath) - .Execute() - .Should() - .Pass() - .And - .HaveStdOutContaining("Hello World!"); - } + .Execute() + .Should() + .Pass() + .And + .HaveStdOutContaining("Hello World!"); + } [RequiresMSBuildVersionFact("17.0.0.32901")] public void It_resolves_runtimepack_from_packs_folder() @@ -317,7 +317,7 @@ static int Last2DigitsTo0(int versionBuild) "); // Verify correct targeting pack version is resolved - var getValuesCommand = (GetValuesCommand) new GetValuesCommand(testAsset, "TargetingPack", GetValuesCommand.ValueType.Item) + var getValuesCommand = (GetValuesCommand)new GetValuesCommand(testAsset, "TargetingPack", GetValuesCommand.ValueType.Item) .WithEnvironmentVariable(EnvironmentVariableNames.WORKLOAD_MANIFEST_ROOTS, manifestRoot); getValuesCommand.MetadataNames = new List() { "NuGetPackageId", "NuGetPackageVersion" }; getValuesCommand.DependsOnTargets = "ProcessFrameworkReferences"; @@ -349,21 +349,24 @@ static int Last2DigitsTo0(int versionBuild) testRuntimePack.metadata["NuGetPackageVersion"].Should().Be("1.0.42-abc"); } - [Theory] + [RequiresMSBuildVersionTheory("17.4.0.51802")] [InlineData("net6.0")] - public void It_can_publish_runtime_specific_apps_with_library_dependencies_self_contained(string targetFramework) { + public void It_can_publish_runtime_specific_apps_with_library_dependencies_self_contained(string targetFramework) + { // create a basic library and a basic app, reference the library from the app and then // publish the app with a RID specified and self-contained. // verify that no warnings about missing the --self-contained flag are emitted. var rid = EnvironmentInfo.GetCompatibleRid(targetFramework); - var libProject = new TestProject("RidSelfContainedLib"){ + var libProject = new TestProject("RidSelfContainedLib") + { IsExe = false, TargetFrameworks = targetFramework, IsSdkProject = true }; var createdLibProject = _testAssetsManager.CreateTestProject(libProject); - var appProject = new TestProject("RidSelfContainedApp") { + var appProject = new TestProject("RidSelfContainedApp") + { IsExe = true, TargetFrameworks = targetFramework, IsSdkProject = true @@ -371,7 +374,7 @@ public void It_can_publish_runtime_specific_apps_with_library_dependencies_self_ appProject.ReferencedProjects.Add(libProject); var createdAppProject = _testAssetsManager.CreateTestProject(appProject); var publishCommand = new PublishCommand(createdAppProject); - publishCommand.Execute(new [] {"-property:SelfContained=true", "-property:_CommandLineDefinedSelfContained=true", $"-property:RuntimeIdentifier={rid}", "-property:_CommandLineDefinedRuntimeIdentifier=true" }).Should().Pass().And.NotHaveStdOutContaining("warning"); + publishCommand.Execute(new[] { "-property:SelfContained=true", "-property:_CommandLineDefinedSelfContained=true", $"-property:RuntimeIdentifier={rid}", "-property:_CommandLineDefinedRuntimeIdentifier=true" }).Should().Pass().And.NotHaveStdOutContaining("warning"); } } } From f5d6b42eb7c584ed36c50ee5eb61a27cf119a1dc Mon Sep 17 00:00:00 2001 From: Marc Paine Date: Wed, 16 Nov 2022 16:35:21 -0800 Subject: [PATCH 5/9] Merge pull request #28963 from wrall/UnrestoredProjRef Deps.json should include project references that aren't present in project.assets.json --- .../GivenADependencyContextBuilder.cs | 12 +- .../DependencyContextBuilder.cs | 4 +- .../GenerateDepsFile.cs | 37 ++-- .../ReferenceInfo.cs | 46 +++- .../Microsoft.NET.DesignerSupport.targets | 1 + .../targets/Microsoft.NET.Publish.targets | 3 +- .../targets/Microsoft.NET.Sdk.targets | 8 +- ...ildAnAppWithTransitiveNonSdkProjectRefs.cs | 202 ++++++++++++++++++ ...ntToBuildAnAppWithTransitiveProjectRefs.cs | 4 +- 9 files changed, 282 insertions(+), 35 deletions(-) create mode 100644 src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithTransitiveNonSdkProjectRefs.cs diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenADependencyContextBuilder.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenADependencyContextBuilder.cs index 31b3bee2408c..a0b6f088b5df 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenADependencyContextBuilder.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenADependencyContextBuilder.cs @@ -40,6 +40,7 @@ public void ItBuildsDependencyContextsFromProjectLockFiles( object[] resolvedNuGetFiles) { LockFile lockFile = TestLockFiles.GetLockFile(mainProjectName); + LockFileLookup lockFileLookup = new LockFileLookup(lockFile); SingleProjectInfo mainProject = SingleProjectInfo.Create( "/usr/Path", @@ -52,8 +53,9 @@ public void ItBuildsDependencyContextsFromProjectLockFiles( ReferenceInfo.CreateDirectReferenceInfos( referencePaths ?? new ITaskItem[] { }, referenceSatellitePaths ?? new ITaskItem[] { }, - projectContextHasProjectReferences: false, - i => true); + lockFileLookup: lockFileLookup, + i => true, + true); ProjectContext projectContext = lockFile.CreateProjectContext( FrameworkConstants.CommonFrameworks.NetCoreApp10.GetShortFolderName(), @@ -67,7 +69,7 @@ public void ItBuildsDependencyContextsFromProjectLockFiles( resolvedNuGetFiles = Array.Empty(); } - DependencyContext dependencyContext = new DependencyContextBuilder(mainProject, includeRuntimeFileVersions: false, runtimeGraph: null, projectContext: projectContext) + DependencyContext dependencyContext = new DependencyContextBuilder(mainProject, includeRuntimeFileVersions: false, runtimeGraph: null, projectContext: projectContext, libraryLookup: lockFileLookup) .WithDirectReferences(directReferences) .WithCompilationOptions(compilationOptions) .WithResolvedNuGetFiles((ResolvedFile[]) resolvedNuGetFiles) @@ -264,7 +266,7 @@ private DependencyContext BuildDependencyContextWithReferenceAssemblies(bool use useCompilationOptions ? CreateCompilationOptions() : null; - DependencyContext dependencyContext = new DependencyContextBuilder(mainProject, includeRuntimeFileVersions: false, runtimeGraph: null, projectContext: projectContext) + DependencyContext dependencyContext = new DependencyContextBuilder(mainProject, includeRuntimeFileVersions: false, runtimeGraph: null, projectContext: projectContext, libraryLookup: new LockFileLookup(lockFile)) .WithReferenceAssemblies(ReferenceInfo.CreateReferenceInfos(referencePaths)) .WithCompilationOptions(compilationOptions) .Build(); @@ -325,7 +327,7 @@ public void ItCanGenerateTheRuntimeFallbackGraph() void CheckRuntimeFallbacks(string runtimeIdentifier, int fallbackCount) { projectContext.LockFileTarget.RuntimeIdentifier = runtimeIdentifier; - var dependencyContextBuilder = new DependencyContextBuilder(mainProject, includeRuntimeFileVersions: false, runtimeGraph, projectContext); + var dependencyContextBuilder = new DependencyContextBuilder(mainProject, includeRuntimeFileVersions: false, runtimeGraph, projectContext, libraryLookup: new LockFileLookup(lockFile)); var runtimeFallbacks = dependencyContextBuilder.Build().RuntimeGraph; runtimeFallbacks diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/DependencyContextBuilder.cs b/src/Tasks/Microsoft.NET.Build.Tasks/DependencyContextBuilder.cs index 5428145aa35f..bbbaeb68ba98 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/DependencyContextBuilder.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/DependencyContextBuilder.cs @@ -47,14 +47,12 @@ internal class DependencyContextBuilder private const string NetCorePlatformLibrary = "Microsoft.NETCore.App"; - public DependencyContextBuilder(SingleProjectInfo mainProjectInfo, bool includeRuntimeFileVersions, RuntimeGraph runtimeGraph, ProjectContext projectContext) + public DependencyContextBuilder(SingleProjectInfo mainProjectInfo, bool includeRuntimeFileVersions, RuntimeGraph runtimeGraph, ProjectContext projectContext, LockFileLookup libraryLookup) { _mainProjectInfo = mainProjectInfo; _includeRuntimeFileVersions = includeRuntimeFileVersions; _runtimeGraph = runtimeGraph; - var libraryLookup = new LockFileLookup(projectContext.LockFile); - _dependencyLibraries = projectContext.LockFileTarget.Libraries .Select(lockFileTargetLibrary => { diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/GenerateDepsFile.cs b/src/Tasks/Microsoft.NET.Build.Tasks/GenerateDepsFile.cs index 67369ee412eb..dc71c6e3ac7b 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/GenerateDepsFile.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/GenerateDepsFile.cs @@ -94,6 +94,8 @@ public class GenerateDepsFile : TaskWithAssemblyResolveHooks public bool IncludeRuntimeFileVersions { get; set; } + public bool IncludeProjectsNotInAssetsFile { get; set; } + [Required] public string RuntimeGraphPath { get; set; } @@ -125,20 +127,19 @@ private Dictionary GetFilteredPackages() private void WriteDepsFile(string depsFilePath) { - ProjectContext projectContext; - if (AssetsFilePath == null) - { - projectContext = null; - } - else + ProjectContext projectContext = null; + LockFileLookup lockFileLookup = null; + if (AssetsFilePath != null) { LockFile lockFile = new LockFileCache(this).GetLockFile(AssetsFilePath); projectContext = lockFile.CreateProjectContext( - TargetFramework, - RuntimeIdentifier, - PlatformLibraryName, - RuntimeFrameworks, - IsSelfContained); + TargetFramework, + RuntimeIdentifier, + PlatformLibraryName, + RuntimeFrameworks, + IsSelfContained); + + lockFileLookup = new LockFileLookup(lockFile); } CompilationOptions compilationOptions = CompilationOptionsConverter.ConvertFrom(CompilerOptions); @@ -156,13 +157,15 @@ private void WriteDepsFile(string depsFilePath) IEnumerable referenceAssemblyInfos = ReferenceInfo.CreateReferenceInfos(ReferenceAssemblies); - // If there is a generated asset file. The projectContext will have project reference. - // So remove it from directReferences to avoid duplication - var projectContextHasProjectReferences = projectContext != null; + // If there is a generated asset file, the projectContext will contain most of the project references. + // So remove any project reference contained within projectContext from directReferences to avoid duplication IEnumerable directReferences = - ReferenceInfo.CreateDirectReferenceInfos(ReferencePaths, + ReferenceInfo.CreateDirectReferenceInfos( + ReferencePaths, ReferenceSatellitePaths, - projectContextHasProjectReferences, isUserRuntimeAssembly); + lockFileLookup, + isUserRuntimeAssembly, + IncludeProjectsNotInAssetsFile); IEnumerable dependencyReferences = ReferenceInfo.CreateDependencyReferenceInfos(ReferenceDependencyPaths, ReferenceSatellitePaths, isUserRuntimeAssembly); @@ -210,7 +213,7 @@ bool ShouldIncludeRuntimeAsset(ITaskItem item) RuntimeGraph runtimeGraph = IsSelfContained ? new RuntimeGraphCache(this).GetRuntimeGraph(RuntimeGraphPath) : null; - builder = new DependencyContextBuilder(mainProject, IncludeRuntimeFileVersions, runtimeGraph, projectContext); + builder = new DependencyContextBuilder(mainProject, IncludeRuntimeFileVersions, runtimeGraph, projectContext, lockFileLookup); } else { diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ReferenceInfo.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ReferenceInfo.cs index dfe0866df067..11ad32000307 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ReferenceInfo.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ReferenceInfo.cs @@ -54,17 +54,49 @@ public static IEnumerable CreateReferenceInfos(IEnumerable CreateDirectReferenceInfos( IEnumerable referencePaths, IEnumerable referenceSatellitePaths, - bool projectContextHasProjectReferences, - Func isRuntimeAssembly) + LockFileLookup lockFileLookup, + Func isRuntimeAssembly, + bool includeProjectsNotInAssetsFile) { - - bool filterOutProjectReferenceIfInProjectContextAlready(ITaskItem referencePath) + bool lockFileContainsProject(ITaskItem referencePath) { - return (projectContextHasProjectReferences ? !IsProjectReference(referencePath) : true); + if (lockFileLookup == null) + { + return false; + } + + if (!IsProjectReference(referencePath)) + { + return false; + } + + if (!includeProjectsNotInAssetsFile) + { + return true; + } + + string projectName; + string projectFilePath = referencePath.GetMetadata(MetadataKeys.MSBuildSourceProjectFile); + if (!string.IsNullOrEmpty(projectFilePath)) + { + projectName = Path.GetFileNameWithoutExtension(projectFilePath); + } + else + { + // fall back to using the path to the output DLL + projectName = Path.GetFileNameWithoutExtension(referencePath.ItemSpec); + if (string.IsNullOrEmpty(projectName)) + { + // unexpected - let's assume this project was already included in the assets file. + return true; + } + } + + return lockFileLookup.GetProject(projectName) != null; } IEnumerable directReferencePaths = referencePaths - .Where(r => filterOutProjectReferenceIfInProjectContextAlready(r) && !IsNuGetReference(r) && isRuntimeAssembly(r)); + .Where(r => !lockFileContainsProject(r) && !IsNuGetReference(r) && isRuntimeAssembly(r)); return CreateFilteredReferenceInfos(directReferencePaths, referenceSatellitePaths); } @@ -147,7 +179,7 @@ private static string GetVersion(ITaskItem referencePath) if (!string.IsNullOrEmpty(fusionName)) { AssemblyName assemblyName = new AssemblyName(fusionName); - version = assemblyName.Version.ToString(); + version = assemblyName.Version?.ToString(); } if (string.IsNullOrEmpty(version)) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.DesignerSupport.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.DesignerSupport.targets index 31e6ec5f694d..000e7153f1b4 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.DesignerSupport.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.DesignerSupport.targets @@ -68,6 +68,7 @@ Copyright (c) .NET Foundation. All rights reserved. ResolvedRuntimeTargetsFiles="@(RuntimeTargetsCopyLocalItems)" TargetFramework="$(TargetFramework)" RuntimeGraphPath="$(BundledRuntimeIdentifierGraphFile)" + IncludeProjectsNotInAssetsFile="$(IncludeProjectsNotInAssetsFileInDepsFile)" /> diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets index 36702c67c274..b9c15704968b 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets @@ -980,7 +980,8 @@ Copyright (c) .NET Foundation. All rights reserved. IsSelfContained="$(SelfContained)" IsSingleFile="$(_IsSingleFilePublish)" IncludeRuntimeFileVersions="$(IncludeFileVersionsInDependencyFile)" - RuntimeGraphPath="$(BundledRuntimeIdentifierGraphFile)"/> + RuntimeGraphPath="$(BundledRuntimeIdentifierGraphFile)" + IncludeProjectsNotInAssetsFile="$(IncludeProjectsNotInAssetsFileInDepsFile)"/> diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets index 31c53533eaf0..ae9b0ba6b019 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets @@ -109,6 +109,11 @@ Copyright (c) .NET Foundation. All rights reserved. false + + + true + + _CheckForBuildWithNoBuild; @@ -197,7 +202,8 @@ Copyright (c) .NET Foundation. All rights reserved. ResolvedRuntimeTargetsFiles="@(RuntimeTargetsCopyLocalItems)" IsSelfContained="$(SelfContained)" IncludeRuntimeFileVersions="$(IncludeFileVersionsInDependencyFile)" - RuntimeGraphPath="$(BundledRuntimeIdentifierGraphFile)"/> + RuntimeGraphPath="$(BundledRuntimeIdentifierGraphFile)" + IncludeProjectsNotInAssetsFile="$(IncludeProjectsNotInAssetsFileInDepsFile)"/> MainLibrary --depends on--> AuxLibrary (non-SDK) + // (TestApp transitively depends on AuxLibrary) + var testAsset = _testAssetsManager + .CreateTestProject(CreateTestProject()); + + VerifyAppBuilds(testAsset, string.Empty); + } + + [WindowsOnlyTheory] + [InlineData("")] + [InlineData("TestApp.")] + public void It_builds_deps_correctly_when_projects_do_not_get_restored(string prefix) + { + // NOTE the projects created by CreateTestProject: + // TestApp --depends on--> MainLibrary --depends on--> AuxLibrary + // (TestApp transitively depends on AuxLibrary) + var testAsset = _testAssetsManager + .CreateTestProject(CreateTestProject()) + .WithProjectChanges( + (projectName, project) => + { + string projectFileName = Path.GetFileNameWithoutExtension(projectName); + if (StringComparer.OrdinalIgnoreCase.Equals(projectFileName, "AuxLibrary") || + StringComparer.OrdinalIgnoreCase.Equals(projectFileName, "MainLibrary")) + { + var ns = project.Root.Name.Namespace; + + XElement propertyGroup = project.Root.Element(ns + "PropertyGroup"); + if (!string.IsNullOrEmpty(prefix)) + { + XElement assemblyName = propertyGroup.Element(ns + "AssemblyName"); + assemblyName.RemoveAll(); + assemblyName.Add(prefix + projectFileName); + } + + // indicate that project restore is not supported for these projects: + var target = new XElement(ns + "Target", + new XAttribute("Name", "_IsProjectRestoreSupported"), + new XAttribute("Returns", "@(_ValidProjectsForRestore)")); + + project.Root.Add(target); + } + else // if (StringComparer.OrdinalIgnoreCase.Equals(projectFileName, "TestApp")) + { + var ns = project.Root.Name.Namespace; + + XElement propertyGroup = project.Root.Element(ns + "PropertyGroup"); + + XElement includeProjectsNotInAssetsFileInDepsFile = new XElement(ns + "IncludeProjectsNotInAssetsFileInDepsFile"); + includeProjectsNotInAssetsFileInDepsFile.Add("true"); + propertyGroup.Add(includeProjectsNotInAssetsFileInDepsFile); + } + }); + + string outputDirectory = VerifyAppBuilds(testAsset, prefix); + + using (var depsJsonFileStream = File.OpenRead(Path.Combine(outputDirectory, "TestApp.deps.json"))) + { + var dependencyContext = new DependencyContextJsonReader().Read(depsJsonFileStream); + + var projectNames = dependencyContext.RuntimeLibraries.Select(library => library.Name).ToList(); + projectNames.Should().BeEquivalentTo(new[] { "TestApp", prefix + "AuxLibrary", prefix + "MainLibrary" }); + } + } + + private TestProject CreateTestProject() + { + string targetFrameworkVersion = "v4.8"; + + var auxLibraryProject = new TestProject("AuxLibrary") + { + IsSdkProject = false, + TargetFrameworkVersion = targetFrameworkVersion + }; + auxLibraryProject.SourceFiles["Helper.cs"] = """ + using System; + + namespace AuxLibrary + { + public static class Helper + { + public static void WriteMessage() + { + Console.WriteLine("This string came from AuxLibrary!"); + } + } + } + """; + + var mainLibraryProject = new TestProject("MainLibrary") + { + IsSdkProject = false, + TargetFrameworkVersion = targetFrameworkVersion + }; + mainLibraryProject.ReferencedProjects.Add(auxLibraryProject); + mainLibraryProject.SourceFiles["Helper.cs"] = """ + using System; + + namespace MainLibrary + { + public static class Helper + { + public static void WriteMessage() + { + Console.WriteLine("This string came from MainLibrary!"); + AuxLibrary.Helper.WriteMessage(); + } + } + } + """; + + var testAppProject = new TestProject("TestApp") + { + IsExe = true, + TargetFrameworks = ToolsetInfo.CurrentTargetFramework + }; + testAppProject.AdditionalProperties["ProduceReferenceAssembly"] = "false"; + testAppProject.ReferencedProjects.Add(mainLibraryProject); + testAppProject.SourceFiles["Program.cs"] = """ + using System; + + namespace TestApp + { + public class Program + { + public static void Main(string[] args) + { + Console.WriteLine("TestApp --depends on--> MainLibrary --depends on--> AuxLibrary"); + MainLibrary.Helper.WriteMessage(); + } + } + } + """; + + return testAppProject; + } + + private string VerifyAppBuilds(TestAsset testAsset, string prefix) + { + var buildCommand = new BuildCommand(testAsset, "TestApp"); + var outputDirectory = buildCommand.GetOutputDirectory(ToolsetInfo.CurrentTargetFramework); + + buildCommand + .Execute() + .Should() + .Pass(); + + outputDirectory.Should().OnlyHaveFiles(new[] { + "TestApp.dll", + "TestApp.pdb", + $"TestApp{EnvironmentInfo.ExecutableExtension}", + "TestApp.deps.json", + "TestApp.runtimeconfig.json", + prefix + "MainLibrary.dll", + prefix + "MainLibrary.pdb", + prefix + "AuxLibrary.dll", + prefix + "AuxLibrary.pdb", + }); + + new DotnetCommand(Log, Path.Combine(outputDirectory.FullName, "TestApp.dll")) + .Execute() + .Should() + .Pass() + .And + .HaveStdOutContaining("This string came from MainLibrary!") + .And + .HaveStdOutContaining("This string came from AuxLibrary!"); + + return outputDirectory.FullName; + } + } +} diff --git a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithTransitiveProjectRefs.cs b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithTransitiveProjectRefs.cs index c8086768b40f..479a30b06e9c 100644 --- a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithTransitiveProjectRefs.cs +++ b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithTransitiveProjectRefs.cs @@ -123,7 +123,9 @@ public void It_does_not_build_the_project_successfully() buildCommand .Execute("/p:DisableTransitiveProjectReferences=true") .Should() - .Fail(); + .Fail() + .And + .HaveStdOutContaining("CS0103"); } } } From 63e593740b2e3132cf4c0e1a9eef42f94a843417 Mon Sep 17 00:00:00 2001 From: Marc Paine Date: Wed, 16 Nov 2022 17:06:15 -0800 Subject: [PATCH 6/9] Turn the feature off by default --- .../targets/Microsoft.NET.Sdk.targets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets index ae9b0ba6b019..2c7c6c5bd71d 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets @@ -110,8 +110,8 @@ Copyright (c) .NET Foundation. All rights reserved. - - true + + false From 752104c168cfac96036cb405ab59396bcf30df59 Mon Sep 17 00:00:00 2001 From: Marc Paine Date: Thu, 17 Nov 2022 16:05:36 -0800 Subject: [PATCH 7/9] Try a different string format to fix the build. --- ...uildAnAppWithTransitiveNonSdkProjectRefs.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithTransitiveNonSdkProjectRefs.cs b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithTransitiveNonSdkProjectRefs.cs index a20ff3c569f5..adfa29abe511 100644 --- a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithTransitiveNonSdkProjectRefs.cs +++ b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithTransitiveNonSdkProjectRefs.cs @@ -102,7 +102,7 @@ private TestProject CreateTestProject() IsSdkProject = false, TargetFrameworkVersion = targetFrameworkVersion }; - auxLibraryProject.SourceFiles["Helper.cs"] = """ + auxLibraryProject.SourceFiles["Helper.cs"] = @" using System; namespace AuxLibrary @@ -111,11 +111,11 @@ public static class Helper { public static void WriteMessage() { - Console.WriteLine("This string came from AuxLibrary!"); + Console.WriteLine(""This string came from AuxLibrary!""); } } } - """; + "; var mainLibraryProject = new TestProject("MainLibrary") { @@ -123,7 +123,7 @@ public static void WriteMessage() TargetFrameworkVersion = targetFrameworkVersion }; mainLibraryProject.ReferencedProjects.Add(auxLibraryProject); - mainLibraryProject.SourceFiles["Helper.cs"] = """ + mainLibraryProject.SourceFiles["Helper.cs"] = @" using System; namespace MainLibrary @@ -132,12 +132,12 @@ public static class Helper { public static void WriteMessage() { - Console.WriteLine("This string came from MainLibrary!"); + Console.WriteLine(""This string came from MainLibrary!""); AuxLibrary.Helper.WriteMessage(); } } } - """; + "; var testAppProject = new TestProject("TestApp") { @@ -146,7 +146,7 @@ public static void WriteMessage() }; testAppProject.AdditionalProperties["ProduceReferenceAssembly"] = "false"; testAppProject.ReferencedProjects.Add(mainLibraryProject); - testAppProject.SourceFiles["Program.cs"] = """ + testAppProject.SourceFiles["Program.cs"] = @" using System; namespace TestApp @@ -155,12 +155,12 @@ public class Program { public static void Main(string[] args) { - Console.WriteLine("TestApp --depends on--> MainLibrary --depends on--> AuxLibrary"); + Console.WriteLine(""TestApp --depends on--> MainLibrary --depends on--> AuxLibrary""); MainLibrary.Helper.WriteMessage(); } } } - """; + "; return testAppProject; } From 6fa351518c3becff75afad7290b11158433b352a Mon Sep 17 00:00:00 2001 From: Marc Paine Date: Mon, 21 Nov 2022 17:25:51 -0800 Subject: [PATCH 8/9] Pass the test when running using the 6.0 SDK against 17.4.0 or higher. This should not flow to 7.0.1xx --- .../GivenThatWeWantToBuildASelfContainedApp.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildASelfContainedApp.cs b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildASelfContainedApp.cs index 68c9dc91114c..83341f2cda5e 100644 --- a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildASelfContainedApp.cs +++ b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildASelfContainedApp.cs @@ -353,6 +353,12 @@ static int Last2DigitsTo0(int versionBuild) [InlineData("net6.0")] public void It_can_publish_runtime_specific_apps_with_library_dependencies_self_contained(string targetFramework) { + // There's a bug when using the 6.0 SDK with 17.4 but we have limited control over the VS version used in helix + Version.TryParse(TestContext.Current.ToolsetUnderTest.MSBuildVersion, out Version msbuildVersion); + Version.TryParse("17.4.0", out Version maximumVersion); + if (msbuildVersion >= maximumVersion) + return; + // create a basic library and a basic app, reference the library from the app and then // publish the app with a RID specified and self-contained. // verify that no warnings about missing the --self-contained flag are emitted. From 2fc0b9c302d72dc2dfd2157480afc9093913a34b Mon Sep 17 00:00:00 2001 From: vseanreesermsft <78103370+vseanreesermsft@users.noreply.github.com> Date: Tue, 29 Nov 2022 14:10:44 -0800 Subject: [PATCH 9/9] Update branding to 6.0.405 (#29286) --- eng/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index dfea3fd0bcdd..3800d98aab79 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -10,7 +10,7 @@ - 6.0.404 + 6.0.405 servicing true