From a51120c6ae364754e493ba911f3ff51232a44423 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 1 Feb 2024 19:39:22 +0600 Subject: [PATCH 1/2] BuildToNuGetCache target --- .nuke/build.schema.json | 2 + dirs.proj | 4 ++ nukebuild/Build.cs | 43 +++++++++++++++++++++- nukebuild/BuildParameters.cs | 13 ++++++- src/Avalonia.Native/Avalonia.Native.csproj | 1 + 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json index a21636409b7..dade9df344a 100644 --- a/.nuke/build.schema.json +++ b/.nuke/build.schema.json @@ -73,6 +73,7 @@ "items": { "type": "string", "enum": [ + "BuildToNuGetCache", "CiAzureLinux", "CiAzureOSX", "CiAzureWindows", @@ -108,6 +109,7 @@ "items": { "type": "string", "enum": [ + "BuildToNuGetCache", "CiAzureLinux", "CiAzureOSX", "CiAzureWindows", diff --git a/dirs.proj b/dirs.proj index 120212bd9f9..26025ffbd34 100644 --- a/dirs.proj +++ b/dirs.proj @@ -27,6 +27,10 @@ + + + + diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs index 871af047cd4..6646a263ff9 100644 --- a/nukebuild/Build.cs +++ b/nukebuild/Build.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.IO; +using System.IO.Compression; using System.Linq; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -38,9 +39,12 @@ partial class Build : NukeBuild [PackageExecutable("Microsoft.DotNet.GenAPI.Tool", "Microsoft.DotNet.GenAPI.Tool.dll", Framework = "net8.0")] Tool ApiGenTool; + + protected override void OnBuildInitialized() { - Parameters = new BuildParameters(this); + Parameters = new BuildParameters(this, ScheduledTargets.Contains(BuildToNuGetCache)); + Information("Building version {0} of Avalonia ({1}) using version {2} of Nuke.", Parameters.Version, Parameters.Configuration, @@ -82,6 +86,10 @@ DotNetConfigHelper ApplySettingCore(DotNetConfigHelper c) c.AddProperty("PackageVersion", Parameters.Version) .SetConfiguration(Parameters.Configuration) .SetVerbosity(DotNetVerbosity.Minimal); + if (Parameters.IsPackingToLocalCache) + c + .AddProperty("ForcePackAvaloniaNative", "True") + .AddProperty("SkipObscurePlatforms", "True"); return c; } DotNetBuildSettings ApplySetting(DotNetBuildSettings c, Configure configurator = null) => @@ -325,6 +333,39 @@ await Task.WhenAll( .DependsOn(Package) .DependsOn(ZipFiles); + Target BuildToNuGetCache => _ => _ + .DependsOn(CreateNugetPackages) + .Executes(() => + { + if (!Parameters.IsPackingToLocalCache) + throw new InvalidOperationException(); + + foreach (var path in Parameters.NugetRoot.GlobFiles("*.nupkg")) + { + using var f = File.Open(path.ToString(), FileMode.Open, FileAccess.Read); + using var zip = new ZipArchive(f, ZipArchiveMode.Read); + var nuspecEntry = zip.Entries.First(e => e.FullName.EndsWith(".nuspec") && e.FullName == e.Name); + var packageId = XDocument.Load(nuspecEntry.Open()).Document.Root + .Elements().First(x => x.Name.LocalName == "metadata") + .Elements().First(x => x.Name.LocalName == "id").Value; + + var packagePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), + ".nuget", + "packages", + packageId.ToLowerInvariant(), + BuildParameters.LocalBuildVersion); + if (Directory.Exists(packagePath)) + Directory.Delete(packagePath, true); + Directory.CreateDirectory(packagePath); + zip.ExtractToDirectory(packagePath); + File.WriteAllText(Path.Combine(packagePath, ".nupkg.metadata"), @"{ + ""version"": 2, + ""contentHash"": ""e900dFK7jHJ2WcprLcgJYQoOMc6ejRTwAAMi0VGOFbSczcF98ZDaqwoQIiyqpAwnja59FSbV+GUUXfc3vaQ2Jg=="", + ""source"": ""https://api.nuget.org/v3/index.json"" +}"); + } + }); + Target GenerateCppHeaders => _ => _.Executes(() => { var file = MicroComCodeGenerator.Parse( diff --git a/nukebuild/BuildParameters.cs b/nukebuild/BuildParameters.cs index 74870885bc9..d9705c042f6 100644 --- a/nukebuild/BuildParameters.cs +++ b/nukebuild/BuildParameters.cs @@ -53,7 +53,10 @@ public class BuildParameters public bool IsMyGetRelease { get; } public bool IsNuGetRelease { get; } public bool PublishTestResults { get; } - public string Version { get; } + public string Version { get; set; } + public const string LocalBuildVersion = "9999.0.0-localbuild"; + public bool IsPackingToLocalCache { get; private set; } + public AbsolutePath ArtifactsDir { get; } public AbsolutePath NugetIntermediateRoot { get; } public AbsolutePath NugetRoot { get; } @@ -68,7 +71,7 @@ public class BuildParameters public bool UpdateApiValidationSuppression { get; } public AbsolutePath ApiValidationSuppressionFiles { get; } - public BuildParameters(Build b) + public BuildParameters(Build b, bool isPackingToLocalCache) { // ARGUMENTS Configuration = b.Configuration ?? "Release"; @@ -124,6 +127,12 @@ public BuildParameters(Build b) PublishTestResults = true; } + + if (isPackingToLocalCache) + { + IsPackingToLocalCache = true; + Version = LocalBuildVersion; + } // DIRECTORIES ArtifactsDir = RootDirectory / "artifacts"; diff --git a/src/Avalonia.Native/Avalonia.Native.csproj b/src/Avalonia.Native/Avalonia.Native.csproj index 73c7990d75f..457204289ca 100644 --- a/src/Avalonia.Native/Avalonia.Native.csproj +++ b/src/Avalonia.Native/Avalonia.Native.csproj @@ -4,6 +4,7 @@ $([MSBuild]::IsOSPlatform(OSX)) $(PackAvaloniaNative) true + True net6.0;netstandard2.0 true From 59dba108af8c045e2516bf3c42dd94442e89221d Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 9 Feb 2024 23:38:34 +0600 Subject: [PATCH 2/2] Skip more stuff that's not required for quick local testing of apps --- dirs.proj | 4 ++-- nukebuild/Build.cs | 4 +++- nukebuild/build-to-cache.sh | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100755 nukebuild/build-to-cache.sh diff --git a/dirs.proj b/dirs.proj index 26025ffbd34..bdcaa046043 100644 --- a/dirs.proj +++ b/dirs.proj @@ -3,8 +3,8 @@ - - + + diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs index 6646a263ff9..0fea818ea09 100644 --- a/nukebuild/Build.cs +++ b/nukebuild/Build.cs @@ -89,7 +89,9 @@ DotNetConfigHelper ApplySettingCore(DotNetConfigHelper c) if (Parameters.IsPackingToLocalCache) c .AddProperty("ForcePackAvaloniaNative", "True") - .AddProperty("SkipObscurePlatforms", "True"); + .AddProperty("SkipObscurePlatforms", "True") + .AddProperty("SkipBuildingSamples", "True") + .AddProperty("SkipBuildingTests", "True"); return c; } DotNetBuildSettings ApplySetting(DotNetBuildSettings c, Configure configurator = null) => diff --git a/nukebuild/build-to-cache.sh b/nukebuild/build-to-cache.sh new file mode 100755 index 00000000000..80d51291d06 --- /dev/null +++ b/nukebuild/build-to-cache.sh @@ -0,0 +1,2 @@ +#!/bin/sh +dotnet run --project _build.csproj -- --target BuildToNuGetCache --skip CompileHtmlPreviewer Compile Clean