diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs index e3050b3fb88..96b59eec7eb 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs @@ -96,6 +96,21 @@ public void BuildBasicApplication ([Values (true, false)] bool isRelease, [Value } } + [Test] + public void BuildWithMSBuildExe ([Values (true, false)] bool isRelease) + { + if (!IsWindows) + Assert.Ignore ("Test is only valid on Windows"); + + var proj = new XamarinAndroidApplicationProject { + IsRelease = isRelease, + }; + + using var b = CreateApkBuilder (); + b.UseMSBuildExe = true; + Assert.IsTrue (b.Build (proj), "Build should have succeeded."); + } + [Test] public void BuildBasicApplicationThenMoveIt ([Values (true, false)] bool isRelease) { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs index c583e2b6192..02952895b87 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs @@ -9,6 +9,7 @@ using System.Threading; using System.Xml.XPath; using System.Xml.Linq; +using Xamarin.Android.Tools.VSWhere; namespace Xamarin.ProjectTools { @@ -142,6 +143,22 @@ public Builder () BuildLogFile = "build.log"; } + /// + /// Build with MSBuild.exe from Visual Studio, only works on Windows + /// + public bool UseMSBuildExe { get; set; } + + /// + /// Value for %MSBuildSdksPath%, points to bin\Release\dotnet\sdk\*\Sdks + /// + public string MSBuildSdksPath { + get { + var sdk = Path.Combine (TestEnvironment.DotNetPreviewDirectory, "sdk"); + var sdk_version = Directory.EnumerateDirectories (sdk).OrderByDescending (x => x).First (); + return Path.Combine (sdk_version, "Sdks"); + } + } + public void Dispose () { Dispose (true); @@ -173,9 +190,20 @@ protected bool BuildInternal (string projectOrSolution, string target, string [] var start = DateTime.UtcNow; var args = new StringBuilder (); - var psi = new ProcessStartInfo (Path.Combine (TestEnvironment.DotNetPreviewDirectory, "dotnet")); + var psi = new ProcessStartInfo (); var responseFile = Path.Combine (XABuildPaths.TestOutputDirectory, Path.GetDirectoryName (projectOrSolution), "project.rsp"); - args.Append ("build "); + if (UseMSBuildExe) { + psi.FileName = MSBuildLocator.QueryLatest ().MSBuildPath; + args.Append ("/restore "); + psi.SetEnvironmentVariable ("DOTNETSDK_WORKLOAD_PACK_ROOTS", Path.Combine (TestEnvironment.DotNetPreviewDirectory, "packs")); + psi.SetEnvironmentVariable ("DOTNETSDK_WORKLOAD_MANIFEST_ROOTS", Path.Combine (TestEnvironment.DotNetPreviewDirectory, "sdk-manifests")); + psi.SetEnvironmentVariable ("MSBUILDLOGALLENVIRONMENTVARIABLES", "1"); + psi.SetEnvironmentVariable ("MSBuildSDKsPath", MSBuildSdksPath); + psi.SetEnvironmentVariable ("PATH", TestEnvironment.DotNetPreviewDirectory + Path.PathSeparator + Environment.GetEnvironmentVariable ("PATH")); + } else { + psi.FileName = Path.Combine (TestEnvironment.DotNetPreviewDirectory, "dotnet"); + args.Append ("build "); + } if (TestEnvironment.UseLocalBuildOutput) { psi.SetEnvironmentVariable ("DOTNETSDK_WORKLOAD_MANIFEST_ROOTS", TestEnvironment.WorkloadManifestOverridePath);