|
|
@ -13,6 +13,7 @@ using Nuke.Common.Tooling; |
|
|
using Nuke.Common.Tools.DotNet; |
|
|
using Nuke.Common.Tools.DotNet; |
|
|
using Nuke.Common.Tools.MSBuild; |
|
|
using Nuke.Common.Tools.MSBuild; |
|
|
using Nuke.Common.Utilities; |
|
|
using Nuke.Common.Utilities; |
|
|
|
|
|
using Nuke.Common.Utilities.Collections; |
|
|
using static Nuke.Common.EnvironmentInfo; |
|
|
using static Nuke.Common.EnvironmentInfo; |
|
|
using static Nuke.Common.IO.FileSystemTasks; |
|
|
using static Nuke.Common.IO.FileSystemTasks; |
|
|
using static Nuke.Common.IO.PathConstruction; |
|
|
using static Nuke.Common.IO.PathConstruction; |
|
|
@ -26,11 +27,13 @@ using static Nuke.Common.Tools.VSWhere.VSWhereTasks; |
|
|
running and debugging a particular target (optionally without deps) would be way easier |
|
|
running and debugging a particular target (optionally without deps) would be way easier |
|
|
ReSharper/Rider - https://plugins.jetbrains.com/plugin/10803-nuke-support
|
|
|
ReSharper/Rider - https://plugins.jetbrains.com/plugin/10803-nuke-support
|
|
|
VSCode - https://marketplace.visualstudio.com/items?itemName=nuke.support
|
|
|
VSCode - https://marketplace.visualstudio.com/items?itemName=nuke.support
|
|
|
|
|
|
|
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
partial class Build : NukeBuild |
|
|
partial class Build : NukeBuild |
|
|
{ |
|
|
{ |
|
|
|
|
|
[Solution("Avalonia.sln")] readonly Solution Solution; |
|
|
|
|
|
|
|
|
static Lazy<string> MsBuildExe = new Lazy<string>(() => |
|
|
static Lazy<string> MsBuildExe = new Lazy<string>(() => |
|
|
{ |
|
|
{ |
|
|
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) |
|
|
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) |
|
|
@ -54,7 +57,7 @@ partial class Build : NukeBuild |
|
|
protected override void OnBuildInitialized() |
|
|
protected override void OnBuildInitialized() |
|
|
{ |
|
|
{ |
|
|
Parameters = new BuildParameters(this); |
|
|
Parameters = new BuildParameters(this); |
|
|
Information("Building version {0} of Avalonia ({1}) using version {2} of Nuke.", |
|
|
Information("Building version {0} of Avalonia ({1}) using version {2} of Nuke.", |
|
|
Parameters.Version, |
|
|
Parameters.Version, |
|
|
Parameters.Configuration, |
|
|
Parameters.Configuration, |
|
|
typeof(NukeBuild).Assembly.GetName().Version.ToString()); |
|
|
typeof(NukeBuild).Assembly.GetName().Version.ToString()); |
|
|
@ -93,29 +96,24 @@ partial class Build : NukeBuild |
|
|
string projectFile, |
|
|
string projectFile, |
|
|
Configure<MSBuildSettings> configurator = null) |
|
|
Configure<MSBuildSettings> configurator = null) |
|
|
{ |
|
|
{ |
|
|
return MSBuild(projectFile, c => |
|
|
return MSBuild(c => c |
|
|
{ |
|
|
.SetProjectFile(projectFile) |
|
|
// This is required for VS2019 image on Azure Pipelines
|
|
|
// This is required for VS2019 image on Azure Pipelines
|
|
|
if (Parameters.IsRunningOnWindows && Parameters.IsRunningOnAzure) |
|
|
.When(Parameters.IsRunningOnWindows && |
|
|
{ |
|
|
Parameters.IsRunningOnAzure, c => c |
|
|
var javaSdk = Environment.GetEnvironmentVariable("JAVA_HOME_8_X64"); |
|
|
.AddProperty("JavaSdkDirectory", GetVariable<string>("JAVA_HOME_8_X64"))) |
|
|
if (javaSdk != null) |
|
|
.AddProperty("PackageVersion", Parameters.Version) |
|
|
c = c.AddProperty("JavaSdkDirectory", javaSdk); |
|
|
.AddProperty("iOSRoslynPathHackRequired", true) |
|
|
} |
|
|
.SetToolPath(MsBuildExe.Value) |
|
|
|
|
|
.SetConfiguration(Parameters.Configuration) |
|
|
c = c.AddProperty("PackageVersion", Parameters.Version) |
|
|
.SetVerbosity(MSBuildVerbosity.Minimal) |
|
|
.AddProperty("iOSRoslynPathHackRequired", "true") |
|
|
.Apply(configurator)); |
|
|
.SetToolPath(MsBuildExe.Value) |
|
|
|
|
|
.SetConfiguration(Parameters.Configuration) |
|
|
|
|
|
.SetVerbosity(MSBuildVerbosity.Minimal); |
|
|
|
|
|
c = configurator?.Invoke(c) ?? c; |
|
|
|
|
|
return c; |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Target Clean => _ => _.Executes(() => |
|
|
Target Clean => _ => _.Executes(() => |
|
|
{ |
|
|
{ |
|
|
DeleteDirectories(Parameters.BuildDirs); |
|
|
Parameters.BuildDirs.ForEach(DeleteDirectory); |
|
|
EnsureCleanDirectories(Parameters.BuildDirs); |
|
|
Parameters.BuildDirs.ForEach(EnsureCleanDirectory); |
|
|
EnsureCleanDirectory(Parameters.ArtifactsDir); |
|
|
EnsureCleanDirectory(Parameters.ArtifactsDir); |
|
|
EnsureCleanDirectory(Parameters.NugetIntermediateRoot); |
|
|
EnsureCleanDirectory(Parameters.NugetIntermediateRoot); |
|
|
EnsureCleanDirectory(Parameters.NugetRoot); |
|
|
EnsureCleanDirectory(Parameters.NugetRoot); |
|
|
@ -134,97 +132,84 @@ partial class Build : NukeBuild |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
else |
|
|
else |
|
|
DotNetBuild(Parameters.MSBuildSolution, c => c |
|
|
DotNetBuild(c => c |
|
|
|
|
|
.SetProjectFile(Parameters.MSBuildSolution) |
|
|
.AddProperty("PackageVersion", Parameters.Version) |
|
|
.AddProperty("PackageVersion", Parameters.Version) |
|
|
.SetConfiguration(Parameters.Configuration) |
|
|
.SetConfiguration(Parameters.Configuration) |
|
|
); |
|
|
); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
void RunCoreTest(string project) |
|
|
void RunCoreTest(string projectName) |
|
|
{ |
|
|
{ |
|
|
if(!project.EndsWith(".csproj")) |
|
|
Information($"Running tests from {projectName}"); |
|
|
project = System.IO.Path.Combine(project, System.IO.Path.GetFileName(project)+".csproj"); |
|
|
var project = Solution.GetProject(projectName).NotNull("project != null"); |
|
|
Information("Running tests from " + project); |
|
|
|
|
|
XDocument xdoc; |
|
|
foreach (var fw in project.GetTargetFrameworks()) |
|
|
using (var s = File.OpenRead(project)) |
|
|
|
|
|
xdoc = XDocument.Load(s); |
|
|
|
|
|
|
|
|
|
|
|
List<string> frameworks = null; |
|
|
|
|
|
var targets = xdoc.Root.Descendants("TargetFrameworks").FirstOrDefault(); |
|
|
|
|
|
if (targets != null) |
|
|
|
|
|
frameworks = targets.Value.Split(';').Where(f => !string.IsNullOrWhiteSpace(f)).ToList(); |
|
|
|
|
|
else |
|
|
|
|
|
frameworks = new List<string> {xdoc.Root.Descendants("TargetFramework").First().Value}; |
|
|
|
|
|
|
|
|
|
|
|
foreach(var fw in frameworks) |
|
|
|
|
|
{ |
|
|
{ |
|
|
if (fw.StartsWith("net4") |
|
|
if (fw.StartsWith("net4") |
|
|
&& RuntimeInformation.IsOSPlatform(OSPlatform.Linux) |
|
|
&& RuntimeInformation.IsOSPlatform(OSPlatform.Linux) |
|
|
&& Environment.GetEnvironmentVariable("FORCE_LINUX_TESTS") != "1") |
|
|
&& Environment.GetEnvironmentVariable("FORCE_LINUX_TESTS") != "1") |
|
|
{ |
|
|
{ |
|
|
Information($"Skipping {fw} tests on Linux - https://github.com/mono/mono/issues/13969"); |
|
|
Information($"Skipping {projectName} ({fw}) tests on Linux - https://github.com/mono/mono/issues/13969"); |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Information("Running for " + fw); |
|
|
Information($"Running for {projectName} ({fw}) ..."); |
|
|
DotNetTest(c => |
|
|
|
|
|
{ |
|
|
DotNetTest(c => c |
|
|
c = c |
|
|
.SetProjectFile(project) |
|
|
.SetProjectFile(project) |
|
|
.SetConfiguration(Parameters.Configuration) |
|
|
.SetConfiguration(Parameters.Configuration) |
|
|
.SetFramework(fw) |
|
|
.SetFramework(fw) |
|
|
.EnableNoBuild() |
|
|
.EnableNoBuild() |
|
|
.EnableNoRestore() |
|
|
.EnableNoRestore(); |
|
|
.When(Parameters.PublishTestResults, c => c |
|
|
// NOTE: I can see that we could maybe add another extension method "Switch" or "If" to make this more convenient
|
|
|
.SetLogger("trx") |
|
|
if (Parameters.PublishTestResults) |
|
|
.SetResultsDirectory(Parameters.TestResultsRoot))); |
|
|
c = c.SetLogger("trx").SetResultsDirectory(Parameters.TestResultsRoot); |
|
|
|
|
|
return c; |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Target RunCoreLibsTests => _ => _ |
|
|
Target RunCoreLibsTests => _ => _ |
|
|
.OnlyWhen(() => !Parameters.SkipTests) |
|
|
.OnlyWhenStatic(() => !Parameters.SkipTests) |
|
|
.DependsOn(Compile) |
|
|
.DependsOn(Compile) |
|
|
.Executes(() => |
|
|
.Executes(() => |
|
|
{ |
|
|
{ |
|
|
RunCoreTest("./tests/Avalonia.Animation.UnitTests"); |
|
|
RunCoreTest("Avalonia.Animation.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Base.UnitTests"); |
|
|
RunCoreTest("Avalonia.Base.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Controls.UnitTests"); |
|
|
RunCoreTest("Avalonia.Controls.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Controls.DataGrid.UnitTests"); |
|
|
RunCoreTest("Avalonia.Controls.DataGrid.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Input.UnitTests"); |
|
|
RunCoreTest("Avalonia.Input.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Interactivity.UnitTests"); |
|
|
RunCoreTest("Avalonia.Interactivity.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Layout.UnitTests"); |
|
|
RunCoreTest("Avalonia.Layout.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Markup.UnitTests"); |
|
|
RunCoreTest("Avalonia.Markup.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Markup.Xaml.UnitTests"); |
|
|
RunCoreTest("Avalonia.Markup.Xaml.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Styling.UnitTests"); |
|
|
RunCoreTest("Avalonia.Styling.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Visuals.UnitTests"); |
|
|
RunCoreTest("Avalonia.Visuals.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.Skia.UnitTests"); |
|
|
RunCoreTest("Avalonia.Skia.UnitTests"); |
|
|
RunCoreTest("./tests/Avalonia.ReactiveUI.UnitTests"); |
|
|
RunCoreTest("Avalonia.ReactiveUI.UnitTests"); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
Target RunRenderTests => _ => _ |
|
|
Target RunRenderTests => _ => _ |
|
|
.OnlyWhen(() => !Parameters.SkipTests) |
|
|
.OnlyWhenStatic(() => !Parameters.SkipTests) |
|
|
.DependsOn(Compile) |
|
|
.DependsOn(Compile) |
|
|
.Executes(() => |
|
|
.Executes(() => |
|
|
{ |
|
|
{ |
|
|
RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj"); |
|
|
RunCoreTest("Avalonia.Skia.RenderTests"); |
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) |
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) |
|
|
RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj"); |
|
|
RunCoreTest("Avalonia.Direct2D1.RenderTests"); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
Target RunDesignerTests => _ => _ |
|
|
Target RunDesignerTests => _ => _ |
|
|
.OnlyWhen(() => !Parameters.SkipTests && Parameters.IsRunningOnWindows) |
|
|
.OnlyWhenStatic(() => !Parameters.SkipTests && Parameters.IsRunningOnWindows) |
|
|
.DependsOn(Compile) |
|
|
.DependsOn(Compile) |
|
|
.Executes(() => |
|
|
.Executes(() => |
|
|
{ |
|
|
{ |
|
|
RunCoreTest("./tests/Avalonia.DesignerSupport.Tests"); |
|
|
RunCoreTest("Avalonia.DesignerSupport.Tests"); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
[PackageExecutable("JetBrains.dotMemoryUnit", "dotMemoryUnit.exe")] readonly Tool DotMemoryUnit; |
|
|
[PackageExecutable("JetBrains.dotMemoryUnit", "dotMemoryUnit.exe")] readonly Tool DotMemoryUnit; |
|
|
|
|
|
|
|
|
Target RunLeakTests => _ => _ |
|
|
Target RunLeakTests => _ => _ |
|
|
.OnlyWhen(() => !Parameters.SkipTests && Parameters.IsRunningOnWindows) |
|
|
.OnlyWhenStatic(() => !Parameters.SkipTests && Parameters.IsRunningOnWindows) |
|
|
.DependsOn(Compile) |
|
|
.DependsOn(Compile) |
|
|
.Executes(() => |
|
|
.Executes(() => |
|
|
{ |
|
|
{ |
|
|
@ -235,7 +220,7 @@ partial class Build : NukeBuild |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
Target ZipFiles => _ => _ |
|
|
Target ZipFiles => _ => _ |
|
|
.After(CreateNugetPackages, Compile, RunCoreLibsTests, Package) |
|
|
.After(CreateNugetPackages, Compile, RunCoreLibsTests, Package) |
|
|
.Executes(() => |
|
|
.Executes(() => |
|
|
{ |
|
|
{ |
|
|
var data = Parameters; |
|
|
var data = Parameters; |
|
|
@ -259,9 +244,10 @@ partial class Build : NukeBuild |
|
|
MsBuildCommon(Parameters.MSBuildSolution, c => c |
|
|
MsBuildCommon(Parameters.MSBuildSolution, c => c |
|
|
.AddTargets("Pack")); |
|
|
.AddTargets("Pack")); |
|
|
else |
|
|
else |
|
|
DotNetPack(Parameters.MSBuildSolution, c => |
|
|
DotNetPack(c => c |
|
|
c.SetConfiguration(Parameters.Configuration) |
|
|
.SetProject(Parameters.MSBuildSolution) |
|
|
.AddProperty("PackageVersion", Parameters.Version)); |
|
|
.SetConfiguration(Parameters.Configuration) |
|
|
|
|
|
.AddProperty("PackageVersion", Parameters.Version)); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
Target CreateNugetPackages => _ => _ |
|
|
Target CreateNugetPackages => _ => _ |
|
|
@ -274,32 +260,40 @@ partial class Build : NukeBuild |
|
|
new NumergeNukeLogger())) |
|
|
new NumergeNukeLogger())) |
|
|
throw new Exception("Package merge failed"); |
|
|
throw new Exception("Package merge failed"); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
Target RunTests => _ => _ |
|
|
Target RunTests => _ => _ |
|
|
.DependsOn(RunCoreLibsTests) |
|
|
.DependsOn(RunCoreLibsTests) |
|
|
.DependsOn(RunRenderTests) |
|
|
.DependsOn(RunRenderTests) |
|
|
.DependsOn(RunDesignerTests) |
|
|
.DependsOn(RunDesignerTests) |
|
|
.DependsOn(RunLeakTests); |
|
|
.DependsOn(RunLeakTests); |
|
|
|
|
|
|
|
|
Target Package => _ => _ |
|
|
Target Package => _ => _ |
|
|
.DependsOn(RunTests) |
|
|
.DependsOn(RunTests) |
|
|
.DependsOn(CreateNugetPackages); |
|
|
.DependsOn(CreateNugetPackages); |
|
|
|
|
|
|
|
|
Target CiAzureLinux => _ => _ |
|
|
Target CiAzureLinux => _ => _ |
|
|
.DependsOn(RunTests); |
|
|
.DependsOn(RunTests); |
|
|
|
|
|
|
|
|
Target CiAzureOSX => _ => _ |
|
|
Target CiAzureOSX => _ => _ |
|
|
.DependsOn(Package) |
|
|
.DependsOn(Package) |
|
|
.DependsOn(ZipFiles); |
|
|
.DependsOn(ZipFiles); |
|
|
|
|
|
|
|
|
Target CiAzureWindows => _ => _ |
|
|
Target CiAzureWindows => _ => _ |
|
|
.DependsOn(Package) |
|
|
.DependsOn(Package) |
|
|
.DependsOn(ZipFiles); |
|
|
.DependsOn(ZipFiles); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static int Main() => |
|
|
public static int Main() => |
|
|
RuntimeInformation.IsOSPlatform(OSPlatform.Windows) |
|
|
RuntimeInformation.IsOSPlatform(OSPlatform.Windows) |
|
|
? Execute<Build>(x => x.Package) |
|
|
? Execute<Build>(x => x.Package) |
|
|
: Execute<Build>(x => x.RunTests); |
|
|
: Execute<Build>(x => x.RunTests); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static class ToolSettingsExtensions |
|
|
|
|
|
{ |
|
|
|
|
|
public static T Apply<T>(this T settings, Configure<T> configurator) |
|
|
|
|
|
{ |
|
|
|
|
|
return configurator != null ? configurator(settings) : settings; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|