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