9 Commits
Author SHA1 Message Date
qwsdcvghyu89 207805bad3 Improve project file version handling and error recovery
Refactored the publish workflow to use a more robust error handling and cleanup mechanism with a RestoreActions list. The version increment logic now resets lower version components appropriately based on the increment target. ProjectFile now sets both Version and PackageVersion properties to ensure consistency. Improved process output handling and destination processing feedback.
2025-09-27 17:19:30 +10:00
qwsdcvghyu89 6904e0cfd8 Improve process handling and async support in publish tool
Refactored process execution to use async methods and cancellation tokens for better responsiveness, especially when handling 'dotnet pack' and 'dotnet nuget push' commands. Updated .csproj to use C# preview language features and added 'bin/' to .gitignore.
2025-09-27 16:26:12 +10:00
qwsdcvghyu89 093da5d0f3 Improve error reporting for process failures
Captures and displays standard error output when 'dotnet pack' or 'dotnet nuget push' commands fail, providing more detailed error information to the user.
2025-09-27 16:15:30 +10:00
qwsdcvghyu89 c6570c1e2c Improve error handling for dotnet pack failures
Enhanced the error message for 'dotnet pack' failures to include the exit code. Updated the resource string and its usage to provide more informative feedback. Added cleanup of the temporary directory on cancellation and improved progress bar visibility.
2025-09-27 16:11:58 +10:00
qwsdcvghyu89 ad729133a6 Restore project file on cancel event
Adds a handler for Console.CancelKeyPress to restore the project file from backup if the process is interrupted, ensuring changes are not left in an inconsistent state.
2025-09-27 15:56:20 +10:00
qwsdcvghyu89 05a0540476 Update SDK version, dependencies, and version increment logic
- Upgraded `.NET` SDK from 9.0.100 to 10.0.100.
- Updated `NuGetToolVersion` to 7.0.0.
- Adjusted version increment logic for negative delta handling.
- Added new framework dependencies for improved compatibility and functionality.
- Minor code adjustments and updated generated files.
2025-09-26 19:30:16 +10:00
qwsdcvghyu89 b61d0836ac - Fix version increment logic by clamping values to valid range
- e.g. increment minor on 1.0.3 now results in 1.1.0 instead of 1.1.3
2025-09-21 17:00:16 +10:00
qwsdcvghyu89 81bb2ea5c4 Remove unused local project types and dependencies, update to aeqw89.xml.ProjectFile. 2025-09-21 16:47:47 +10:00
qwsdcvghyu89 ec8829bef2 Refactor SshHosts for immutability and improve retrieval methods 2025-09-21 15:58:10 +10:00
37 changed files with 538 additions and 678 deletions
+1
View File
@@ -0,0 +1 @@
bin/
-7
View File
@@ -1,7 +0,0 @@
using System.Xml;
namespace aeqw89.tools.Publish;
internal sealed class Content : Item {
public Content(XmlElement node) : base(node) { }
}
+1 -1
View File
@@ -96,7 +96,7 @@ namespace aeqw89.tools.Publish {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Failed to pack; ensure that &apos;dotnet build&apos; succeeds before running this program.. /// Looks up a localized string similar to Failed to pack with exit code &apos;{0}&apos;; ensure that &apos;dotnet build&apos; succeeds before running this program..
/// </summary> /// </summary>
internal static string dotnet_pack_failure { internal static string dotnet_pack_failure {
get { get {
+1 -1
View File
@@ -58,7 +58,7 @@
<value>The project file '{0}' is irreparable becuase it is missing a '{1}' property, and the value cannot be guessed.</value> <value>The project file '{0}' is irreparable becuase it is missing a '{1}' property, and the value cannot be guessed.</value>
</data> </data>
<data name="dotnet_pack_failure" xml:space="preserve"> <data name="dotnet_pack_failure" xml:space="preserve">
<value>Failed to pack; ensure that 'dotnet build' succeeds before running this program.</value> <value>Failed to pack with exit code '{0}'; ensure that 'dotnet build' succeeds before running this program.</value>
</data> </data>
<data name="failed_to_clean_up" xml:space="preserve"> <data name="failed_to_clean_up" xml:space="preserve">
<value>Could not delete temporary directory '{0}' due to error '{1}'</value> <value>Could not delete temporary directory '{0}' due to error '{1}'</value>
-55
View File
@@ -1,55 +0,0 @@
using System.Xml;
namespace aeqw89.tools.Publish;
internal class Item {
public string ElementName { get; protected set; }
public string Include {
get => Node.GetAttribute("Include");
set => Node.SetAttribute("Include", value);
}
public string Version {
get => Node.GetAttribute("Version");
set => Node.SetAttribute("Version", value);
}
public string? Value {
get => Node.InnerText;
set { Node.InnerText = value ?? string.Empty; }
}
public XmlElement Node { get; }
protected Item(XmlElement node) {
Node = node;
ElementName = node.Name;
}
public static Item FromElement(XmlElement element) {
return element.Name switch {
"PackageReference" => new PackageReference(element),
"ProjectReference" => new ProjectReference(element),
"Content" => new Content(element),
_ => new Item(element),
};
}
public void AddChild(Item child) {
var imported = Node.OwnerDocument!.ImportNode(child.Node, true);
Node.AppendChild(imported);
}
public string? GetAttribute(string name) => Node.HasAttribute(name) ? Node.GetAttribute(name) : null;
public void SetAttribute(string name, string? value) {
if (value is null) {
if (Node.HasAttribute(name)) Node.RemoveAttribute(name);
return;
}
Node.SetAttribute(name, value);
}
public IEnumerable<Item> GetChildElements() {
foreach (var e in Node.ChildNodes.OfType<XmlElement>())
yield return new Item(e);
}
}
-26
View File
@@ -1,26 +0,0 @@
using System.Xml;
namespace aeqw89.tools.Publish;
internal class ItemGroup {
private readonly XmlElement _element;
public List<Item> Items { get; }
public void Remove() {
_element.ParentNode!.RemoveChild(_element);
}
public ItemGroup(XmlElement element) {
_element = element;
Items = element.ChildNodes
.OfType<XmlElement>()
.Select(Item.FromElement)
.ToList();
}
public void Add(Item item) {
var imported = _element.OwnerDocument!.ImportNode(item.Node, true);
_element.AppendChild(imported);
Items.Add(Item.FromElement((XmlElement)imported));
}
}
-30
View File
@@ -1,30 +0,0 @@
using System.Xml;
namespace aeqw89.tools.Publish;
internal sealed class PackageReference : Item {
public PackageReference(XmlElement node) : base(node) { }
// inside PackageReference
public string? GetPackageVersion() {
// Prefer attribute, then child <Version>
var attr = GetAttribute("Version");
if (!string.IsNullOrEmpty(attr)) return attr;
var child = Node.SelectSingleNode("./Version") as XmlElement;
return child?.InnerText;
}
public void SetPackageVersion(string? version) {
if (Node.HasAttribute("Version") || (Node.SelectSingleNode("./Version") == null)) {
// If attribute exists (or no child yet), use attribute
SetAttribute("Version", version);
return;
}
// Else write to existing child <Version>
var child = (XmlElement)Node.SelectSingleNode("./Version")!;
child.InnerText = version ?? string.Empty;
}
}
+181 -46
View File
@@ -1,9 +1,9 @@
using System.Collections; using System.Collections;
using System.Diagnostics; using System.Diagnostics;
using System.Text;
using Renci.SshNet; using Renci.SshNet;
using Spectre.Console; using Spectre.Console;
using Spectre.Console.Cli; using aeqw89.xml.ProjectFile;
using VsTools.Projects;
namespace aeqw89.tools.Publish; namespace aeqw89.tools.Publish;
@@ -27,6 +27,8 @@ public static class Program {
public static Dictionary<string, string[]> Flags { get; set; } public static Dictionary<string, string[]> Flags { get; set; }
public static bool Verbose { get; set; } = false; public static bool Verbose { get; set; } = false;
public static List<Action> RestoreActions { get; set; } = [];
public static void ReadArgs(string[] args) { public static void ReadArgs(string[] args) {
if (args.Length < 1) { if (args.Length < 1) {
ShowError(Exceptions.missing_mode.EscapeMarkup()); ShowError(Exceptions.missing_mode.EscapeMarkup());
@@ -109,9 +111,15 @@ public static class Program {
public static async Task Main(string[] args) { public static async Task Main(string[] args) {
ReadArgs(args); ReadArgs(args);
Console.CancelKeyPress += (sender, eventArgs) => {
RestoreActions.ForEach(x => x());
};
string packageId = ""; string packageId = "";
string version = ""; string version = "";
int destinationsProcessed = 0;
try {
var result = AnsiConsole.Status() var result = AnsiConsole.Status()
.Spinner(Spinner.Known.Dots) .Spinner(Spinner.Known.Dots)
.Start<bool>("Preparing project", ctx => { .Start<bool>("Preparing project", ctx => {
@@ -125,6 +133,12 @@ public static class Program {
try { try {
projectFile.Backup(); projectFile.Backup();
RestoreActions.Add(() => {
projectFile.Restore();
AnsiConsole.MarkupLine("[yellow]Restored project file from backup.[/]");
});
if (Verbose) if (Verbose)
AnsiConsole.WriteLine( AnsiConsole.WriteLine(
$"Created project file backup at {projectFile.GetDefaultBackupLocation()}"); $"Created project file backup at {projectFile.GetDefaultBackupLocation()}");
@@ -149,7 +163,8 @@ public static class Program {
} }
if (!int.TryParse(deltaStrings[0], out delta)) { if (!int.TryParse(deltaStrings[0], out delta)) {
ShowError(Exceptions.flag_parameter_type_incorrect.EscapeMarkup(), "--delta", 0, nameof(Int32), ShowError(Exceptions.flag_parameter_type_incorrect.EscapeMarkup(), "--delta", 0,
nameof(Int32),
deltaStrings[0]); deltaStrings[0]);
projectFile.Restore(); projectFile.Restore();
ShowHelp(); ShowHelp();
@@ -159,18 +174,14 @@ public static class Program {
ctx.Status = "Updating version"; ctx.Status = "Updating version";
var version = projectFile.GetVersion(); var version = projectFile.GetVersion();
version = ChangeVersion(version, version = ChangeVersion(version, delta, Target ?? IncrementTarget.Patch);
Target == IncrementTarget.Patch ? delta : 0,
Target == IncrementTarget.Minor ? delta : 0,
Target == IncrementTarget.Major ? delta : 0,
(x, y) => x + y);
projectFile.SetVersion(version); projectFile.SetVersion(version);
} }
} }
catch (Exception e) { catch (Exception e) {
ShowError(Exceptions.generic_error.EscapeMarkup(), e.ToString().EscapeMarkup()); ShowError(Exceptions.generic_error.EscapeMarkup(), e.ToString().EscapeMarkup());
projectFile.Restore(); RestoreActions.ForEach(x => x());
return false; return false;
} }
@@ -191,21 +202,23 @@ public static class Program {
visited.Add(reference.Include); visited.Add(reference.Include);
if (Verbose) if (Verbose)
AnsiConsole.WriteLine($"Processing project reference {reference.Include} out of {visited.Count} so far"); AnsiConsole.WriteLine(
$"Processing project reference {reference.Include} out of {visited.Count} so far");
projectFile.SetPrivateAssets(reference, PrivateAssetsValue.All); projectFile.SetPrivateAssets(reference, PrivateAssetsValue.All);
string pathToReferencedProjectFile = projectFile.GetAbsoluteIncludePath(reference); string pathToReferencedProjectFile = projectFile.GetAbsoluteIncludePath(reference);
if (!ProjectFile.TryLoad(pathToReferencedProjectFile, out var referencedProjectFile, if (!ProjectFile.TryLoad(pathToReferencedProjectFile, out var referencedProjectFile,
out error)) { out error)) {
ShowError(error.EscapeMarkup()); ShowError(error.EscapeMarkup());
projectFile.Restore(); RestoreActions.ForEach(x => x());
return false; return false;
} }
var referencedPackageReferences = referencedProjectFile.GetPackageReferences(); var referencedPackageReferences = referencedProjectFile.GetPackageReferences();
foreach (var package in referencedPackageReferences) { foreach (var package in referencedPackageReferences) {
if (Verbose) if (Verbose)
AnsiConsole.WriteLine($"Hoisting package {package.Include} from {pathToReferencedProjectFile}"); AnsiConsole.WriteLine(
$"Hoisting package {package.Include} from {pathToReferencedProjectFile}");
var hoisted = projectFile.AddPackage(package); var hoisted = projectFile.AddPackage(package);
projectFile.SetTransitive(hoisted, true); projectFile.SetTransitive(hoisted, true);
projectFile.SetPrivateAssets(hoisted, PrivateAssetsValue.None); projectFile.SetPrivateAssets(hoisted, PrivateAssetsValue.None);
@@ -218,9 +231,10 @@ public static class Program {
projectReferences.Enqueue(project); projectReferences.Enqueue(project);
} }
} }
} catch (Exception e) { }
catch (Exception e) {
ShowError(Exceptions.generic_error.EscapeMarkup(), e.ToString().EscapeMarkup()); ShowError(Exceptions.generic_error.EscapeMarkup(), e.ToString().EscapeMarkup());
projectFile.Restore(); RestoreActions.ForEach(x => x());
return false; return false;
} }
} }
@@ -234,29 +248,80 @@ public static class Program {
} }
var outDir = Path.GetRandomFileName(); var outDir = Path.GetRandomFileName();
result = AnsiConsole.Status() RestoreActions.Add(() => {
try {
if (!Directory.Exists(outDir)) return;
Directory.Delete(outDir, true);
AnsiConsole.MarkupLine("[yellow]Cleaned up temporary directory[/]");
}
catch (Exception e) {
ShowError(string.Format(Exceptions.failed_to_clean_up.EscapeMarkup(), outDir.EscapeMarkup(),
e.ToString().EscapeMarkup()));
}
});
string processError = "";
var exitCode = await AnsiConsole.Status()
.Spinner(Spinner.Known.Dots) .Spinner(Spinner.Known.Dots)
.Start<bool>("Creating package with 'dotnet pack' ", ctx => { .StartAsync<int>("Creating package with 'dotnet pack' ", async ctx => {
var p = Process.Start(new ProcessStartInfo() { var p = Process.Start(new ProcessStartInfo() {
FileName = "dotnet", FileName = "dotnet",
Arguments = $"pack -o {outDir}", Arguments = $"pack -o {outDir}",
WorkingDirectory = Environment.CurrentDirectory, WorkingDirectory = Environment.CurrentDirectory,
UseShellExecute = Verbose, UseShellExecute = false,
RedirectStandardOutput = !Verbose, RedirectStandardOutput = true,
RedirectStandardError = !Verbose RedirectStandardError = true
});
p?.WaitForExit();
return p?.ExitCode == 0;
}); });
if (!result) { CancellationTokenSource cts = new CancellationTokenSource();
ShowError(Exceptions.dotnet_pack_failure.EscapeMarkup()); StringBuilder errorLines = new();
p?.ErrorDataReceived += (sender, eventArgs) => {
cts.Cancel();
if (Verbose && eventArgs.Data != null)
AnsiConsole.WriteLine(eventArgs.Data);
};
bool success = false;
p?.OutputDataReceived += (sender, eventArgs) => {
if (eventArgs.Data?.ToLower().Contains("press any key") == true)
cts.Cancel();
if (Verbose && eventArgs.Data != null)
AnsiConsole.WriteLine(eventArgs.Data);
// Successfully created package 'C:\Users\qwsdc\source\repos\Beam\aeqw89.Beam\tozsxqaj.alp\Beam.1.0.0.nupkg'.
if (eventArgs.Data?.ToLower()
.Contains($"successfully created package '{Path.GetFullPath(outDir)}") == true) {
AnsiConsole.MarkupLine($"[bold]{eventArgs.Data}[/]");
success = true;
}
};
p?.BeginOutputReadLine();
p?.BeginErrorReadLine();
try {
await (p?.WaitForExitAsync(cts.Token) ?? Task.CompletedTask);
}
catch (TaskCanceledException) {
p?.Kill();
}
processError = errorLines.ToString().EscapeMarkup();
return success == true ? 0 : p?.ExitCode ?? -1;
});
if (exitCode != 0) {
ShowError(processError.EscapeMarkup());
ShowError(Exceptions.dotnet_pack_failure.EscapeMarkup(), exitCode);
RestoreActions.ForEach(x => x());
return; return;
} }
if (Verbose)
AnsiConsole.MarkupLine("Successfully created package with exit code [green]{0}[/]. Processing destinations.", exitCode);
var package = Directory.GetFiles(outDir, "*.nupkg").FirstOrDefault(); var package = Directory.GetFiles(outDir, "*.nupkg").FirstOrDefault();
if (package == null) { if (package == null) {
ShowError(Exceptions.generic_error.EscapeMarkup()); ShowError(Exceptions.generic_error.EscapeMarkup());
RestoreActions.ForEach(x => x());
return; return;
} }
@@ -266,7 +331,7 @@ public static class Program {
try { try {
await AnsiConsole.Progress() await AnsiConsole.Progress()
.AutoClear(true) .AutoClear(true)
.HideCompleted(true) .HideCompleted(false)
.Columns(new ProgressColumn[] { .Columns(new ProgressColumn[] {
new TaskDescriptionColumn(), new TaskDescriptionColumn(),
new ProgressBarColumn() new ProgressBarColumn()
@@ -288,7 +353,8 @@ public static class Program {
if (dest.StartsWith("local-")) { if (dest.StartsWith("local-")) {
var name = dest[("local-".Length)..]; var name = dest[("local-".Length)..];
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), var path = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
name, Path.GetFileName(package)); name, Path.GetFileName(package));
if (!Directory.Exists(Path.GetDirectoryName(path))) if (!Directory.Exists(Path.GetDirectoryName(path)))
Directory.CreateDirectory(Path.GetDirectoryName(path)!); Directory.CreateDirectory(Path.GetDirectoryName(path)!);
@@ -304,7 +370,8 @@ public static class Program {
else if (dest.StartsWith("cloud-")) { else if (dest.StartsWith("cloud-")) {
var name = dest[("cloud-".Length)..]; var name = dest[("cloud-".Length)..];
var connectionTask = ctx.AddTaskBefore($"Preparing cloud-{name}", new ProgressTaskSettings() { var connectionTask = ctx.AddTaskBefore($"Preparing cloud-{name}",
new ProgressTaskSettings() {
MaxValue = 100 MaxValue = 100
}, task); }, task);
@@ -333,41 +400,51 @@ public static class Program {
if (os == "windows") { if (os == "windows") {
var userDirC = sshClient.RunCommand("cmd /c echo %USERPROFILE%"); var userDirC = sshClient.RunCommand("cmd /c echo %USERPROFILE%");
if (userDirC.ExitStatus != 0) { if (userDirC.ExitStatus != 0) {
ShowError(Exceptions.failed_to_prepare_server_directory, "n/a", name, os, userDirC.Result); ShowError(Exceptions.failed_to_prepare_server_directory, "n/a", name, os,
userDirC.Result);
return; return;
} }
var userDir = userDirC.Result.Trim(); var userDir = userDirC.Result.Trim();
remoteDirectory = RemotePath.Combine(RemoteOs.Windows,userDir, "dotnet-packages"); remoteDirectory = RemotePath.Combine(RemoteOs.Windows, userDir, "dotnet-packages");
packageFileDirectory = RemotePath.Combine(RemoteOs.Windows, remoteDirectory, Path.GetFileName(package)); packageFileDirectory = RemotePath.Combine(RemoteOs.Windows, remoteDirectory,
Path.GetFileName(package));
var mkdirC = sshClient.RunCommand($"cmd /c if not exist \"{remoteDirectory}\" mkdir \"{remoteDirectory}\""); var mkdirC = sshClient.RunCommand(
$"cmd /c if not exist \"{remoteDirectory}\" mkdir \"{remoteDirectory}\"");
if (mkdirC.ExitStatus != 0) { if (mkdirC.ExitStatus != 0) {
ShowError(Exceptions.failed_to_prepare_server_directory, remoteDirectory, name, os, mkdirC.Result); ShowError(Exceptions.failed_to_prepare_server_directory, remoteDirectory, name,
os, mkdirC.Result);
return; return;
} }
} }
else if (os == "linux") { else if (os == "linux") {
var homeDirC = sshClient.RunCommand("printf %s \"$HOME\""); var homeDirC = sshClient.RunCommand("printf %s \"$HOME\"");
if (homeDirC.ExitStatus != 0) { if (homeDirC.ExitStatus != 0) {
ShowError(Exceptions.failed_to_prepare_server_directory, "n/a", name, os, homeDirC.Result); ShowError(Exceptions.failed_to_prepare_server_directory, "n/a", name, os,
homeDirC.Result);
return; return;
} }
var homeDir = homeDirC.Result.Trim(); // no CRLF on unix, but Trim() is safest var homeDir = homeDirC.Result.Trim(); // no CRLF on unix, but Trim() is safest
remoteDirectory = RemotePath.Combine(RemoteOs.Unix, homeDir, ".dotnet-packages"); remoteDirectory = RemotePath.Combine(RemoteOs.Unix, homeDir, ".dotnet-packages");
packageFileDirectory = RemotePath.Combine(RemoteOs.Unix, remoteDirectory, Path.GetFileName(package)); packageFileDirectory = RemotePath.Combine(RemoteOs.Unix, remoteDirectory,
Path.GetFileName(package));
// Use -p and single quotes to handle spaces safely // Use -p and single quotes to handle spaces safely
var mkdirC = sshClient.RunCommand($"mkdir -p '{remoteDirectory}'"); var mkdirC = sshClient.RunCommand($"mkdir -p '{remoteDirectory}'");
if (mkdirC.ExitStatus != 0) { if (mkdirC.ExitStatus != 0) {
ShowError(Exceptions.failed_to_prepare_server_directory, remoteDirectory, name, os, mkdirC.Result); ShowError(Exceptions.failed_to_prepare_server_directory, remoteDirectory, name,
os, mkdirC.Result);
return; return;
} }
} }
else { else {
ShowError(Exceptions.failed_to_prepare_server_directory, "n/a", name, os, "Unsupported OS"); ShowError(Exceptions.failed_to_prepare_server_directory, "n/a", name, os,
"Unsupported OS");
return; return;
} }
connectionTask.Increment(33); connectionTask.Increment(33);
sshClient.Disconnect(); sshClient.Disconnect();
@@ -394,23 +471,52 @@ public static class Program {
Arguments = $"nuget push {package} --source github", Arguments = $"nuget push {package} --source github",
WorkingDirectory = Environment.CurrentDirectory, WorkingDirectory = Environment.CurrentDirectory,
UseShellExecute = false, UseShellExecute = false,
RedirectStandardOutput = !Verbose, RedirectStandardOutput = true,
RedirectStandardError = !Verbose RedirectStandardError = true
}); });
var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);
StringBuilder errorLines = new();
p?.ErrorDataReceived += (sender, eventArgs) => {
cts.Cancel();
if (Verbose && eventArgs.Data != null)
AnsiConsole.WriteLine(eventArgs.Data);
errorLines.Append(eventArgs.Data);
};
p?.OutputDataReceived += (sender, eventArgs) => {
if (eventArgs.Data?.ToLower().Contains("press any key") == true)
cts.Cancel();
if (Verbose && eventArgs.Data != null)
AnsiConsole.WriteLine(eventArgs.Data);
};
p?.BeginOutputReadLine();
p?.BeginErrorReadLine();
if (p == null) { if (p == null) {
ShowError(Exceptions.generic_error.EscapeMarkup()); ShowError(Exceptions.generic_error.EscapeMarkup());
} }
task.Increment(size / 2); task.Increment(size / 2);
if (p != null) if (p != null)
await p.WaitForExitAsync(ct); try {
if (p?.ExitCode != 0) { await (p?.WaitForExitAsync(cts.Token) ?? Task.CompletedTask);
ShowError(Exceptions.dotnet_nuget_push_failure, p.ExitCode);
} }
catch (TaskCanceledException) {
p?.Kill();
}
if (p?.ExitCode != 0) {
ShowError(errorLines.ToString().EscapeMarkup());
ShowError(Exceptions.dotnet_nuget_push_failure, p?.ExitCode ?? -1);
task.StopTask();
return;
}
task.Increment(size / 2); task.Increment(size / 2);
} }
Interlocked.Increment(ref destinationsProcessed);
task.StopTask(); task.StopTask();
}); });
}); });
@@ -420,11 +526,27 @@ public static class Program {
Directory.Delete(outDir, true); Directory.Delete(outDir, true);
} }
catch (Exception e) { catch (Exception e) {
ShowError(string.Format(Exceptions.failed_to_clean_up.EscapeMarkup(), outDir.EscapeMarkup(), e.ToString().EscapeMarkup())); ShowError(string.Format(Exceptions.failed_to_clean_up.EscapeMarkup(), outDir.EscapeMarkup(),
e.ToString().EscapeMarkup()));
} }
} }
}
catch(Exception e) {
ShowError(Exceptions.generic_error.EscapeMarkup(), e.ToString().EscapeMarkup());;
RestoreActions.ForEach(x => x());
}
if (destinationsProcessed == 0) {
AnsiConsole.MarkupLine("[bold red]No destinations were processed. Reverting changes to project file.[/]");
RestoreActions.ForEach(x => x());
}
else {
AnsiConsole.MarkupLine("Completed processing of all destinations."); AnsiConsole.MarkupLine("Completed processing of all destinations.");
AnsiConsole.MarkupLine("Example usage:\n\t <PackageReference Include=\"{0}\" Version=\"{1}\" />".EscapeMarkup(), packageId, version); AnsiConsole.MarkupLine(
"Example usage:\n\t <PackageReference Include=\"{0}\" Version=\"{1}\" />".EscapeMarkup(), packageId,
version);
}
} }
/// <summary> /// <summary>
@@ -437,8 +559,7 @@ public static class Program {
/// <param name="operation">A function that defines the adjustment operation to be performed on each version component.</param> /// <param name="operation">A function that defines the adjustment operation to be performed on each version component.</param>
/// <returns>A new version string with the updated major, minor, and patch components, preserving any existing tag.</returns> /// <returns>A new version string with the updated major, minor, and patch components, preserving any existing tag.</returns>
/// <exception cref="Exception">Thrown if the version string is not in the correct format.</exception> /// <exception cref="Exception">Thrown if the version string is not in the correct format.</exception>
private static string ChangeVersion(string version, int patch, int minor, int major, private static string ChangeVersion(string version, int delta, IncrementTarget target) {
Func<int, int, int> operation) {
string[] split = version.Split('.'); string[] split = version.Split('.');
if (split.Length != 3) { if (split.Length != 3) {
throw new Exception(string.Format(Exceptions.version_string_not_formatted_correctly, version)); throw new Exception(string.Format(Exceptions.version_string_not_formatted_correctly, version));
@@ -455,9 +576,23 @@ public static class Program {
throw new Exception(string.Format(Exceptions.version_string_not_formatted_correctly, version)); throw new Exception(string.Format(Exceptions.version_string_not_formatted_correctly, version));
int[] parsedVersion = split.Select(int.Parse).ToArray(); int[] parsedVersion = split.Select(int.Parse).ToArray();
switch (target) {
case IncrementTarget.Major:
parsedVersion[0] += delta;
parsedVersion[1] = 0;
parsedVersion[2] = 0;
break;
case IncrementTarget.Minor:
parsedVersion[1] += delta;
parsedVersion[2] = 0;
break;
case IncrementTarget.Patch:
parsedVersion[2] += delta;
break;
}
return return
$"{operation(parsedVersion[0], major)}.{operation(parsedVersion[1], minor)}.{operation(parsedVersion[2], patch)}{tag}"; $"{parsedVersion[0]}.{parsedVersion[1]}.{parsedVersion[2]}{tag}";
} }
private static void ShowError(string message, params object[] args) { private static void ShowError(string message, params object[] args) {
-54
View File
@@ -1,54 +0,0 @@
using System.Xml;
namespace aeqw89.tools.Publish;
internal class Project {
public string Path { get; }
private XmlDocument Document { get; }
public List<PropertyGroup> PropertyGroups { get; }
public List<ItemGroup> ItemGroups { get; }
private Project(string path, XmlDocument doc) {
Path = path;
Document = doc;
// Build PropertyGroups
PropertyGroups = doc.DocumentElement!
.SelectNodes("./PropertyGroup")!
.OfType<XmlElement>()
.Select(e => new PropertyGroup(e))
.ToList();
// Build ItemGroups (+ their Items)
ItemGroups = doc.DocumentElement!
.SelectNodes("./ItemGroup")!
.OfType<XmlElement>()
.Select(e => new ItemGroup(e))
.ToList();
// Ensure at least one ItemGroup exists (some csprojs omit it until first item is added)
if (ItemGroups.Count == 0) {
var ig = doc.CreateElement("ItemGroup", doc.DocumentElement!.NamespaceURI);
doc.DocumentElement!.AppendChild(ig);
ItemGroups.Add(new ItemGroup((XmlElement)ig));
}
}
public static Project Load(string path) {
var doc = new XmlDocument();
doc.PreserveWhitespace = false;
doc.Load(path);
return new Project(path, doc);
}
public void Save() {
var settings = new XmlWriterSettings {
Indent = true,
IndentChars = " ",
NewLineChars = Environment.NewLine,
NewLineHandling = NewLineHandling.Replace
};
using var writer = XmlWriter.Create(Path, settings);
Document.Save(writer);
}
}
+6 -1
View File
@@ -1,5 +1,6 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Xml; using System.Xml;
using aeqw89.xml.ProjectFile;
namespace aeqw89.tools.Publish; namespace aeqw89.tools.Publish;
@@ -105,6 +106,7 @@ internal class ProjectFile {
} }
set("Version", "1.0.0"); set("Version", "1.0.0");
set("PackageVersion", "1.0.0");
set("Title", System.IO.Path.GetFileNameWithoutExtension(Path)); set("Title", System.IO.Path.GetFileNameWithoutExtension(Path));
set("Authors", ""); set("Authors", "");
set("Company", ""); set("Company", "");
@@ -212,5 +214,8 @@ internal class ProjectFile {
public string GetVersion() => MainPropertyGroup.GetProperty("Version"); public string GetVersion() => MainPropertyGroup.GetProperty("Version");
public void SetVersion(string version) => MainPropertyGroup.SetProperty("Version", version); public void SetVersion(string version) {
MainPropertyGroup.SetProperty("Version", version);
MainPropertyGroup.SetProperty("PackageVersion", version);
}
} }
-7
View File
@@ -1,7 +0,0 @@
using System.Xml;
namespace aeqw89.tools.Publish;
internal sealed class ProjectReference : Item {
public ProjectReference(XmlElement node) : base(node) { }
}
-28
View File
@@ -1,28 +0,0 @@
using System.Xml;
namespace aeqw89.tools.Publish;
internal class PropertyGroup {
private readonly XmlElement _element;
public PropertyGroup(XmlElement element) => _element = element;
public bool HasProperty(string name) => _element.SelectSingleNode($"./{name}") is XmlElement;
public string GetProperty(string name) {
var node = _element.SelectSingleNode($"./{name}") as XmlElement;
return node?.InnerText ?? string.Empty;
}
public void SetProperty(string name, string value) {
var node = _element.SelectSingleNode($"./{name}") as XmlElement;
if (node == null) {
node = _element.OwnerDocument!.CreateElement(name, _element.NamespaceURI);
_element.AppendChild(node);
}
node.InnerText = value ?? string.Empty;
}
public int Count => _element.ChildNodes.OfType<XmlElement>().Count();
public void Remove() => _element.ParentNode!.RemoveChild(_element);
}
+10 -18
View File
@@ -1,6 +1,8 @@
// Required namespaces: // Required namespaces:
// System, System.IO, System.Linq, System.Text, System.Text.RegularExpressions, System.Collections.Generic, Renci.SshNet // System, System.IO, System.Linq, System.Text, System.Text.RegularExpressions, System.Collections.Generic, Renci.SshNet
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@@ -21,10 +23,11 @@ public record Host(
); );
public static class SshHosts { public static class SshHosts {
public static List<Host> Hosts { get; set; } private static ImmutableDictionary<string, Host> hosts;
public static IReadOnlyDictionary<string, Host> Hosts => hosts;
static SshHosts() { static SshHosts() {
Hosts = new List<Host>(); var hosts = new Dictionary<string, Host>();
var path = Path.Combine( var path = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
@@ -124,7 +127,7 @@ public static class SshHosts {
foreach (var f in currentIdentityFiles) idFiles.Add(ExpandPath(f)); foreach (var f in currentIdentityFiles) idFiles.Add(ExpandPath(f));
} }
Hosts.Add(new Host( hosts.Add(n, new Host(
Name: n, Name: n,
Hostname: hn, Hostname: hn,
User: currentUser ?? string.Empty, User: currentUser ?? string.Empty,
@@ -233,6 +236,7 @@ public static class SshHosts {
} }
Flush(); Flush();
SshHosts.hosts = hosts.ToImmutableDictionary();
} }
// Builds a ConnectionInfo from a parsed host, ensuring all ~/.ssh private keys are tried. // Builds a ConnectionInfo from a parsed host, ensuring all ~/.ssh private keys are tried.
@@ -345,23 +349,11 @@ public static class SshHosts {
public static Host Get(string name) { public static Host Get(string name) {
for (int i = 0; i < Hosts.Count; i++) { return TryGetHost(name, out var h) ? h : throw new KeyNotFoundException($"SSH host '{name}' not found.");
if (string.Equals(Hosts[i].Name, name, StringComparison.OrdinalIgnoreCase)) {
return Hosts[i];
}
}
throw new KeyNotFoundException($"SSH host '{name}' not found.");
} }
public static bool TryGetHost(string name, out Host host) { public static bool TryGetHost(string name, [NotNullWhen(true)] out Host? host) {
for (int i = 0; i < Hosts.Count; i++) { return Hosts.TryGetValue(name, out host);
if (string.Equals(Hosts[i].Name, name, StringComparison.OrdinalIgnoreCase)) {
host = Hosts[i];
return true;
}
}
host = default!;
return false;
} }
public static Renci.SshNet.ConnectionInfo GetConnection(string name) public static Renci.SshNet.ConnectionInfo GetConnection(string name)
@@ -5,13 +5,13 @@
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<LangVersion>preview</LangVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="aeqw89.xml.ProjectFile" Version="1.0.3" />
<PackageReference Include="Spectre.Console" Version="0.51.2-preview.0.1" /> <PackageReference Include="Spectre.Console" Version="0.51.2-preview.0.1" />
<PackageReference Include="Spectre.Console.Cli" Version="0.51.2-preview.0.1" />
<PackageReference Include="SSH.NET" Version="2025.0.0" /> <PackageReference Include="SSH.NET" Version="2025.0.0" />
<PackageReference Include="VsTools.Projects" Version="1.2.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("aeqw89.tools.Publish")] [assembly: System.Reflection.AssemblyCompanyAttribute("aeqw89.tools.Publish")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+b61d0836ac23522cf42987fbed9474a3bda3632e")]
[assembly: System.Reflection.AssemblyProductAttribute("aeqw89.tools.Publish")] [assembly: System.Reflection.AssemblyProductAttribute("aeqw89.tools.Publish")]
[assembly: System.Reflection.AssemblyTitleAttribute("aeqw89.tools.Publish")] [assembly: System.Reflection.AssemblyTitleAttribute("aeqw89.tools.Publish")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
e3dc9f23098d7e7631e5f51a024428b60b92087a4a264306a861bae3c79e94dd 7fc87e3000a58eaf1f393990c041ae903924d7e468beb21b7ca46d984853ce80
@@ -1,5 +1,7 @@
is_global = true is_global = true
build_property.TargetFramework = net9.0 build_property.TargetFramework = net9.0
build_property.TargetFrameworkIdentifier = .NETCoreApp
build_property.TargetFrameworkVersion = v9.0
build_property.TargetPlatformMinVersion = build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb = build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids = build_property.ProjectTypeGuids =
@@ -1,8 +1,8 @@
// <auto-generated/> // <auto-generated/>
global using global::System; global using System;
global using global::System.Collections.Generic; global using System.Collections.Generic;
global using global::System.IO; global using System.IO;
global using global::System.Linq; global using System.Linq;
global using global::System.Net.Http; global using System.Net.Http;
global using global::System.Threading; global using System.Threading;
global using global::System.Threading.Tasks; global using System.Threading.Tasks;
@@ -33,3 +33,4 @@ C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\Microsoft.Extensions.Logging.Abstractions.dll C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\Microsoft.Extensions.Logging.Abstractions.dll
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\Renci.SshNet.dll C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\Renci.SshNet.dll
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.sourcelink.json
Binary file not shown.
@@ -20,6 +20,7 @@
"net9.0" "net9.0"
], ],
"sources": { "sources": {
"C:\\Users\\qwsdc\\packages": {},
"https://api.nuget.org/v3/index.json": {}, "https://api.nuget.org/v3/index.json": {},
"https://nuget.pkg.github.com/qwsdcvghyu89/index.json": {} "https://nuget.pkg.github.com/qwsdcvghyu89/index.json": {}
}, },
@@ -39,7 +40,7 @@
"auditLevel": "low", "auditLevel": "low",
"auditMode": "direct" "auditMode": "direct"
}, },
"SdkAnalysisLevel": "9.0.100" "SdkAnalysisLevel": "10.0.100"
}, },
"frameworks": { "frameworks": {
"net9.0": { "net9.0": {
@@ -53,13 +54,9 @@
"target": "Package", "target": "Package",
"version": "[0.51.2-preview.0.1, )" "version": "[0.51.2-preview.0.1, )"
}, },
"Spectre.Console.Cli": { "aeqw89.xml.ProjectFile": {
"target": "Package", "target": "Package",
"version": "[0.51.2-preview.0.1, )" "version": "[1.0.3, )"
},
"VsTools.Projects": {
"target": "Package",
"version": "[1.2.0, )"
} }
}, },
"imports": [ "imports": [
@@ -73,12 +70,30 @@
], ],
"assetTargetFallback": true, "assetTargetFallback": true,
"warn": true, "warn": true,
"downloadDependencies": [
{
"name": "Microsoft.AspNetCore.App.Ref",
"version": "[9.0.9, 9.0.9]"
},
{
"name": "Microsoft.NETCore.App.Host.win-x64",
"version": "[9.0.9, 9.0.9]"
},
{
"name": "Microsoft.NETCore.App.Ref",
"version": "[9.0.9, 9.0.9]"
},
{
"name": "Microsoft.WindowsDesktop.App.Ref",
"version": "[9.0.9, 9.0.9]"
}
],
"frameworkReferences": { "frameworkReferences": {
"Microsoft.NETCore.App": { "Microsoft.NETCore.App": {
"privateAssets": "all" "privateAssets": "all"
} }
}, },
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.101/PortableRuntimeIdentifierGraph.json" "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100-rc.1.25451.107/PortableRuntimeIdentifierGraph.json"
} }
} }
} }
@@ -7,7 +7,7 @@
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot> <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\qwsdc\.nuget\packages\</NuGetPackageFolders> <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\qwsdc\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle> <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.14.0</NuGetToolVersion> <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' "> <ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\qwsdc\.nuget\packages\" /> <SourceRoot Include="C:\Users\qwsdc\.nuget\packages\" />
+44 -131
View File
@@ -2,6 +2,15 @@
"version": 3, "version": 3,
"targets": { "targets": {
"net9.0": { "net9.0": {
"aeqw89.xml.ProjectFile/1.0.3": {
"type": "package",
"compile": {
"lib/net9.0/aeqw89.xml.ProjectFile.dll": {}
},
"runtime": {
"lib/net9.0/aeqw89.xml.ProjectFile.dll": {}
}
},
"BouncyCastle.Cryptography/2.5.1": { "BouncyCastle.Cryptography/2.5.1": {
"type": "package", "type": "package",
"compile": { "compile": {
@@ -63,54 +72,6 @@
} }
} }
}, },
"Spectre.Console.Cli/0.51.2-preview.0.1": {
"type": "package",
"dependencies": {
"Spectre.Console": "0.51.2-preview.0.1"
},
"compile": {
"lib/net9.0/Spectre.Console.Cli.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net9.0/Spectre.Console.Cli.dll": {
"related": ".xml"
}
},
"resource": {
"lib/net9.0/de/Spectre.Console.Cli.resources.dll": {
"locale": "de"
},
"lib/net9.0/es/Spectre.Console.Cli.resources.dll": {
"locale": "es"
},
"lib/net9.0/fr/Spectre.Console.Cli.resources.dll": {
"locale": "fr"
},
"lib/net9.0/it/Spectre.Console.Cli.resources.dll": {
"locale": "it"
},
"lib/net9.0/ja/Spectre.Console.Cli.resources.dll": {
"locale": "ja"
},
"lib/net9.0/ko/Spectre.Console.Cli.resources.dll": {
"locale": "ko"
},
"lib/net9.0/pt/Spectre.Console.Cli.resources.dll": {
"locale": "pt"
},
"lib/net9.0/ru/Spectre.Console.Cli.resources.dll": {
"locale": "ru"
},
"lib/net9.0/sv/Spectre.Console.Cli.resources.dll": {
"locale": "sv"
},
"lib/net9.0/zh-Hans/Spectre.Console.Cli.resources.dll": {
"locale": "zh-Hans"
}
}
},
"SSH.NET/2025.0.0": { "SSH.NET/2025.0.0": {
"type": "package", "type": "package",
"dependencies": { "dependencies": {
@@ -127,19 +88,21 @@
"related": ".xml" "related": ".xml"
} }
} }
},
"VsTools.Projects/1.2.0": {
"type": "package",
"compile": {
"lib/netstandard2.0/VsTools.Projects.dll": {}
},
"runtime": {
"lib/netstandard2.0/VsTools.Projects.dll": {}
}
} }
} }
}, },
"libraries": { "libraries": {
"aeqw89.xml.ProjectFile/1.0.3": {
"sha512": "AkCw9edHUg7G9/jAA/zSgwsz/nHnAs7gvs9tCslibNnzXTJOweflSsqO+GcoWVP5QGgU4DhgMrJQgUNY6EBXNQ==",
"type": "package",
"path": "aeqw89.xml.projectfile/1.0.3",
"files": [
".nupkg.metadata",
"aeqw89.xml.projectfile.1.0.3.nupkg.sha512",
"aeqw89.xml.projectfile.nuspec",
"lib/net9.0/aeqw89.xml.ProjectFile.dll"
]
},
"BouncyCastle.Cryptography/2.5.1": { "BouncyCastle.Cryptography/2.5.1": {
"sha512": "zy8TMeTP+1FH2NrLaNZtdRbBdq7u5MI+NFZQOBSM69u5RFkciinwzV2eveY6Kjf5MzgsYvvl6kTStsj3JrXqkg==", "sha512": "zy8TMeTP+1FH2NrLaNZtdRbBdq7u5MI+NFZQOBSM69u5RFkciinwzV2eveY6Kjf5MzgsYvvl6kTStsj3JrXqkg==",
"type": "package", "type": "package",
@@ -284,55 +247,6 @@
"spectre.console.nuspec" "spectre.console.nuspec"
] ]
}, },
"Spectre.Console.Cli/0.51.2-preview.0.1": {
"sha512": "sgcQ28dkBJG66JU+BI/vhXvgqYOS+0S2OaW5sYkpShk0MzHO2hnnyg8Ef636NG6U+OmIALVZ69CP3oImeUUrag==",
"type": "package",
"path": "spectre.console.cli/0.51.2-preview.0.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"README.md",
"lib/net8.0/Spectre.Console.Cli.dll",
"lib/net8.0/Spectre.Console.Cli.xml",
"lib/net8.0/de/Spectre.Console.Cli.resources.dll",
"lib/net8.0/es/Spectre.Console.Cli.resources.dll",
"lib/net8.0/fr/Spectre.Console.Cli.resources.dll",
"lib/net8.0/it/Spectre.Console.Cli.resources.dll",
"lib/net8.0/ja/Spectre.Console.Cli.resources.dll",
"lib/net8.0/ko/Spectre.Console.Cli.resources.dll",
"lib/net8.0/pt/Spectre.Console.Cli.resources.dll",
"lib/net8.0/ru/Spectre.Console.Cli.resources.dll",
"lib/net8.0/sv/Spectre.Console.Cli.resources.dll",
"lib/net8.0/zh-Hans/Spectre.Console.Cli.resources.dll",
"lib/net9.0/Spectre.Console.Cli.dll",
"lib/net9.0/Spectre.Console.Cli.xml",
"lib/net9.0/de/Spectre.Console.Cli.resources.dll",
"lib/net9.0/es/Spectre.Console.Cli.resources.dll",
"lib/net9.0/fr/Spectre.Console.Cli.resources.dll",
"lib/net9.0/it/Spectre.Console.Cli.resources.dll",
"lib/net9.0/ja/Spectre.Console.Cli.resources.dll",
"lib/net9.0/ko/Spectre.Console.Cli.resources.dll",
"lib/net9.0/pt/Spectre.Console.Cli.resources.dll",
"lib/net9.0/ru/Spectre.Console.Cli.resources.dll",
"lib/net9.0/sv/Spectre.Console.Cli.resources.dll",
"lib/net9.0/zh-Hans/Spectre.Console.Cli.resources.dll",
"lib/netstandard2.0/Spectre.Console.Cli.dll",
"lib/netstandard2.0/Spectre.Console.Cli.xml",
"lib/netstandard2.0/de/Spectre.Console.Cli.resources.dll",
"lib/netstandard2.0/es/Spectre.Console.Cli.resources.dll",
"lib/netstandard2.0/fr/Spectre.Console.Cli.resources.dll",
"lib/netstandard2.0/it/Spectre.Console.Cli.resources.dll",
"lib/netstandard2.0/ja/Spectre.Console.Cli.resources.dll",
"lib/netstandard2.0/ko/Spectre.Console.Cli.resources.dll",
"lib/netstandard2.0/pt/Spectre.Console.Cli.resources.dll",
"lib/netstandard2.0/ru/Spectre.Console.Cli.resources.dll",
"lib/netstandard2.0/sv/Spectre.Console.Cli.resources.dll",
"lib/netstandard2.0/zh-Hans/Spectre.Console.Cli.resources.dll",
"logo.png",
"spectre.console.cli.0.51.2-preview.0.1.nupkg.sha512",
"spectre.console.cli.nuspec"
]
},
"SSH.NET/2025.0.0": { "SSH.NET/2025.0.0": {
"sha512": "AKYbB+q2zFkNQbBFx5gXdv+Wje0baBtADQ35WnMKi4bg1ka74wTQtWoPd+fOWcydohdfsD0nfT8ErMOAPxtSfA==", "sha512": "AKYbB+q2zFkNQbBFx5gXdv+Wje0baBtADQ35WnMKi4bg1ka74wTQtWoPd+fOWcydohdfsD0nfT8ErMOAPxtSfA==",
"type": "package", "type": "package",
@@ -355,29 +269,13 @@
"ssh.net.2025.0.0.nupkg.sha512", "ssh.net.2025.0.0.nupkg.sha512",
"ssh.net.nuspec" "ssh.net.nuspec"
] ]
},
"VsTools.Projects/1.2.0": {
"sha512": "Zja9D1HlSi+6goiAYUkcuE1dUC7MyoU4ZiXCNMcQ6JFNloHpwO8ne7cATi4jeMco56TB3Trzv+vtAiK4jDydlw==",
"type": "package",
"path": "vstools.projects/1.2.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/net452/VsTools.Projects.dll",
"lib/net462/VsTools.Projects.dll",
"lib/net48/VsTools.Projects.dll",
"lib/netstandard2.0/VsTools.Projects.dll",
"vstools.projects.1.2.0.nupkg.sha512",
"vstools.projects.nuspec"
]
} }
}, },
"projectFileDependencyGroups": { "projectFileDependencyGroups": {
"net9.0": [ "net9.0": [
"SSH.NET >= 2025.0.0", "SSH.NET >= 2025.0.0",
"Spectre.Console >= 0.51.2-preview.0.1", "Spectre.Console >= 0.51.2-preview.0.1",
"Spectre.Console.Cli >= 0.51.2-preview.0.1", "aeqw89.xml.ProjectFile >= 1.0.3"
"VsTools.Projects >= 1.2.0"
] ]
}, },
"packageFolders": { "packageFolders": {
@@ -399,6 +297,7 @@
"net9.0" "net9.0"
], ],
"sources": { "sources": {
"C:\\Users\\qwsdc\\packages": {},
"https://api.nuget.org/v3/index.json": {}, "https://api.nuget.org/v3/index.json": {},
"https://nuget.pkg.github.com/qwsdcvghyu89/index.json": {} "https://nuget.pkg.github.com/qwsdcvghyu89/index.json": {}
}, },
@@ -418,7 +317,7 @@
"auditLevel": "low", "auditLevel": "low",
"auditMode": "direct" "auditMode": "direct"
}, },
"SdkAnalysisLevel": "9.0.100" "SdkAnalysisLevel": "10.0.100"
}, },
"frameworks": { "frameworks": {
"net9.0": { "net9.0": {
@@ -432,13 +331,9 @@
"target": "Package", "target": "Package",
"version": "[0.51.2-preview.0.1, )" "version": "[0.51.2-preview.0.1, )"
}, },
"Spectre.Console.Cli": { "aeqw89.xml.ProjectFile": {
"target": "Package", "target": "Package",
"version": "[0.51.2-preview.0.1, )" "version": "[1.0.3, )"
},
"VsTools.Projects": {
"target": "Package",
"version": "[1.2.0, )"
} }
}, },
"imports": [ "imports": [
@@ -452,12 +347,30 @@
], ],
"assetTargetFallback": true, "assetTargetFallback": true,
"warn": true, "warn": true,
"downloadDependencies": [
{
"name": "Microsoft.AspNetCore.App.Ref",
"version": "[9.0.9, 9.0.9]"
},
{
"name": "Microsoft.NETCore.App.Host.win-x64",
"version": "[9.0.9, 9.0.9]"
},
{
"name": "Microsoft.NETCore.App.Ref",
"version": "[9.0.9, 9.0.9]"
},
{
"name": "Microsoft.WindowsDesktop.App.Ref",
"version": "[9.0.9, 9.0.9]"
}
],
"frameworkReferences": { "frameworkReferences": {
"Microsoft.NETCore.App": { "Microsoft.NETCore.App": {
"privateAssets": "all" "privateAssets": "all"
} }
}, },
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.101/PortableRuntimeIdentifierGraph.json" "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100-rc.1.25451.107/PortableRuntimeIdentifierGraph.json"
} }
} }
} }
+6 -3
View File
@@ -1,16 +1,19 @@
{ {
"version": 2, "version": 2,
"dgSpecHash": "KOrx7rOcVCU=", "dgSpecHash": "lSSpLey1hfc=",
"success": true, "success": true,
"projectFilePath": "C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\aeqw89.tools.Publish.csproj", "projectFilePath": "C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\aeqw89.tools.Publish.csproj",
"expectedPackageFiles": [ "expectedPackageFiles": [
"C:\\Users\\qwsdc\\.nuget\\packages\\aeqw89.xml.projectfile\\1.0.3\\aeqw89.xml.projectfile.1.0.3.nupkg.sha512",
"C:\\Users\\qwsdc\\.nuget\\packages\\bouncycastle.cryptography\\2.5.1\\bouncycastle.cryptography.2.5.1.nupkg.sha512", "C:\\Users\\qwsdc\\.nuget\\packages\\bouncycastle.cryptography\\2.5.1\\bouncycastle.cryptography.2.5.1.nupkg.sha512",
"C:\\Users\\qwsdc\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\8.0.2\\microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512", "C:\\Users\\qwsdc\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\8.0.2\\microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512",
"C:\\Users\\qwsdc\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\8.0.3\\microsoft.extensions.logging.abstractions.8.0.3.nupkg.sha512", "C:\\Users\\qwsdc\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\8.0.3\\microsoft.extensions.logging.abstractions.8.0.3.nupkg.sha512",
"C:\\Users\\qwsdc\\.nuget\\packages\\spectre.console\\0.51.2-preview.0.1\\spectre.console.0.51.2-preview.0.1.nupkg.sha512", "C:\\Users\\qwsdc\\.nuget\\packages\\spectre.console\\0.51.2-preview.0.1\\spectre.console.0.51.2-preview.0.1.nupkg.sha512",
"C:\\Users\\qwsdc\\.nuget\\packages\\spectre.console.cli\\0.51.2-preview.0.1\\spectre.console.cli.0.51.2-preview.0.1.nupkg.sha512",
"C:\\Users\\qwsdc\\.nuget\\packages\\ssh.net\\2025.0.0\\ssh.net.2025.0.0.nupkg.sha512", "C:\\Users\\qwsdc\\.nuget\\packages\\ssh.net\\2025.0.0\\ssh.net.2025.0.0.nupkg.sha512",
"C:\\Users\\qwsdc\\.nuget\\packages\\vstools.projects\\1.2.0\\vstools.projects.1.2.0.nupkg.sha512" "C:\\Users\\qwsdc\\.nuget\\packages\\microsoft.netcore.app.ref\\9.0.9\\microsoft.netcore.app.ref.9.0.9.nupkg.sha512",
"C:\\Users\\qwsdc\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\9.0.9\\microsoft.windowsdesktop.app.ref.9.0.9.nupkg.sha512",
"C:\\Users\\qwsdc\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\9.0.9\\microsoft.aspnetcore.app.ref.9.0.9.nupkg.sha512",
"C:\\Users\\qwsdc\\.nuget\\packages\\microsoft.netcore.app.host.win-x64\\9.0.9\\microsoft.netcore.app.host.win-x64.9.0.9.nupkg.sha512"
], ],
"logs": [] "logs": []
} }
@@ -1 +1 @@
"restore":{"projectUniqueName":"C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\aeqw89.tools.Publish.csproj","projectName":"aeqw89.tools.Publish","projectPath":"C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\aeqw89.tools.Publish.csproj","outputPath":"C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\obj\\","projectStyle":"PackageReference","originalTargetFrameworks":["net9.0"],"sources":{"https://api.nuget.org/v3/index.json":{},"https://nuget.pkg.github.com/qwsdcvghyu89/index.json":{}},"frameworks":{"net9.0":{"targetAlias":"net9.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.100"}"frameworks":{"net9.0":{"targetAlias":"net9.0","dependencies":{"SSH.NET":{"target":"Package","version":"[2025.0.0, )"},"Spectre.Console":{"target":"Package","version":"[0.51.2-preview.0.1, )"},"Spectre.Console.Cli":{"target":"Package","version":"[0.51.2-preview.0.1, )"},"VsTools.Projects":{"target":"Package","version":"[1.2.0, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\9.0.101/PortableRuntimeIdentifierGraph.json"}} "restore":{"projectUniqueName":"C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\aeqw89.tools.Publish.csproj","projectName":"aeqw89.tools.Publish","projectPath":"C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\aeqw89.tools.Publish.csproj","outputPath":"C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\obj\\","projectStyle":"PackageReference","originalTargetFrameworks":["net9.0"],"sources":{"C:\\Users\\qwsdc\\packages":{},"https://api.nuget.org/v3/index.json":{},"https://nuget.pkg.github.com/qwsdcvghyu89/index.json":{}},"frameworks":{"net9.0":{"targetAlias":"net9.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"10.0.100"}"frameworks":{"net9.0":{"targetAlias":"net9.0","dependencies":{"SSH.NET":{"target":"Package","version":"[2025.0.0, )"},"Spectre.Console":{"target":"Package","version":"[0.51.2-preview.0.1, )"},"aeqw89.xml.ProjectFile":{"target":"Package","version":"[1.0.3, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"Microsoft.AspNetCore.App.Ref","version":"[9.0.9, 9.0.9]"},{"name":"Microsoft.NETCore.App.Host.win-x64","version":"[9.0.9, 9.0.9]"},{"name":"Microsoft.NETCore.App.Ref","version":"[9.0.9, 9.0.9]"},{"name":"Microsoft.WindowsDesktop.App.Ref","version":"[9.0.9, 9.0.9]"}],"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\10.0.100-rc.1.25451.107/PortableRuntimeIdentifierGraph.json"}}
@@ -1 +1 @@
17584140259343453 17584393464480743
@@ -1 +1 @@
17584254157830058 17588788734490530