diff --git a/NuGet.Config b/NuGet.Config index 41c0ecd6d8..ab6af752a0 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -4,6 +4,5 @@ - diff --git a/build.cake b/build.cake index 412337aa43..0623dfff6b 100644 --- a/build.cake +++ b/build.cake @@ -336,6 +336,40 @@ Task("CreateMSBuildFolder") CopyDotNetHostResolver(env, "linux", "x64", "libhostfxr.so", sdkResolverTargetFolder, copyToArchSpecificFolder: false); } + // Copy content of NuGet.Build.Tasks + var nugetBuildTasksFolder = CombinePaths(env.Folders.Tools, "NuGet.Build.Tasks"); + var nugetBuildTasksBinariesFolder = CombinePaths(nugetBuildTasksFolder, "lib", "net46"); + var nugetBuildTasksTargetsFolder = CombinePaths(nugetBuildTasksFolder, "runtimes", "any", "native"); + + FileHelper.Copy( + source: CombinePaths(nugetBuildTasksBinariesFolder, "NuGet.Build.Tasks.dll"), + destination: CombinePaths(msbuild15BinTargetFolder, "NuGet.Build.Tasks.dll")); + + FileHelper.Copy( + source: CombinePaths(nugetBuildTasksTargetsFolder, "NuGet.targets"), + destination: CombinePaths(msbuild15BinTargetFolder, "NuGet.targets")); + + // Copy dependencies of NuGet.Build.Tasks + var nugetPackages = new [] + { + "NuGet.Commands", + "NuGet.Common", + "NuGet.Configuration", + "NuGet.Frameworks", + "NuGet.ProjectModel", + "NuGet.Protocol", + "NuGet.Versioning" + }; + + foreach (var nugetPackage in nugetPackages) + { + var binaryName = nugetPackage + ".dll"; + + FileHelper.Copy( + source: CombinePaths(env.Folders.Tools, nugetPackage, "lib", "net46", binaryName), + destination: CombinePaths(msbuild15BinTargetFolder, binaryName)); + } + // Copy content of Microsoft.Net.Compilers Information("Copying Microsoft.Net.Compilers..."); var compilersSourceFolder = CombinePaths(env.Folders.Tools, "Microsoft.Net.Compilers", "tools"); @@ -632,8 +666,11 @@ Task("Test") else { // Copy the Mono-built Microsoft.Build.* binaries to the test folder. + // This is necessary to work around a Mono bug that is exasperated by xUnit. DirectoryHelper.Copy($"{env.Folders.MonoMSBuildLib}", instanceFolder); + DeleteUnnecessaryAssemblies(instanceFolder); + var runScript = CombinePaths(env.Folders.Mono, "run"); // By default, the run script launches OmniSharp. To launch our Mono runtime @@ -649,6 +686,25 @@ Task("Test") } }); +/// +/// Delete assemblies that are included in our Mono package. +/// +void DeleteUnnecessaryAssemblies(string folder) +{ + FileHelper.Delete(CombinePaths(folder, "System.AppContext.dll")); + FileHelper.Delete(CombinePaths(folder, "System.Numerics.Vectors.dll")); + FileHelper.Delete(CombinePaths(folder, "System.Runtime.InteropServices.RuntimeInformation.dll")); + FileHelper.Delete(CombinePaths(folder, "System.ComponentModel.Primitives.dll")); + FileHelper.Delete(CombinePaths(folder, "System.ComponentModel.TypeConverter.dll")); + FileHelper.Delete(CombinePaths(folder, "System.Console.dll")); + FileHelper.Delete(CombinePaths(folder, "System.IO.FileSystem.Primitives.dll")); + FileHelper.Delete(CombinePaths(folder, "System.IO.FileSystem.dll")); + FileHelper.Delete(CombinePaths(folder, "System.Security.Cryptography.Encoding.dll")); + FileHelper.Delete(CombinePaths(folder, "System.Security.Cryptography.Primitives.dll")); + FileHelper.Delete(CombinePaths(folder, "System.Security.Cryptography.X509Certificates.dll")); + FileHelper.Delete(CombinePaths(folder, "System.Threading.Thread.dll")); +} + void CopyMonoBuild(BuildEnvironment env, string sourceFolder, string outputFolder) { DirectoryHelper.Copy(sourceFolder, outputFolder, copySubDirectories: false); @@ -657,18 +713,7 @@ void CopyMonoBuild(BuildEnvironment env, string sourceFolder, string outputFolde DirectoryHelper.Copy($"{env.Folders.MSBuild}", CombinePaths(outputFolder, "msbuild")); // Included in Mono - FileHelper.Delete(CombinePaths(outputFolder, "System.AppContext.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.Numerics.Vectors.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.Runtime.InteropServices.RuntimeInformation.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.ComponentModel.Primitives.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.ComponentModel.TypeConverter.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.Console.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.IO.FileSystem.Primitives.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.IO.FileSystem.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.Security.Cryptography.Encoding.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.Security.Cryptography.Primitives.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.Security.Cryptography.X509Certificates.dll")); - FileHelper.Delete(CombinePaths(outputFolder, "System.Threading.Thread.dll")); + DeleteUnnecessaryAssemblies(outputFolder); } string PublishMonoBuild(string project, BuildEnvironment env, BuildPlan plan, string configuration) diff --git a/build.json b/build.json index 6c46a1920c..d5ec7b24df 100644 --- a/build.json +++ b/build.json @@ -12,8 +12,8 @@ "MonoRuntimeLinux32": "mono.linux-x86-5.10.1.20.zip", "MonoRuntimeLinux64": "mono.linux-x86_64-5.10.1.20.zip", "MonoFramework": "framework-5.10.1.20.zip", - "MonoMSBuildRuntime": "Microsoft.Build.Runtime.Mono-alpha6.zip", - "MonoMSBuildLib": "Microsoft.Build.Lib.Mono-alpha6.zip", + "MonoMSBuildRuntime": "Microsoft.Build.Runtime.Mono-mono-5.10.1.20.zip", + "MonoMSBuildLib": "Microsoft.Build.Lib.Mono-mono-5.10.1.20.zip", "HostProjects": [ "OmniSharp.Stdio", "OmniSharp.Http" diff --git a/build/Packages.props b/build/Packages.props index 31dfa036e8..d0376c7830 100644 --- a/build/Packages.props +++ b/build/Packages.props @@ -9,10 +9,10 @@ 1.1.0 1.1.0 1.1.0 - 15.3.409 - 15.3.409 - 15.3.409 - 15.3.409 + 15.6.82 + 15.6.82 + 15.6.82 + 15.6.82 2.7.0 2.7.0 2.7.0 diff --git a/src/OmniSharp.Host/MSBuild/Discovery/Providers/StandAloneInstanceProvider.cs b/src/OmniSharp.Host/MSBuild/Discovery/Providers/StandAloneInstanceProvider.cs index f0cb645681..e7cf7be033 100644 --- a/src/OmniSharp.Host/MSBuild/Discovery/Providers/StandAloneInstanceProvider.cs +++ b/src/OmniSharp.Host/MSBuild/Discovery/Providers/StandAloneInstanceProvider.cs @@ -30,19 +30,29 @@ public override ImmutableArray GetInstances() var propertyOverrides = ImmutableDictionary.CreateBuilder(StringComparer.OrdinalIgnoreCase); - // To better support older versions of Mono that don't include - // MSBuild 15, we attempt to set property overrides to the locations - // of Mono's 'xbuild' and 'xbuild-frameworks' paths. - if (_allowMonoPaths && PlatformHelper.IsMono) + if (PlatformHelper.IsMono) { - if (TryGetMonoXBuildPath(out var xbuildPath)) + // This disables a hack in the "GetReferenceAssemblyPaths" task which attempts + // guarantee that .NET Framework SP1 is installed when the target framework is + // .NET Framework, but the version is less than 4.0. The hack attempts to locate + // a particular assembly in the GAC as a "guarantee". However, we don't include that + // in our Mono package. So, we'll just bypass the check. + propertyOverrides.Add("BypassFrameworkInstallChecks", "true"); + + // To better support older versions of Mono that don't include + // MSBuild 15, we attempt to set property overrides to the locations + // of Mono's 'xbuild' and 'xbuild-frameworks' paths. + if (_allowMonoPaths) { - extensionsPath = xbuildPath; - } - - if (TryGetMonoXBuildFrameworksPath(out var xbuildFrameworksPath)) - { - propertyOverrides.Add("TargetFrameworkRootPath", xbuildFrameworksPath); + if (TryGetMonoXBuildPath(out var xbuildPath)) + { + extensionsPath = xbuildPath; + } + + if (TryGetMonoXBuildFrameworksPath(out var xbuildFrameworksPath)) + { + propertyOverrides.Add("TargetFrameworkRootPath", xbuildFrameworksPath); + } } } diff --git a/src/OmniSharp.MSBuild/ProjectFile/PropertyNames.cs b/src/OmniSharp.MSBuild/ProjectFile/PropertyNames.cs index 572036a5fd..2de1455018 100644 --- a/src/OmniSharp.MSBuild/ProjectFile/PropertyNames.cs +++ b/src/OmniSharp.MSBuild/ProjectFile/PropertyNames.cs @@ -7,6 +7,7 @@ internal static class PropertyNames public const string AssemblyOriginatorKeyFile = nameof(AssemblyOriginatorKeyFile); public const string BuildProjectReferences = nameof(BuildProjectReferences); public const string BuildingInsideVisualStudio = nameof(BuildingInsideVisualStudio); + public const string BypassFrameworkInstallChecks = nameof(BypassFrameworkInstallChecks); public const string Configuration = nameof(Configuration); public const string CscToolExe = nameof(CscToolExe); public const string CscToolPath = nameof(CscToolPath); diff --git a/src/OmniSharp.MSBuild/ProjectLoader.cs b/src/OmniSharp.MSBuild/ProjectLoader.cs index c494f9a5a3..dd16de599c 100644 --- a/src/OmniSharp.MSBuild/ProjectLoader.cs +++ b/src/OmniSharp.MSBuild/ProjectLoader.cs @@ -52,6 +52,11 @@ private static Dictionary CreateGlobalProperties( globalProperties.AddPropertyOverride(PropertyNames.Configuration, options.Configuration, propertyOverrides, logger); globalProperties.AddPropertyOverride(PropertyNames.Platform, options.Platform, propertyOverrides, logger); + if (propertyOverrides.TryGetValue(PropertyNames.BypassFrameworkInstallChecks, out var value)) + { + globalProperties.Add(PropertyNames.BypassFrameworkInstallChecks, value); + } + return globalProperties; } diff --git a/tools/packages.config b/tools/packages.config index 2333d9e0d5..4f4744db46 100644 --- a/tools/packages.config +++ b/tools/packages.config @@ -1,13 +1,21 @@ - - - - - - + + + + + + + + + + + + + +