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..bdcaa046043 100644 --- a/dirs.proj +++ b/dirs.proj @@ -3,8 +3,8 @@ - - + + @@ -27,6 +27,10 @@ + + + + diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs index 871af047cd4..0fea818ea09 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,12 @@ 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") + .AddProperty("SkipBuildingSamples", "True") + .AddProperty("SkipBuildingTests", "True"); return c; } DotNetBuildSettings ApplySetting(DotNetBuildSettings c, Configure configurator = null) => @@ -325,6 +335,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/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 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