浏览代码

Merge branch 'pr/3596' into update/net31

Steven Kirk 5 年之前
父节点
当前提交
bc49fdea79
共有 4 个文件被更改,包括 96 次插入105 次删除
  1. 80 86
      nukebuild/Build.cs
  2. 9 12
      nukebuild/BuildParameters.cs
  3. 4 4
      nukebuild/Shims.cs
  4. 3 3
      nukebuild/_build.csproj

+ 80 - 86
nukebuild/Build.cs

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

+ 9 - 12
nukebuild/BuildParameters.cs

@@ -4,24 +4,21 @@ using System.Linq;
 using System.Runtime.InteropServices;
 using System.Xml.Linq;
 using Nuke.Common;
-using Nuke.Common.BuildServers;
-using Nuke.Common.Execution;
+using Nuke.Common.CI.AzurePipelines;
 using Nuke.Common.IO;
-using static Nuke.Common.IO.FileSystemTasks;
 using static Nuke.Common.IO.PathConstruction;
-using static Nuke.Common.Tools.MSBuild.MSBuildTasks;
 
 public partial class Build
 {
     [Parameter("configuration")]
     public string Configuration { get; set; }
-    
+
     [Parameter("skip-tests")]
     public bool SkipTests { get; set; }
-    
+
     [Parameter("force-nuget-version")]
     public string ForceNugetVersion { get; set; }
-    
+
     public class BuildParameters
     {
         public string Configuration { get; }
@@ -79,15 +76,15 @@ public partial class Build
             IsRunningOnUnix = Environment.OSVersion.Platform == PlatformID.Unix ||
                               Environment.OSVersion.Platform == PlatformID.MacOSX;
             IsRunningOnWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
-            IsRunningOnAzure = Host == HostType.TeamServices ||
+            IsRunningOnAzure = Host == HostType.AzurePipelines ||
                                Environment.GetEnvironmentVariable("LOGNAME") == "vsts";
 
             if (IsRunningOnAzure)
             {
-                RepositoryName = TeamServices.Instance.RepositoryUri;
-                RepositoryBranch = TeamServices.Instance.SourceBranch;
-                IsPullRequest = TeamServices.Instance.PullRequestId.HasValue;
-                IsMainRepo = StringComparer.OrdinalIgnoreCase.Equals(MainRepo, TeamServices.Instance.RepositoryUri);
+                RepositoryName = AzurePipelines.Instance.RepositoryUri;
+                RepositoryBranch = AzurePipelines.Instance.SourceBranch;
+                IsPullRequest = AzurePipelines.Instance.PullRequestId.HasValue;
+                IsMainRepo = StringComparer.OrdinalIgnoreCase.Equals(MainRepo, AzurePipelines.Instance.RepositoryUri);
             }
             IsMainRepo =
                 StringComparer.OrdinalIgnoreCase.Equals(MainRepo,

+ 4 - 4
nukebuild/Shims.cs

@@ -19,9 +19,9 @@ public partial class Build
         Logger.Info(info, args);
     }
 
-    private void Zip(PathConstruction.AbsolutePath target, params string[] paths) => Zip(target, paths.AsEnumerable());
+    private void Zip(AbsolutePath target, params string[] paths) => Zip(target, paths.AsEnumerable());
 
-    private void Zip(PathConstruction.AbsolutePath target, IEnumerable<string> paths)
+    private void Zip(AbsolutePath target, IEnumerable<string> paths)
     {
         var targetPath = target.ToString();
         bool finished = false, atLeastOneFileAdded = false;
@@ -38,7 +38,7 @@ public partial class Build
                         fileStream.CopyTo(entryStream);
                     atLeastOneFileAdded = true;
                 }
-                
+
                 foreach (var path in paths)
                 {
                     if (Directory.Exists(path))
@@ -64,7 +64,7 @@ public partial class Build
 
             finished = true;
         }
-        finally 
+        finally
         {
             try
             {

+ 3 - 3
nukebuild/_build.csproj

@@ -10,7 +10,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Nuke.Common" Version="0.12.3" />
+    <PackageReference Include="Nuke.Common" Version="0.24.0" />
     <PackageReference Include="xunit.runner.console" Version="2.3.1" />
     <PackageReference Include="JetBrains.dotMemoryUnit" Version="3.0.20171219.105559" />
     <PackageReference Include="vswhere" Version="2.6.7" Condition=" '$(OS)' == 'Windows_NT' " />
@@ -20,11 +20,11 @@
     <NukeMetadata Include="**\*.json" Exclude="bin\**;obj\**" />
     <NukeExternalFiles Include="**\*.*.ext" Exclude="bin\**;obj\**" />
     <None Remove="*.csproj.DotSettings;*.ref.*.txt" />
-    
+
     <!-- Common build related files -->
     <None Include="..\build.ps1" />
     <None Include="..\build.sh" />
-    <None Include="..\.nuke" />     
+    <None Include="..\.nuke" />
     <None Include="..\global.json" Condition="Exists('..\global.json')" />
     <None Include="..\nuget.config" Condition="Exists('..\nuget.config')" />
     <None Include="..\Jenkinsfile" Condition="Exists('..\Jenkinsfile')" />