diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index dadff82e2183..2a7617e6e8f6 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -45,9 +45,9 @@ https://github.com/dotnet/fsharp 66042d33b998a180edbd99af6064da85f8977bf3 - + https://github.com/dotnet/roslyn - 598796cd274b852b5be35398133516e19f543744 + f96dcbb6597fcc801970ee09688e733b64ce9040 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index da4819e3bc73..61f0a490b154 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -111,7 +111,7 @@ - 3.7.0-5.20365.2 + 3.7.0-5.20367.1 diff --git a/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstRunConfiguration.cs b/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstRunConfiguration.cs index f45b6adf6a4e..0e621828db4c 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstRunConfiguration.cs +++ b/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstRunConfiguration.cs @@ -8,16 +8,21 @@ public class DotnetFirstRunConfiguration public bool GenerateAspNetCertificate { get; } public bool TelemetryOptout { get; } + public bool AddGlobalToolsToPath { get; } + public bool NoLogo { get; } + public DotnetFirstRunConfiguration( bool generateAspNetCertificate, bool telemetryOptout, - bool addGlobalToolsToPath) + bool addGlobalToolsToPath, + bool nologo) { GenerateAspNetCertificate = generateAspNetCertificate; TelemetryOptout = telemetryOptout; AddGlobalToolsToPath = addGlobalToolsToPath; + NoLogo = nologo; } } } diff --git a/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs b/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs index c299d57de994..bfa1b09d455b 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs +++ b/src/Cli/Microsoft.DotNet.Configurer/DotnetFirstTimeUseConfigurer.cs @@ -50,13 +50,17 @@ public void Configure() if (ShouldPrintFirstTimeUseNotice()) { - PrintFirstTimeMessageWelcome(); - if (ShouldPrintTelemetryMessageWhenFirstTimeUseNoticeIsEnabled()) + if (!_dotnetFirstRunConfiguration.NoLogo) { - PrintTelemetryMessage(); + PrintFirstTimeMessageWelcome(); + if (ShouldPrintTelemetryMessageWhenFirstTimeUseNoticeIsEnabled()) + { + PrintTelemetryMessage(); + } + + PrintFirstTimeMessageMoreInformation(); } - PrintFirstTimeMessageMoreInformation(); _firstTimeUseNoticeSentinel.CreateIfNotExists(); } diff --git a/src/Cli/dotnet/Program.cs b/src/Cli/dotnet/Program.cs index 2f7a7133b528..e4b1f369102c 100644 --- a/src/Cli/dotnet/Program.cs +++ b/src/Cli/dotnet/Program.cs @@ -148,6 +148,8 @@ internal static int ProcessArgs(string[] args, ITelemetry telemetryClient = null environmentProvider.GetEnvironmentVariableAsBool("DOTNET_CLI_TELEMETRY_OPTOUT", defaultValue: false); bool addGlobalToolsToPath = environmentProvider.GetEnvironmentVariableAsBool("DOTNET_ADD_GLOBAL_TOOLS_TO_PATH", defaultValue: true); + bool nologo = + environmentProvider.GetEnvironmentVariableAsBool("DOTNET_NOLOGO", defaultValue: false); ReportDotnetHomeUsage(environmentProvider); @@ -158,13 +160,14 @@ internal static int ProcessArgs(string[] args, ITelemetry telemetryClient = null aspNetCertificateSentinel = new NoOpAspNetCertificateSentinel(); firstTimeUseNoticeSentinel = new NoOpFirstTimeUseNoticeSentinel(); toolPathSentinel = new NoOpFileSentinel(exists: false); - isDotnetBeingInvokedFromNativeInstaller = true; + isDotnetBeingInvokedFromNativeInstaller = true; } var dotnetFirstRunConfiguration = new DotnetFirstRunConfiguration( generateAspNetCertificate: generateAspNetCertificate, telemetryOptout: telemetryOptout, - addGlobalToolsToPath: addGlobalToolsToPath); + addGlobalToolsToPath: addGlobalToolsToPath, + nologo: nologo); ConfigureDotNetForFirstTimeUse( firstTimeUseNoticeSentinel, diff --git a/src/Cli/dotnet/commands/dotnet-nuget/NuGetCommandParser.cs b/src/Cli/dotnet/commands/dotnet-nuget/NuGetCommandParser.cs index bd9b0aecaced..38b809738e64 100644 --- a/src/Cli/dotnet/commands/dotnet-nuget/NuGetCommandParser.cs +++ b/src/Cli/dotnet/commands/dotnet-nuget/NuGetCommandParser.cs @@ -54,7 +54,8 @@ public static Command NuGet() => Create.Option("-d|--disable-buffering", Parser.CompletionOnlyDescription), Create.Option("-n|--no-symbols", Parser.CompletionOnlyDescription), Create.Option("--no-service-endpoint", Parser.CompletionOnlyDescription), - Create.Option("--interactive", Parser.CompletionOnlyDescription) + Create.Option("--interactive", Parser.CompletionOnlyDescription), + Create.Option("--skip-duplicate", Parser.CompletionOnlyDescription) )); } } diff --git a/src/Layout/redist/minimumMSBuildVersion b/src/Layout/redist/minimumMSBuildVersion index 28ebe8b4dbed..2e4239c31313 100644 --- a/src/Layout/redist/minimumMSBuildVersion +++ b/src/Layout/redist/minimumMSBuildVersion @@ -1 +1 @@ -16.5.0 +16.7.0 diff --git a/src/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj b/src/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj index 892eb0dafa0b..e543d26c8d17 100644 --- a/src/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj +++ b/src/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj @@ -8,6 +8,8 @@ true MicrosoftAspNetCore true + + true 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 cb0d6cbffdf1..66f66638f869 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 @@ -450,6 +450,7 @@ Copyright (c) .NET Foundation. All rights reserved. _ComputeResolvedFilesToPublishTypes Splits ResolvedFileToPublish items into 'PreserveNewest' and 'Always' buckets. + Then further splits those into 'Unbundled' buckets based on the single file setting. ============================================================ --> @@ -461,6 +462,19 @@ Copyright (c) .NET Foundation. All rights reserved. <_ResolvedFileToPublishAlways Include="@(ResolvedFileToPublish)" Condition="'%(ResolvedFileToPublish.CopyToPublishDirectory)'=='Always'" /> + + + + <_ResolvedUnbundledFileToPublishPreserveNewest + Include="@(_ResolvedFileToPublishPreserveNewest)" + Condition="'$(PublishSingleFile)' != 'true' or + '%(_ResolvedFileToPublishPreserveNewest.ExcludeFromSingleFile)'=='true'" /> + + <_ResolvedUnbundledFileToPublishAlways + Include="@(_ResolvedFileToPublishAlways)" + Condition="'$(PublishSingleFile)' != 'true' or + '%(_ResolvedFileToPublishAlways.ExcludeFromSingleFile)'=='true'" /> + - @(ReferenceComWrappersToCopyLocal->'%(Filename)%(Extension)') + %(Filename)%(Extension) PreserveNewest @@ -1112,7 +1126,7 @@ Copyright (c) .NET Foundation. All rights reserved. ============================================================ ComputeFilesCopiedToPublishDir - Gathers all the files that were copied to the publish directory. This is used by wapproj and is required for back compat. + Gathers all the files that will be copied to the publish directory. This is used by wapproj and is required for back compat. ============================================================ --> p.GetEnvironmentVariableAsBool("DOTNET_GENERATE_ASPNET_CERTIFICATE", It.IsAny())) - .Returns(DOTNET_GENERATE_ASPNET_CERTIFICATE); + .Setup(p => p.GetEnvironmentVariableAsBool("DOTNET_GENERATE_ASPNET_CERTIFICATE", It.IsAny())) + .Returns(DOTNET_GENERATE_ASPNET_CERTIFICATE); _environmentProvider .Setup(p => p.GetEnvironmentVariableAsBool("DOTNET_CLI_TELEMETRY_OPTOUT", It.IsAny())) .Returns(DOTNET_CLI_TELEMETRY_OPTOUT); + _environmentProvider + .Setup(p => p.GetEnvironmentVariableAsBool("DOTNET_NOLOGO", It.IsAny())) + .Returns(DOTNET_NOLOGO); _environmentProvider .Setup(p => p.GetEnvironmentVariableAsBool("DOTNET_ADD_GLOBAL_TOOLS_TO_PATH", It.IsAny())) .Returns(true); @@ -206,6 +218,8 @@ private Telemetry RunConfigUsingMocks(bool isInstallerRun) _environmentProviderObject.GetEnvironmentVariableAsBool("DOTNET_CLI_TELEMETRY_OPTOUT", false); bool addGlobalToolsToPath = _environmentProviderObject.GetEnvironmentVariableAsBool("DOTNET_ADD_GLOBAL_TOOLS_TO_PATH", defaultValue: true); + bool nologo = + _environmentProviderObject.GetEnvironmentVariableAsBool("DOTNET_NOLOGO", defaultValue: false); IAspNetCertificateSentinel aspNetCertificateSentinel; IFirstTimeUseNoticeSentinel firstTimeUseNoticeSentinel; @@ -233,7 +247,8 @@ private Telemetry RunConfigUsingMocks(bool isInstallerRun) ( generateAspNetCertificate: generateAspNetCertificate, telemetryOptout: telemetryOptout, - addGlobalToolsToPath: addGlobalToolsToPath + addGlobalToolsToPath: addGlobalToolsToPath, + nologo: nologo ), reporter: _reporterMock, cliFallbackFolderPath: CliFallbackFolderPath, diff --git a/src/Tests/Microsoft.NET.Build.Tests/COMReferenceTests.cs b/src/Tests/Microsoft.NET.Build.Tests/COMReferenceTests.cs index 7e61b6162e81..b64769c78fa2 100644 --- a/src/Tests/Microsoft.NET.Build.Tests/COMReferenceTests.cs +++ b/src/Tests/Microsoft.NET.Build.Tests/COMReferenceTests.cs @@ -19,60 +19,44 @@ public COMReferenceTests(ITestOutputHelper log) : base(log) { } - [FullMSBuildOnlyTheory(Skip ="Too much dependency on build machine state.")] + [FullMSBuildOnlyTheory()] [InlineData(true)] [InlineData(false)] public void COMReferenceBuildsAndRuns(bool embedInteropTypes) { var targetFramework = "netcoreapp3.0"; - var testProject = new TestProject { - Name = "UseMediaPlayer", + Name = "UseComReferences", IsSdkProject = true, TargetFrameworks = targetFramework, IsExe = true, SourceFiles = { ["Program.cs"] = @" - using MediaPlayer; class Program { static void Main(string[] args) { - var mediaPlayer = (IMediaPlayer2)new MediaPlayerClass(); + System.Console.WriteLine(typeof(VSLangProj.VSProject)); } } ", } }; - if (embedInteropTypes) - { - testProject.SourceFiles.Add("MediaPlayerClass.cs", @" - using System.Runtime.InteropServices; - namespace MediaPlayer - { - [ComImport] - [Guid(""22D6F312-B0F6-11D0-94AB-0080C74C7E95"")] - class MediaPlayerClass { } - } - "); - } - var reference = new XElement("ItemGroup", new XElement("COMReference", - new XAttribute("Include", "MediaPlayer.dll"), - new XElement("Guid", "22d6f304-b0f6-11d0-94ab-0080c74c7e95"), - new XElement("VersionMajor", "1"), + new XAttribute("Include", "VSLangProj.dll"), + new XElement("Guid", "49a1950e-3e35-4595-8cb9-920c64c44d67"), + new XElement("VersionMajor", "7"), new XElement("VersionMinor", "0"), new XElement("WrapperTool", "tlbimp"), new XElement("Lcid", "0"), new XElement("Isolated", "false"), new XElement("EmbedInteropTypes", embedInteropTypes))); - var testAsset = _testAssetsManager .CreateTestProject(testProject, identifier: embedInteropTypes.ToString()) .WithProjectChanges(doc => doc.Root.Add(reference)); @@ -81,8 +65,79 @@ class MediaPlayerClass { } buildCommand.Execute().Should().Pass(); var outputDirectory = buildCommand.GetOutputDirectory(targetFramework); - var runCommand = new RunExeCommand(Log, outputDirectory.File("UseMediaPlayer.exe").FullName); + var runCommand = new RunExeCommand(Log, outputDirectory.File("UseComReferences.exe").FullName); runCommand.Execute().Should().Pass(); } + + [FullMSBuildOnlyFact] + public void COMReferenceProperlyPublish() + { + var targetFramework = "netcoreapp3.0"; + + var testProject = new TestProject + { + Name = "MultiComReference", + IsSdkProject = true, + TargetFrameworks = targetFramework, + IsExe = true, + SourceFiles = + { + ["Program.cs"] = @" + class Program + { + static void Main(string[] args) + { + } + } + " + } + }; + + var vslangProj70ComRef = "VSLangProj.dll"; + var reference1 = new XElement("ItemGroup", + new XElement("COMReference", + new XAttribute("Include", vslangProj70ComRef), + new XElement("Guid", "49a1950e-3e35-4595-8cb9-920c64c44d67"), + new XElement("VersionMajor", "7"), + new XElement("VersionMinor", "0"), + new XElement("WrapperTool", "tlbimp"), + new XElement("Lcid", "0"), + new XElement("Isolated", "false"), + new XElement("EmbedInteropTypes", "false"))); + + var vslangProj80ComRef = "VSLangProj80.dll"; + var reference2 = new XElement("ItemGroup", + new XElement("COMReference", + new XAttribute("Include", vslangProj80ComRef), + new XElement("Guid", "307953c0-7973-490a-a4a7-25999e023be8"), + new XElement("VersionMajor", "8"), + new XElement("VersionMinor", "0"), + new XElement("WrapperTool", "tlbimp"), + new XElement("Lcid", "0"), + new XElement("Isolated", "false"), + new XElement("EmbedInteropTypes", "false"))); + + var testAsset = _testAssetsManager + .CreateTestProject(testProject) + .WithProjectChanges(doc => doc.Root.Add(new[] { reference1, reference2 })); + + var buildCommand = new BuildCommand(Log, Path.Combine(testAsset.TestRoot, testProject.Name)); + buildCommand.Execute().Should().Pass(); + + var outputDirectory = buildCommand.GetOutputDirectory(targetFramework); + + // COM References by default adds the 'Interop.' prefix. + Assert.True(outputDirectory.File($"Interop.{vslangProj70ComRef}").Exists); + Assert.True(outputDirectory.File($"Interop.{vslangProj80ComRef}").Exists); + + var publishCommand = new PublishCommand(Log, Path.Combine(testAsset.TestRoot, testProject.Name)); + publishCommand.Execute().Should().Pass(); + + outputDirectory = publishCommand.GetOutputDirectory(targetFramework); + + // COM References by default adds the 'Interop.' prefix. + Assert.True(outputDirectory.File($"Interop.{vslangProj70ComRef}").Exists); + Assert.True(outputDirectory.File($"Interop.{vslangProj80ComRef}").Exists); + } } } diff --git a/src/Tests/dotnet.Tests/CommandTests/CompleteCommandTests.cs b/src/Tests/dotnet.Tests/CommandTests/CompleteCommandTests.cs index f5632991930b..b01b7f1dfea2 100644 --- a/src/Tests/dotnet.Tests/CommandTests/CompleteCommandTests.cs +++ b/src/Tests/dotnet.Tests/CommandTests/CompleteCommandTests.cs @@ -184,6 +184,7 @@ public void GivenNuGetPushCommandItDisplaysCompletions() "--help", "--no-service-endpoint", "--no-symbols", + "--skip-duplicate", "--source", "--symbol-api-key", "--symbol-source",