- add: packager
This commit is contained in:
10
Nebula.Packager/Nebula.Packager.csproj
Normal file
10
Nebula.Packager/Nebula.Packager.csproj
Normal file
@@ -0,0 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
74
Nebula.Packager/Program.cs
Normal file
74
Nebula.Packager/Program.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
using System.Diagnostics;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Nebula.Packager;
|
||||
public static class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
Pack("","Release");
|
||||
}
|
||||
|
||||
private static void Pack(string rootPath,string configuration)
|
||||
{
|
||||
var processInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = "dotnet",
|
||||
ArgumentList =
|
||||
{
|
||||
"publish",
|
||||
Path.Combine(rootPath,"Nebula.Launcher", "Nebula.Launcher.csproj"),
|
||||
"-c", configuration,
|
||||
}
|
||||
};
|
||||
|
||||
var process = Process.Start(processInfo)!;
|
||||
process.WaitForExit();
|
||||
if(process.ExitCode != 0)
|
||||
throw new Exception($"Packager has exited with code {process.ExitCode}");
|
||||
|
||||
var destinationDirectory = Path.Combine(rootPath,"release");
|
||||
var sourceDirectory = Path.Combine("Nebula.Launcher", "bin", configuration,"publish");
|
||||
|
||||
if (Directory.Exists(destinationDirectory))
|
||||
{
|
||||
Directory.Delete(destinationDirectory, true);
|
||||
}
|
||||
|
||||
Directory.CreateDirectory(destinationDirectory);
|
||||
|
||||
HashSet<LauncherManifestEntry> entries = new HashSet<LauncherManifestEntry>();
|
||||
|
||||
foreach (var fileName in Directory.EnumerateFiles(sourceDirectory, "*.*", SearchOption.AllDirectories))
|
||||
{
|
||||
using var md5 = MD5.Create();
|
||||
using var stream = File.OpenRead(fileName);
|
||||
|
||||
var hash = md5.ComputeHash(stream);
|
||||
var hashStr = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
|
||||
|
||||
if(!File.Exists(Path.Combine(destinationDirectory, hashStr)))
|
||||
File.Copy(fileName, Path.Combine(destinationDirectory, hashStr));
|
||||
|
||||
var fileNameCut = fileName.Remove(0, sourceDirectory.Length + 1);
|
||||
|
||||
entries.Add(new LauncherManifestEntry(hashStr, fileNameCut));
|
||||
Console.WriteLine($"Added {hashStr} file name {fileNameCut}");
|
||||
}
|
||||
|
||||
using var manifest = File.CreateText(Path.Combine(destinationDirectory, "manifest.json"));
|
||||
manifest.AutoFlush = true;
|
||||
manifest.Write(JsonSerializer.Serialize(new LauncherManifest(entries)));
|
||||
}
|
||||
}
|
||||
|
||||
public record struct LauncherManifest(
|
||||
[property: JsonPropertyName("entries")] HashSet<LauncherManifestEntry> Entries
|
||||
);
|
||||
|
||||
public record struct LauncherManifestEntry(
|
||||
[property: JsonPropertyName("hash")] string Hash,
|
||||
[property: JsonPropertyName("path")] string Path
|
||||
);
|
||||
Reference in New Issue
Block a user