3 Commits
Author SHA1 Message Date
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
31 changed files with 54 additions and 378 deletions
-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) { }
}
-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;
}
}
+5 -6
View File
@@ -2,8 +2,7 @@
using System.Diagnostics;
using Renci.SshNet;
using Spectre.Console;
using Spectre.Console.Cli;
using VsTools.Projects;
using aeqw89.xml.ProjectFile;
namespace aeqw89.tools.Publish;
@@ -160,10 +159,10 @@ public static class Program {
ctx.Status = "Updating version";
var version = projectFile.GetVersion();
version = ChangeVersion(version,
Target == IncrementTarget.Patch ? delta : 0,
Target == IncrementTarget.Minor ? delta : 0,
Target == IncrementTarget.Major ? delta : 0,
(x, y) => x + y);
Target == IncrementTarget.Patch ? delta : int.MinValue,
Target == IncrementTarget.Minor ? delta : int.MinValue,
Target == IncrementTarget.Major ? delta : int.MinValue,
(x, y) => int.Clamp(x + y, 0, int.MaxValue));
projectFile.SetVersion(version);
}
-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);
}
}
+1
View File
@@ -1,5 +1,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Xml;
using aeqw89.xml.ProjectFile;
namespace aeqw89.tools.Publish;
-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:
// 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.RegularExpressions;
@@ -21,10 +23,11 @@ public record Host(
);
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() {
Hosts = new List<Host>();
var hosts = new Dictionary<string, Host>();
var path = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
@@ -124,7 +127,7 @@ public static class SshHosts {
foreach (var f in currentIdentityFiles) idFiles.Add(ExpandPath(f));
}
Hosts.Add(new Host(
hosts.Add(n, new Host(
Name: n,
Hostname: hn,
User: currentUser ?? string.Empty,
@@ -233,6 +236,7 @@ public static class SshHosts {
}
Flush();
SshHosts.hosts = hosts.ToImmutableDictionary();
}
// 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) {
for (int i = 0; i < Hosts.Count; i++) {
if (string.Equals(Hosts[i].Name, name, StringComparison.OrdinalIgnoreCase)) {
return Hosts[i];
}
}
throw new KeyNotFoundException($"SSH host '{name}' not found.");
return TryGetHost(name, out var h) ? h : throw new KeyNotFoundException($"SSH host '{name}' not found.");
}
public static bool TryGetHost(string name, out Host host) {
for (int i = 0; i < Hosts.Count; i++) {
if (string.Equals(Hosts[i].Name, name, StringComparison.OrdinalIgnoreCase)) {
host = Hosts[i];
return true;
}
}
host = default!;
return false;
public static bool TryGetHost(string name, [NotNullWhen(true)] out Host? host) {
return Hosts.TryGetValue(name, out host);
}
public static Renci.SshNet.ConnectionInfo GetConnection(string name)
@@ -8,10 +8,9 @@
</PropertyGroup>
<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.Cli" Version="0.51.2-preview.0.1" />
<PackageReference Include="SSH.NET" Version="2025.0.0" />
<PackageReference Include="VsTools.Projects" Version="1.2.0" />
</ItemGroup>
<ItemGroup>
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("aeqw89.tools.Publish")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+81bb2ea5c43fe48d78b65dc9e825889d8e041819")]
[assembly: System.Reflection.AssemblyProductAttribute("aeqw89.tools.Publish")]
[assembly: System.Reflection.AssemblyTitleAttribute("aeqw89.tools.Publish")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
e3dc9f23098d7e7631e5f51a024428b60b92087a4a264306a861bae3c79e94dd
53ec5207a57f615a2bd949ca74f6fa9f51b319acb2da66e55751d6a902498945
@@ -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.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\obj\Debug\net9.0\aeqw89.tools.Publish.sourcelink.json
Binary file not shown.
@@ -20,6 +20,7 @@
"net9.0"
],
"sources": {
"C:\\Users\\qwsdc\\packages": {},
"https://api.nuget.org/v3/index.json": {},
"https://nuget.pkg.github.com/qwsdcvghyu89/index.json": {}
},
@@ -53,13 +54,9 @@
"target": "Package",
"version": "[0.51.2-preview.0.1, )"
},
"Spectre.Console.Cli": {
"aeqw89.xml.ProjectFile": {
"target": "Package",
"version": "[0.51.2-preview.0.1, )"
},
"VsTools.Projects": {
"target": "Package",
"version": "[1.2.0, )"
"version": "[1.0.3, )"
}
},
"imports": [
+24 -129
View File
@@ -2,6 +2,15 @@
"version": 3,
"targets": {
"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": {
"type": "package",
"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": {
"type": "package",
"dependencies": {
@@ -127,19 +88,21 @@
"related": ".xml"
}
}
},
"VsTools.Projects/1.2.0": {
"type": "package",
"compile": {
"lib/netstandard2.0/VsTools.Projects.dll": {}
},
"runtime": {
"lib/netstandard2.0/VsTools.Projects.dll": {}
}
}
}
},
"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": {
"sha512": "zy8TMeTP+1FH2NrLaNZtdRbBdq7u5MI+NFZQOBSM69u5RFkciinwzV2eveY6Kjf5MzgsYvvl6kTStsj3JrXqkg==",
"type": "package",
@@ -284,55 +247,6 @@
"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": {
"sha512": "AKYbB+q2zFkNQbBFx5gXdv+Wje0baBtADQ35WnMKi4bg1ka74wTQtWoPd+fOWcydohdfsD0nfT8ErMOAPxtSfA==",
"type": "package",
@@ -355,29 +269,13 @@
"ssh.net.2025.0.0.nupkg.sha512",
"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": {
"net9.0": [
"SSH.NET >= 2025.0.0",
"Spectre.Console >= 0.51.2-preview.0.1",
"Spectre.Console.Cli >= 0.51.2-preview.0.1",
"VsTools.Projects >= 1.2.0"
"aeqw89.xml.ProjectFile >= 1.0.3"
]
},
"packageFolders": {
@@ -399,6 +297,7 @@
"net9.0"
],
"sources": {
"C:\\Users\\qwsdc\\packages": {},
"https://api.nuget.org/v3/index.json": {},
"https://nuget.pkg.github.com/qwsdcvghyu89/index.json": {}
},
@@ -432,13 +331,9 @@
"target": "Package",
"version": "[0.51.2-preview.0.1, )"
},
"Spectre.Console.Cli": {
"aeqw89.xml.ProjectFile": {
"target": "Package",
"version": "[0.51.2-preview.0.1, )"
},
"VsTools.Projects": {
"target": "Package",
"version": "[1.2.0, )"
"version": "[1.0.3, )"
}
},
"imports": [
+3 -4
View File
@@ -1,16 +1,15 @@
{
"version": 2,
"dgSpecHash": "KOrx7rOcVCU=",
"dgSpecHash": "PlMFcEG0EnM=",
"success": true,
"projectFilePath": "C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\aeqw89.tools.Publish.csproj",
"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\\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\\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\\vstools.projects\\1.2.0\\vstools.projects.1.2.0.nupkg.sha512"
"C:\\Users\\qwsdc\\.nuget\\packages\\ssh.net\\2025.0.0\\ssh.net.2025.0.0.nupkg.sha512"
],
"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":"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, )"},"aeqw89.xml.ProjectFile":{"target":"Package","version":"[1.0.3, )"}},"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"}}
@@ -1 +1 @@
17584140259343453
17584372950452857
@@ -1 +1 @@
17584254157830058
17584377737753019