Skip to content

Commit

Permalink
Improve appimage build (#34)
Browse files Browse the repository at this point in the history
  • Loading branch information
SuperJMN committed Apr 17, 2024
1 parent b4dd40e commit e4111e4
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 67 deletions.
4 changes: 0 additions & 4 deletions .nuke/build.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,9 @@
"Clean",
"PackAndroid",
"PackAppImages",
"PackDeb",
"PackWindows",
"Publish",
"PublishGitHubRelease",
"PublishLinux",
"RestoreWorkloads"
]
}
Expand All @@ -120,11 +118,9 @@
"Clean",
"PackAndroid",
"PackAppImages",
"PackDeb",
"PackWindows",
"Publish",
"PublishGitHubRelease",
"PublishLinux",
"RestoreWorkloads"
]
}
Expand Down
File renamed without changes
73 changes: 73 additions & 0 deletions build/AppImagePackager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
using System.Collections.Generic;
using System.IO;
using System.IO.Abstractions;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using CSharpFunctionalExtensions;
using DotnetPackaging;
using DotnetPackaging.AppImage;
using DotnetPackaging.AppImage.Core;
using Nuke.Common.IO;
using Nuke.Common.ProjectModel;
using Nuke.Common.Tools.DotNet;
using Zafiro.FileSystem.Lightweight;

public static class AppImagePackager
{
static readonly Dictionary<Architecture, (string Runtime, string RuntimeLinux)> Mapping = new()
{
[Architecture.X64] = ("linux-x64", "x86_64"),
[Architecture.Arm64] = ("linux-arm64", "arm64"),
};

public static Task PackAppImage(Project project, Architecture architecture, Configuration configuration, AbsolutePath output, string version)
{
var runtime = Mapping[architecture].Runtime;

var publishDirectory = project.Directory / "bin" / "publish" / runtime;

DotNetTasks.DotNetPublish(settings => settings
.SetProject(project)
.SetConfiguration(configuration)
.SetSelfContained(true)
.SetRuntime(Mapping[architecture].Runtime)
.SetOutput(publishDirectory));

return Pack(project, publishDirectory, version, architecture, output);
}

static async Task Pack(Project project, AbsolutePath publishDirectory, string version, Architecture architecture, AbsolutePath outputDir)
{
var fs = new FileSystem();
var inputDir = new DirectorioIODirectory(Maybe<string>.None, fs.DirectoryInfo.New(publishDirectory));
var appName = project.Name.Replace(".Desktop", "");
var packagePath = outputDir / appName + "-" + version + "-" + Mapping[architecture].RuntimeLinux + ".AppImage";
packagePath.Parent.CreateDirectory();
await using var output = fs.File.Open(packagePath, FileMode.Create);
IEnumerable<AdditionalCategory> categories = [AdditionalCategory.FileManager, AdditionalCategory.FileTools, AdditionalCategory.FileTransfer, AdditionalCategory.Filesystem];
var metadata = new Options()
{
Icon = Maybe<IIcon>.None,
MainCategory = Maybe<MainCategory>.From(MainCategory.Utility),
AdditionalCategories = Maybe.From(categories),
AppName = appName,
Comment = "Cross-Platform File Synchronization Powered by AvaloniaUI",
Keywords = new List<string>
{
"File Synchronization",
"Cross-Platform",
"AvaloniaUI",
"Avalonia",
"File Management",
"Folder Sync",
"UI Design",
"Open Source",
"Reactive Programming"
},
StartupWmClass = appName,
Version = version,
};

await AppImage.WriteFromBuildDirectory(output, inputDir, metadata);
}
}
80 changes: 19 additions & 61 deletions build/Build.cs
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Abstractions;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using CSharpFunctionalExtensions;
using DotnetPackaging;
using DotnetPackaging.AppImage;
using DotnetPackaging.AppImage.Core;
using NuGet.Common;
using Nuke.Common;
using Nuke.Common.IO;
using Nuke.Common.ProjectModel;
using Nuke.Common.Tooling;
using Nuke.Common.Tools.GitVersion;
using Nuke.Common.Git;
using Nuke.Common.Tools.DotNet;
using Nuke.Common.Tools.DotNet;using Nuke.Common.Tools.NSwag;
using Nuke.Common.Utilities.Collections;
using Nuke.GitHub;
using Serilog;
Expand All @@ -24,6 +27,7 @@
using static Nuke.GitHub.GitHubTasks;
using static Nuke.Common.Tooling.ProcessTasks;
using Maybe = CSharpFunctionalExtensions.Maybe;
using static Nuke.Common.Tools.NSwag.NSwagTasks;

class Build : NukeBuild
{
Expand All @@ -43,7 +47,7 @@ class Build : NukeBuild
[Parameter("The alias for the key in the keystore.")] readonly string AndroidSigningKeyAlias;
[Parameter("The password for the keystore file.")][Secret] readonly string AndroidSigningStorePass;
[Parameter("The password of the key within the keystore file.")][Secret] readonly string AndroidSigningKeyPass;

Target Clean => td => td
.Executes(() =>
{
Expand All @@ -59,68 +63,22 @@ class Build : NukeBuild
StartShell(@$"dotnet workload restore {Solution.Path}").AssertZeroExitCode();
});

Target PackDeb => td => td
.DependsOn(Clean)
.DependsOn(RestoreWorkloads)
.Executes(() => DebPackages.Create(Solution, Configuration, PublishDirectory, PackagesDirectory, GitVersion.MajorMinorPatch));

Target PublishLinux => td => td
.DependsOn(Clean)
.DependsOn(RestoreWorkloads)
.Executes(() =>
{
var desktopProject = Solution.AllProjects.First(project => project.Name.EndsWith("Desktop"));
List<string> runtimes = ["linux-x64", "linux-arm64"];
DotNetPublish(settings => settings
.SetProject(desktopProject)
.SetConfiguration(Configuration)
.SetSelfContained(true)
.CombineWith(runtimes, (c, runtime) =>
c.SetRuntime(runtime)
.SetOutput(PublishDirectory / runtime)));
});
//Target PackDeb => td => td
// .DependsOn(Clean)
// .DependsOn(RestoreWorkloads)
// .Executes(() => DebPackages.Create(Solution, Configuration, PublishDirectory, PackagesDirectory, GitVersion.MajorMinorPatch));

Target PackAppImages => td => td
.DependsOn(PublishLinux)
.Executes(() =>
.Executes(async () =>
{
var fs = new FileSystem();
var linuxDirs = PublishDirectory.GlobDirectories("linux-*");
var packagingTasks = linuxDirs.Select(async linuxDir =>
{
Debugger.Launch();
var inputDir = new DirectorioIODirectory(Maybe<string>.None, fs.DirectoryInfo.New(linuxDir));
var packagePath = PackagesDirectory / Solution.Name + "_" + GitVersion.MajorMinorPatch + "_" + linuxDir.Name + ".AppImage";
packagePath.Parent.CreateDirectory();
await using var output = fs.File.Open(packagePath, FileMode.Create);
IEnumerable<AdditionalCategory> categories = [AdditionalCategory.FileManager, AdditionalCategory.FileTools, AdditionalCategory.FileTransfer, AdditionalCategory.Filesystem];
var metadata = new Options()
{
Icon = Maybe<IIcon>.None,
MainCategory = Maybe<MainCategory>.From(MainCategory.Utility),
AdditionalCategories = Maybe.From(categories),
AppName = Solution.Name,
Comment = "Cross-Platform File Synchronization Powered by AvaloniaUI",
Keywords = new List<string>
{
"File Synchronization",
"Cross-Platform",
"AvaloniaUI",
"Avalonia",
"File Management",
"Folder Sync",
"UI Design",
"Open Source",
"Reactive Programming"
},
StartupWmClass = Solution.Name,
Version = GitVersion.MajorMinorPatch,
};
await AppImage.WriteFromBuildDirectory(output, inputDir, metadata);
});
IEnumerable<Architecture> supportedArchitectures = [Architecture.Arm64, Architecture.X64];
var desktopProject = Solution.AllProjects.First(project => project.Name.EndsWith("Desktop"));
return Task.WhenAll(packagingTasks);
foreach (var architecture in supportedArchitectures)
{
Log.Information("Publishing {Arch}", architecture);
await AppImagePackager.PackAppImage(desktopProject, architecture, Configuration, PackagesDirectory, GitVersion.MajorMinorPatch);
}
});

Target PackWindows => td => td
Expand Down Expand Up @@ -173,7 +131,7 @@ class Build : NukeBuild
});


Target Publish => td => td.DependsOn(PackDeb, PackWindows, PackAndroid, PackAppImages);
Target Publish => td => td.DependsOn(PackWindows, PackAndroid, PackAppImages);

Target PublishGitHubRelease => td => td
.OnlyWhenStatic(() => Repository.IsOnMainOrMasterBranch())
Expand Down
4 changes: 2 additions & 2 deletions build/_build.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
<NukeTelemetryVersion>1</NukeTelemetryVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DotnetPackaging.AppImage" Version="1.0.25" />
<PackageReference Include="DotnetPackaging.Deb" Version="1.0.25" />
<PackageReference Include="DotnetPackaging.AppImage" Version="1.0.26" />
<PackageReference Include="DotnetPackaging.Deb" Version="1.0.26" />
<PackageReference Include="NuGet.Packaging" Version="6.9.1" />
<PackageReference Include="Nuke.Common" Version="8.0.0" />
<PackageReference Include="Nuke.GitHub" Version="5.0.1" />
Expand Down
Binary file added src/AvaloniaSyncer/AppImage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/AvaloniaSyncer/AvaloniaSyncer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
<PackageReference Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)" />
<PackageReference Include="HttpClient.Extensions.LoggingHttpMessageHandler" Version="1.0.3" />
</ItemGroup>
<ItemGroup>
<AvaloniaResource Remove="AppImage.png" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" Version="$(AvaloniaVersion)" />
<PackageReference Include="Avalonia.Controls.DataGrid" Version="$(AvaloniaVersion)" />
Expand All @@ -33,4 +36,9 @@
<PackageReference Include="Zafiro.FileSystem.Sftp" Version="5.1.0" />
<PackageReference Include="Zafiro.UI" Version="4.0.29" />
</ItemGroup>
<ItemGroup>
<None Update="AppImage.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

0 comments on commit e4111e4

Please sign in to comment.