Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7d330e9368 | |||
| 61a4902ac4 | |||
| 08a221202f | |||
| d2f2f671a4 | |||
| 1f6da33b12 | |||
| 115801e161 | |||
| 769aa027c2 | |||
| 31fc8e7853 | |||
| 5467de0d1a | |||
| 207805bad3 | |||
| 6904e0cfd8 | |||
| 093da5d0f3 | |||
| c6570c1e2c | |||
| ad729133a6 | |||
| 05a0540476 | |||
| b61d0836ac | |||
| 81bb2ea5c4 |
@@ -0,0 +1,41 @@
|
|||||||
|
name: Nightly Build and Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-releases:
|
||||||
|
name: 'Build and Release Nightly'
|
||||||
|
runs-on: debian-x86
|
||||||
|
permissions:
|
||||||
|
contents: write # Ensures the GITHUB_TOKEN has permission to create/update releases
|
||||||
|
container:
|
||||||
|
image: mcr.microsoft.com/dotnet/sdk:9.0
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# 1. Run your custom MSBuild target
|
||||||
|
- name: 'Execute .NET Publish Target'
|
||||||
|
run: dotnet build aeqw89.tools.Publish/aeqw89.tools.Publish.csproj -t:PublishAll
|
||||||
|
|
||||||
|
# 2. Upload all generated archives to the 'nightly' release
|
||||||
|
- name: Update Nightly Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
tag_name: nightly
|
||||||
|
name: "Nightly Development Build"
|
||||||
|
body: |
|
||||||
|
Automated rolling nightly build from the latest commit on `main`.
|
||||||
|
|
||||||
|
**Commit:** ${{ github.sha }}
|
||||||
|
prerelease: true
|
||||||
|
# This glob pattern grabs every zip and tar.gz inside your dist folder
|
||||||
|
files: |
|
||||||
|
aeqw89.tools.Publish/dist/*.zip
|
||||||
|
aeqw89.tools.Publish/dist/*.tar.gz
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
# Default ignored files
|
|
||||||
/shelf/
|
|
||||||
/workspace.xml
|
|
||||||
# Rider ignored files
|
|
||||||
/projectSettingsUpdater.xml
|
|
||||||
/.idea.aeqw89.tools.Publish.iml
|
|
||||||
/modules.xml
|
|
||||||
/contentModel.xml
|
|
||||||
# Editor-based HTTP Client requests
|
|
||||||
/httpRequests/
|
|
||||||
# Datasource local storage ignored files
|
|
||||||
/dataSources/
|
|
||||||
/dataSources.local.xml
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
|
|
||||||
</project>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="UserContentModel">
|
|
||||||
<attachedFolders />
|
|
||||||
<explicitIncludes />
|
|
||||||
<explicitExcludes />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
**/bin
|
||||||
|
**/obj
|
||||||
|
**/dist
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
using System.Xml;
|
|
||||||
|
|
||||||
namespace aeqw89.tools.Publish;
|
|
||||||
|
|
||||||
internal sealed class Content : Item {
|
|
||||||
public Content(XmlElement node) : base(node) { }
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.Text;
|
||||||
|
using Renci.SshNet;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace aeqw89.tools.Publish;
|
||||||
|
|
||||||
|
sealed record DestinationContext(
|
||||||
|
ProgressTask Task,
|
||||||
|
ProgressContext ProgressContext,
|
||||||
|
MemoryStream Reader,
|
||||||
|
FileInfo PackageFile,
|
||||||
|
string Name,
|
||||||
|
long BufferSize,
|
||||||
|
long PackageSize
|
||||||
|
);
|
||||||
|
|
||||||
|
interface IDestination {
|
||||||
|
Task<Result<Success, ReadableError>> WaitForCompletion(CancellationToken ct = default);
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed record LocalDestination(DestinationContext Context) : IDestination {
|
||||||
|
public async Task<Result<Success, ReadableError>> WaitForCompletion(CancellationToken ct = default) {
|
||||||
|
// Path = "$USER/local-%ctx.name/%pkg.filename"
|
||||||
|
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), Context.Name, Context.PackageFile.Name);
|
||||||
|
try {
|
||||||
|
Directory.CreateDirectory(Path.GetDirectoryName(path)!); // create the directory
|
||||||
|
await using var writer = File.OpenWrite(path);
|
||||||
|
var buffer = new byte[Context.BufferSize];
|
||||||
|
int read;
|
||||||
|
do {
|
||||||
|
read = await Context.Reader.ReadAsync(buffer, ct);
|
||||||
|
writer.Write(buffer, 0, read);
|
||||||
|
Context.Task.Increment(read);
|
||||||
|
} while (read > 0);
|
||||||
|
return Success.AsResult();
|
||||||
|
} catch (Exception e) {
|
||||||
|
return new ReadableError(string.Format(Exceptions.generic_error, e), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed record CloudDestiantion(DestinationContext Context) : IDestination {
|
||||||
|
public async Task<Result<Success, ReadableError>> WaitForCompletion(CancellationToken ct = default) {
|
||||||
|
var connectionTask = Context.ProgressContext.AddTaskBefore($"Preparing cloud-{Context.Name}",
|
||||||
|
new ProgressTaskSettings() {
|
||||||
|
MaxValue = 100
|
||||||
|
}, Context.Task);
|
||||||
|
|
||||||
|
if (!SshHosts.TryGetHost(Context.Name, out var host)) {
|
||||||
|
return new ReadableError(string.Format(Exceptions.cloud_host_not_found.EscapeMarkup(), Context.Name), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var connectionInfo = SshHosts.GetConnection(Context.Name);
|
||||||
|
using var sshClient = new SshClient(connectionInfo);
|
||||||
|
|
||||||
|
if (!sshClient.IsConnected)
|
||||||
|
await sshClient.ConnectAsync(ct);
|
||||||
|
|
||||||
|
connectionTask.Increment(33); // ? One-Third of the way done (connection success).
|
||||||
|
|
||||||
|
var winC = sshClient.RunCommand("cmd /c ver");
|
||||||
|
var othC = sshClient.RunCommand("uname -s");
|
||||||
|
|
||||||
|
var os = (winC.ExitStatus, othC.ExitStatus) switch {
|
||||||
|
(0, _) => "windows",
|
||||||
|
(_, 0) => "linux",
|
||||||
|
_ => "unknown"
|
||||||
|
};
|
||||||
|
|
||||||
|
string remoteDirectory;
|
||||||
|
string packageFileDirectory;
|
||||||
|
|
||||||
|
if (os == "windows") {
|
||||||
|
var userDirC = sshClient.RunCommand("cmd /c echo %USERPROFILE%");
|
||||||
|
if (userDirC.ExitStatus != 0) { // * missing env variable case (could not work out where to place packages in remote).
|
||||||
|
return new ReadableError(string.Format(Exceptions.failed_to_prepare_server_directory, "n/a", Context.PackageFile.Name, os,
|
||||||
|
userDirC.Result), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var userDir = userDirC.Result.Trim();
|
||||||
|
remoteDirectory = RemotePath.Combine(RemoteOs.Windows, userDir, "dotnet-packages");
|
||||||
|
packageFileDirectory = RemotePath.Combine(RemoteOs.Windows, remoteDirectory, Context.PackageFile.Name);
|
||||||
|
|
||||||
|
var mkdirC = sshClient.RunCommand($"cmd /c if not exist \"{remoteDirectory}\" mkdir \"{remoteDirectory}\"");
|
||||||
|
if (mkdirC.ExitStatus != 0) { // * MKDir error case (make directory command failed on remote).
|
||||||
|
return new ReadableError(string.Format(Exceptions.failed_to_prepare_server_directory, remoteDirectory, Context.PackageFile.Name, os,
|
||||||
|
mkdirC.Result), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (os == "linux") {
|
||||||
|
var homeDirC = sshClient.RunCommand("printf %s \"$HOME\"");
|
||||||
|
if (homeDirC.ExitStatus != 0) { // * missing env variable case 2 (could not work out where to place packages in remote).
|
||||||
|
return new ReadableError(string.Format(Exceptions.failed_to_prepare_server_directory, "n/a", Context.PackageFile.Name, os,
|
||||||
|
homeDirC.Result), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var homeDir = homeDirC.Result.Trim(); // no CRLF on unix, but Trim() is safest
|
||||||
|
remoteDirectory = RemotePath.Combine(RemoteOs.Unix, homeDir, ".dotnet-packages");
|
||||||
|
packageFileDirectory = RemotePath.Combine(RemoteOs.Unix, remoteDirectory,
|
||||||
|
Context.PackageFile.Name);
|
||||||
|
|
||||||
|
// Use -p and single quotes to handle spaces safely
|
||||||
|
var mkdirC = sshClient.RunCommand($"mkdir -p '{remoteDirectory}'");
|
||||||
|
if (mkdirC.ExitStatus != 0) { // * MKDir error case (make directory command failed on remote).
|
||||||
|
return new ReadableError(string.Format(Exceptions.failed_to_prepare_server_directory, remoteDirectory, Context.PackageFile.Name,
|
||||||
|
os, mkdirC.Result), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new ReadableError(string.Format(Exceptions.failed_to_prepare_server_directory, "n/a", Context.PackageFile.Name, os,
|
||||||
|
"Unsupported OS"), false); // * MacOS failure path (or other unrecognizable oses).
|
||||||
|
}
|
||||||
|
|
||||||
|
connectionTask.Increment(33); // ? Two-Thirds of the way done (directory located and ready).
|
||||||
|
|
||||||
|
sshClient.Disconnect();
|
||||||
|
|
||||||
|
using var client = new SftpClient(connectionInfo);
|
||||||
|
if (!client.IsConnected)
|
||||||
|
await client.ConnectAsync(ct);
|
||||||
|
connectionTask.Increment(33); // ? Connection task complete (now proceeding to upload task).
|
||||||
|
connectionTask.StopTask();
|
||||||
|
|
||||||
|
await using var writer = client.OpenWrite(packageFileDirectory);
|
||||||
|
byte[] buffer = new byte[Context.BufferSize];
|
||||||
|
int read;
|
||||||
|
do {
|
||||||
|
read = await Context.Reader.ReadAsync(buffer, ct);
|
||||||
|
writer.Write(buffer, 0, read);
|
||||||
|
Context.Task.Increment(read);
|
||||||
|
} while (read > 0);
|
||||||
|
|
||||||
|
return Success.AsResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sealed record GitDestination(DestinationContext Context, string Source, string ApiKey, bool Verbose = false) : IDestination {
|
||||||
|
private static Result<string, ReadableError> GetApiKey(string host) {
|
||||||
|
var key = Environment.GetEnvironmentVariable($"git-{host}-packages-key");
|
||||||
|
if (key is null) return new ReadableError(string.Format("No key stored in EnvironmentVariables with name {0}", $"git-{host}-packages-key"), false);
|
||||||
|
return key.Ok();
|
||||||
|
}
|
||||||
|
public static Result<GitDestination, ReadableError> CreateForGitea(DestinationContext context, string repoOwner, bool verbose = false) {
|
||||||
|
// gitea source structure = https://gitea.example.com/api/packages/{owner}/nuget/index.json
|
||||||
|
var keyResult = GetApiKey("gitea");
|
||||||
|
if (keyResult is ReadableError error) return error;
|
||||||
|
return new GitDestination(context, $"https://gitea.example.com/api/packages/{repoOwner}/nuget/index.json", keyResult.Unwrap(), verbose).Ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<GitDestination, ReadableError> CreateForGithub(DestinationContext context, string repoOwner, bool verbose = false) {
|
||||||
|
// github source structure = https://nuget.pkg.github.com/NAMESPACE/index.json
|
||||||
|
// namespace usually = repoOwner
|
||||||
|
var keyResult = GetApiKey("github");
|
||||||
|
if (keyResult is ReadableError error) return error;
|
||||||
|
return new GitDestination(context, $"https://nuget.pkg.github.com/{repoOwner}/index.json", keyResult.Unwrap(), verbose).Ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Result<Success, ReadableError>> WaitForCompletion(CancellationToken ct = default) {
|
||||||
|
using var p = Process.Start(new ProcessStartInfo() {
|
||||||
|
FileName = "dotnet",
|
||||||
|
Arguments = $"nuget push \"{Context.PackageFile.FullName}\" -s {Source} -k {ApiKey}",
|
||||||
|
WorkingDirectory = Environment.CurrentDirectory,
|
||||||
|
UseShellExecute = false,
|
||||||
|
RedirectStandardOutput = true,
|
||||||
|
RedirectStandardError = true
|
||||||
|
});
|
||||||
|
|
||||||
|
using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);
|
||||||
|
StringBuilder errorLines = new();
|
||||||
|
p?.ErrorDataReceived += (sender, eventArgs) => {
|
||||||
|
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();
|
||||||
|
|
||||||
|
Context.Task.Increment(Context.PackageSize / 2);
|
||||||
|
if (p != null)
|
||||||
|
try {
|
||||||
|
await (p?.WaitForExitAsync(cts.Token) ?? Task.CompletedTask);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException) {
|
||||||
|
p?.Kill();
|
||||||
|
await (p?.WaitForExitAsync(ct));
|
||||||
|
}
|
||||||
|
if (p?.ExitCode != 0) {
|
||||||
|
Context.Task.StopTask();
|
||||||
|
return new ReadableError(errorLines.ToString().EscapeMarkup() + "\n" + string.Format(Exceptions.dotnet_nuget_push_failure, p?.ExitCode ?? -1), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Context.Task.Increment(Context.PackageSize / 2);
|
||||||
|
return Success.AsResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
-224
@@ -1,224 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace aeqw89.tools.Publish {
|
|
||||||
using System;
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
|
||||||
/// </summary>
|
|
||||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
|
||||||
// class via a tool like ResGen or Visual Studio.
|
|
||||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
|
||||||
// with the /str option, or rebuild your VS project.
|
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
|
||||||
internal class Exceptions {
|
|
||||||
|
|
||||||
private static global::System.Resources.ResourceManager resourceMan;
|
|
||||||
|
|
||||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
|
||||||
|
|
||||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
|
||||||
internal Exceptions() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the cached ResourceManager instance used by this class.
|
|
||||||
/// </summary>
|
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
|
||||||
get {
|
|
||||||
if (object.ReferenceEquals(resourceMan, null)) {
|
|
||||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("aeqw89.tools.Publish.Exceptions", typeof(Exceptions).Assembly);
|
|
||||||
resourceMan = temp;
|
|
||||||
}
|
|
||||||
return resourceMan;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Overrides the current thread's CurrentUICulture property for all
|
|
||||||
/// resource lookups using this strongly typed resource class.
|
|
||||||
/// </summary>
|
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static global::System.Globalization.CultureInfo Culture {
|
|
||||||
get {
|
|
||||||
return resourceCulture;
|
|
||||||
}
|
|
||||||
set {
|
|
||||||
resourceCulture = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to The cloud host '{0}' is not an entry on this user's config file..
|
|
||||||
/// </summary>
|
|
||||||
internal static string cloud_host_not_found {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("cloud_host_not_found", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to The mode '{0}' is invalid, the valid modes are [overwrite|increment].
|
|
||||||
/// </summary>
|
|
||||||
internal static string could_not_parse_mode {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("could_not_parse_mode", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to The increment target '{0}' is invalid, the valid increment targets are [patch|minor|patch].
|
|
||||||
/// </summary>
|
|
||||||
internal static string could_not_parse_target {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("could_not_parse_target", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to The 'dotnet nuget push' command failed with error message '{0}'.
|
|
||||||
/// </summary>
|
|
||||||
internal static string dotnet_nuget_push_failure {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("dotnet_nuget_push_failure", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Failed to pack; ensure that 'dotnet build' succeeds before running this program..
|
|
||||||
/// </summary>
|
|
||||||
internal static string dotnet_pack_failure {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("dotnet_pack_failure", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Could not delete temporary directory '{0}' due to error '{1}'.
|
|
||||||
/// </summary>
|
|
||||||
internal static string failed_to_clean_up {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("failed_to_clean_up", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Failde to prepare an upload directory on the path {0} for the remote host '{1}', after being detected as a {2} host. Server error is '{3}'.
|
|
||||||
/// </summary>
|
|
||||||
internal static string failed_to_prepare_server_directory {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("failed_to_prepare_server_directory", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to The flag '{0}' requires exactly '{1}' parameters. You have entered '{2}'..
|
|
||||||
/// </summary>
|
|
||||||
internal static string flag_parameter_length_incorrect {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("flag_parameter_length_incorrect", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to The '{0}' flag requires that argument with index '{1}' be of type '{2}'. You have entered '{3}' which has failed to be converted..
|
|
||||||
/// </summary>
|
|
||||||
internal static string flag_parameter_type_incorrect {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("flag_parameter_type_incorrect", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to The directory '{0}' contains multiple .csproj files; this tool can only process one at a time..
|
|
||||||
/// </summary>
|
|
||||||
internal static string found_multiple_csproj {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("found_multiple_csproj", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Something went wrong loading this file; {0}.
|
|
||||||
/// </summary>
|
|
||||||
internal static string generic_error {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("generic_error", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to You must specify at least one destination..
|
|
||||||
/// </summary>
|
|
||||||
internal static string missing_destinations {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("missing_destinations", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to You must specify an increment target if you specified an increment mode; allowed increment targets are [patch|minor|major].
|
|
||||||
/// </summary>
|
|
||||||
internal static string missing_increment_target {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("missing_increment_target", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to You must specify a mode; allowed modes are [overwrite|increment].
|
|
||||||
/// </summary>
|
|
||||||
internal static string missing_mode {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("missing_mode", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to No project file was found within the current directory..
|
|
||||||
/// </summary>
|
|
||||||
internal static string no_project_in_directory {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("no_project_in_directory", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to The project file '{0}' is irreparable becuase it is missing a '{1}' property, and the value cannot be guessed..
|
|
||||||
/// </summary>
|
|
||||||
internal static string project_file_irreparable {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("project_file_irreparable", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Something went wrong; an attempt was made to load a non .csproj file as a project file..
|
|
||||||
/// </summary>
|
|
||||||
internal static string tried_loading_non_csproj_file {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("tried_loading_non_csproj_file", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to The version string '{0}' is in an unidentifiable format..
|
|
||||||
/// </summary>
|
|
||||||
internal static string version_string_not_formatted_correctly {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("version_string_not_formatted_correctly", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +1,196 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<root>
|
<root>
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
<!--
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
Microsoft ResX Schema
|
||||||
|
|
||||||
</xsd:element>
|
Version 2.0
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
The primary goals of this format is to allow a simple XML format
|
||||||
<value>text/microsoft-resx</value>
|
that is mostly human readable. The generation and parsing of the
|
||||||
</resheader>
|
various data types are done through the TypeConverter classes
|
||||||
<resheader name="version">
|
associated with the data types.
|
||||||
<value>1.3</value>
|
|
||||||
</resheader>
|
Example:
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
... ado.net/XML headers & schema ...
|
||||||
</resheader>
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="version">2.0</resheader>
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
</resheader>
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
<data name="missing_mode" xml:space="preserve">
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
<value>You must specify a mode; allowed modes are [overwrite|increment]</value>
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="could_not_parse_mode" xml:space="preserve">
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>The mode '{0}' is invalid, the valid modes are [overwrite|increment]</value>
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
</data>
|
<comment>This is a comment</comment>
|
||||||
<data name="could_not_parse_target" xml:space="preserve">
|
|
||||||
<value>The increment target '{0}' is invalid, the valid increment targets are [patch|minor|patch]</value>
|
|
||||||
</data>
|
|
||||||
<data name="missing_increment_target" xml:space="preserve">
|
|
||||||
<value>You must specify an increment target if you specified an increment mode; allowed increment targets are [patch|minor|major]</value>
|
|
||||||
</data>
|
|
||||||
<data name="missing_destinations" xml:space="preserve">
|
|
||||||
<value>You must specify at least one destination.</value>
|
|
||||||
</data>
|
|
||||||
<data name="no_project_in_directory" xml:space="preserve">
|
|
||||||
<value>No project file was found within the current directory.</value>
|
|
||||||
</data>
|
|
||||||
<data name="flag_parameter_length_incorrect" xml:space="preserve">
|
|
||||||
<value>The flag '{0}' requires exactly '{1}' parameters. You have entered '{2}'.</value>
|
|
||||||
</data>
|
|
||||||
<data name="flag_parameter_type_incorrect" xml:space="preserve">
|
|
||||||
<value>The '{0}' flag requires that argument with index '{1}' be of type '{2}'. You have entered '{3}' which has failed to be converted.</value>
|
|
||||||
</data>
|
|
||||||
<data name="version_string_not_formatted_correctly" xml:space="preserve">
|
|
||||||
<value>The version string '{0}' is in an unidentifiable format.</value>
|
|
||||||
</data>
|
|
||||||
<data name="tried_loading_non_csproj_file" xml:space="preserve">
|
|
||||||
<value>Something went wrong; an attempt was made to load a non .csproj file as a project file.</value>
|
|
||||||
</data>
|
|
||||||
<data name="generic_error" xml:space="preserve">
|
|
||||||
<value>Something went wrong loading this file; {0}</value>
|
|
||||||
</data>
|
|
||||||
<data name="found_multiple_csproj" xml:space="preserve">
|
|
||||||
<value>The directory '{0}' contains multiple .csproj files; this tool can only process one at a time.</value>
|
|
||||||
</data>
|
|
||||||
<data name="project_file_irreparable" xml:space="preserve">
|
|
||||||
<value>The project file '{0}' is irreparable becuase it is missing a '{1}' property, and the value cannot be guessed.</value>
|
|
||||||
</data>
|
|
||||||
<data name="dotnet_pack_failure" xml:space="preserve">
|
|
||||||
<value>Failed to pack; ensure that 'dotnet build' succeeds before running this program.</value>
|
|
||||||
</data>
|
|
||||||
<data name="failed_to_clean_up" xml:space="preserve">
|
|
||||||
<value>Could not delete temporary directory '{0}' due to error '{1}'</value>
|
|
||||||
</data>
|
|
||||||
<data name="cloud_host_not_found" xml:space="preserve">
|
|
||||||
<value>The cloud host '{0}' is not an entry on this user's config file.</value>
|
|
||||||
</data>
|
|
||||||
<data name="failed_to_prepare_server_directory" xml:space="preserve">
|
|
||||||
<value>Failde to prepare an upload directory on the path {0} for the remote host '{1}', after being detected as a {2} host. Server error is '{3}'</value>
|
|
||||||
</data>
|
|
||||||
<data name="dotnet_nuget_push_failure" xml:space="preserve">
|
|
||||||
<value>The 'dotnet nuget push' command failed with error message '{0}'</value>
|
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="type" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string"/>
|
||||||
|
<xsd:attribute ref="xml:space"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="name" type="xsd:string"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
|
||||||
|
<xsd:attribute ref="xml:space"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="missing_mode" xml:space="preserve">
|
||||||
|
<value>You must specify a mode; allowed modes are [overwrite|increment]</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="could_not_parse_mode" xml:space="preserve">
|
||||||
|
<value>The mode '{0}' is invalid, the valid modes are [overwrite|increment]</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="could_not_parse_target" xml:space="preserve">
|
||||||
|
<value>The increment target '{0}' is invalid, the valid increment targets are [patch|minor|patch]</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="missing_increment_target" xml:space="preserve">
|
||||||
|
<value>You must specify an increment target if you specified an increment mode; allowed increment targets are [patch|minor|major]</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="missing_destinations" xml:space="preserve">
|
||||||
|
<value>You must specify at least one destination.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="no_project_in_directory" xml:space="preserve">
|
||||||
|
<value>No project file was found within the current directory.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="flag_parameter_length_incorrect" xml:space="preserve">
|
||||||
|
<value>The flag '{0}' requires exactly '{1}' parameters. You have entered '{2}'.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="flag_parameter_type_incorrect" xml:space="preserve">
|
||||||
|
<value>The '{0}' flag requires that argument with index '{1}' be of type '{2}'. You have entered '{3}' which has failed to be converted.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="version_string_not_formatted_correctly" xml:space="preserve">
|
||||||
|
<value>The version string '{0}' is in an unidentifiable format.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="tried_loading_non_csproj_file" xml:space="preserve">
|
||||||
|
<value>Something went wrong; an attempt was made to load a non .csproj file as a project file.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="generic_error" xml:space="preserve">
|
||||||
|
<value>Something went wrong loading this file; {0}</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="found_multiple_csproj" xml:space="preserve">
|
||||||
|
<value>The directory '{0}' contains multiple .csproj files; this tool can only process one at a time.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="project_file_irreparable" xml:space="preserve">
|
||||||
|
<value>The project file '{0}' is irreparable becuase it is missing a '{1}' property, and the value cannot be guessed.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="dotnet_pack_failure" xml:space="preserve">
|
||||||
|
<value>Failed to pack with exit code '{0}'; ensure that 'dotnet build' succeeds before running this program.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="failed_to_clean_up" xml:space="preserve">
|
||||||
|
<value>Could not delete temporary directory '{0}' due to error '{1}'</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="cloud_host_not_found" xml:space="preserve">
|
||||||
|
<value>The cloud host '{0}' is not an entry on this user's config file.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="failed_to_prepare_server_directory" xml:space="preserve">
|
||||||
|
<value>Failde to prepare an upload directory on the path {0} for the remote host '{1}', after being detected as a {2} host. Server error is '{3}'</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="dotnet_nuget_push_failure" xml:space="preserve">
|
||||||
|
<value>The 'dotnet nuget push' command failed with error message '{0}'</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
|
<data name="destination_unrecognizable" xml:space="preserve">
|
||||||
|
<value>The destination '{0}' is unrecognizable.</value>
|
||||||
|
<comment/>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
+273
-388
@@ -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;
|
||||||
|
|
||||||
@@ -20,72 +20,80 @@ namespace aeqw89.tools.Publish;
|
|||||||
* e.g. publish overwrite|increment [patch|minor|major] destinations [flags]
|
* e.g. publish overwrite|increment [patch|minor|major] destinations [flags]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static class Program {
|
public static class Program {
|
||||||
public static Mode Mode { get; set; }
|
const long BufferSize = 80 * 1024; // 80 KB
|
||||||
public static IncrementTarget? Target { get; set; }
|
|
||||||
public static string[] Destinations { get; set; }
|
|
||||||
public static Dictionary<string, string[]> Flags { get; set; }
|
|
||||||
public static bool Verbose { get; set; } = false;
|
|
||||||
|
|
||||||
public static void ReadArgs(string[] args) {
|
internal record RunContext(List<Action> RestoreActions, ArgValues Args, string TempDir) {
|
||||||
if (args.Length < 1) {
|
public void Restore(bool deleteTempDir = true) {
|
||||||
ShowError(Exceptions.missing_mode.EscapeMarkup());
|
RestoreActions.ForEach(x => x());
|
||||||
ShowHelp();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Mode = args[0] switch {
|
if (deleteTempDir) {
|
||||||
"overwrite" => Mode.Overwrite,
|
try {
|
||||||
"increment" => Mode.Increment,
|
if (!Directory.Exists(TempDir)) return;
|
||||||
_ => (Mode)(-1)
|
Directory.Delete(TempDir, true);
|
||||||
};
|
AnsiConsole.MarkupLine("[yellow]Cleaned up temporary directory[/]");
|
||||||
|
}
|
||||||
if (Mode == (Mode)(-1)) {
|
catch (Exception e) {
|
||||||
ShowError(Exceptions.could_not_parse_mode.EscapeMarkup(), args[0].EscapeMarkup());
|
ShowError(string.Format(Exceptions.failed_to_clean_up.EscapeMarkup(), TempDir.EscapeMarkup(),
|
||||||
ShowHelp();
|
e.ToString().EscapeMarkup()));
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (args.Length < 2) {
|
|
||||||
if (Mode == Mode.Increment)
|
|
||||||
ShowError(Exceptions.missing_increment_target.EscapeMarkup());
|
|
||||||
else if (Mode == Mode.Overwrite)
|
|
||||||
ShowError(Exceptions.missing_destinations.EscapeMarkup());
|
|
||||||
ShowHelp();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Destinations = args[1..];
|
|
||||||
Flags = [];
|
|
||||||
if (Mode == Mode.Increment) {
|
|
||||||
if (args.Length < 3) {
|
|
||||||
ShowError(Exceptions.missing_destinations.EscapeMarkup());
|
|
||||||
ShowHelp();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Destinations = args[2..];
|
RestoreActions.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Target = args[1] switch {
|
internal record ArgValues(Mode Mode, string[] Destinations, Dictionary<string, string[]> Flags, bool Verbose, IncrementTarget? Target);
|
||||||
|
static Result<ArgValues, ReadableError> ReadArgs(string[] args) {
|
||||||
|
if (args.Length < 1) // not enough args (min = 2)
|
||||||
|
return new ReadableError(Exceptions.missing_mode.EscapeMarkup());
|
||||||
|
|
||||||
|
var mode = args[0].ToLower() switch {
|
||||||
|
"overwrite" => Mode.Overwrite,
|
||||||
|
"increment" => Mode.Increment,
|
||||||
|
_ => (Mode)(-1) // mode must be one of two values
|
||||||
|
};
|
||||||
|
|
||||||
|
if (mode == (Mode)(-1)) // invalid mode
|
||||||
|
return new ReadableError(string.Format(Exceptions.could_not_parse_mode.EscapeMarkup(), args[0].EscapeMarkup()));
|
||||||
|
|
||||||
|
if (args.Length < 2) // not enough args (min = 2)
|
||||||
|
return new ReadableError(mode switch {
|
||||||
|
Mode.Increment => Exceptions.missing_increment_target.EscapeMarkup(),
|
||||||
|
Mode.Overwrite => Exceptions.missing_destinations.EscapeMarkup(),
|
||||||
|
_ => throw new UnreachableException()
|
||||||
|
});
|
||||||
|
|
||||||
|
var destinations = args[1..]; // destinations is variarg.
|
||||||
|
Dictionary<string, string[]> flags = []; // flags is parsed last
|
||||||
|
IncrementTarget? target = null;
|
||||||
|
if (mode == Mode.Increment) {
|
||||||
|
if (args.Length < 3) // increment mode requires target version in addition to destinations
|
||||||
|
return new ReadableError(Exceptions.missing_destinations.EscapeMarkup());
|
||||||
|
|
||||||
|
destinations = args[2..]; // target is args[1] (args[0] is mode)
|
||||||
|
|
||||||
|
target = args[1].ToLower() switch {
|
||||||
"patch" => IncrementTarget.Patch,
|
"patch" => IncrementTarget.Patch,
|
||||||
"minor" => IncrementTarget.Minor,
|
"minor" => IncrementTarget.Minor,
|
||||||
"major" => IncrementTarget.Major,
|
"major" => IncrementTarget.Major,
|
||||||
_ => (IncrementTarget)(-1)
|
_ => (IncrementTarget)(-1)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (Target == (IncrementTarget)(-1)) {
|
if (target == (IncrementTarget)(-1)) // unrecognizable target entered
|
||||||
ShowError(Exceptions.could_not_parse_target.EscapeMarkup(), args[1].EscapeMarkup());
|
return new ReadableError(string.Format(Exceptions.could_not_parse_target.EscapeMarkup(), args[1].EscapeMarkup()));
|
||||||
ShowHelp();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string? firstFlag = Destinations.FirstOrDefault(x => x.StartsWith('-'));
|
string? firstFlag = destinations.FirstOrDefault(x => x.StartsWith('-')); // find the first arg that starts with '-' signifying a flag.
|
||||||
if (firstFlag == null) return;
|
if (firstFlag == null) // no flags case - return early.
|
||||||
string[] flags = Destinations.SkipWhile(x => x != firstFlag).ToArray();
|
return new Ok<ArgValues>(new ArgValues(mode, destinations, flags, false, target));
|
||||||
Flags = ReadFlags(flags);
|
string[] flagsRaw = destinations.SkipWhile(x => x != firstFlag).ToArray(); // extract flags from destinations.
|
||||||
Destinations = Destinations.TakeWhile(x => x != firstFlag).ToArray();
|
flags = ReadFlags(flagsRaw); // get flags as dictionary to args (pattern is -flag0 [arg0] [arg1] -flag1 ...)
|
||||||
Verbose = Flags.ContainsKey("--verbose") || Flags.ContainsKey("-v");
|
destinations = destinations.TakeWhile(x => x != firstFlag).ToArray(); // remove flags from destinations.
|
||||||
|
bool verbose = flags.ContainsKey("--verbose") || flags.ContainsKey("-v"); // verbosity switch is extracted early.
|
||||||
|
return new Ok<ArgValues>(new ArgValues(mode, destinations, flags, verbose, target)); // return with fully parsed flags.
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Dictionary<string, string[]> ReadFlags(string[] flags) {
|
private static Dictionary<string, string[]> ReadFlags(string[] flags) {
|
||||||
@@ -103,368 +111,245 @@ public static class Program {
|
|||||||
collected.Add(flag);
|
collected.Add(flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result[lastKey] = collected.ToArray();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task Main(string[] args) {
|
record ProjectResult(string PackageId, string Version, string RepoOwner);
|
||||||
ReadArgs(args);
|
static async Task<Result<ProjectResult, ReadableError>> PrepareProject(RunContext rctx, StatusContext ctx) {
|
||||||
|
ctx.Status = "Locating project file";
|
||||||
|
if (!ProjectFile.TryLoad(Environment.CurrentDirectory, out var projectFile, out var error))
|
||||||
|
return new ReadableError(error);
|
||||||
|
|
||||||
string packageId = "";
|
string packageId = projectFile.GetPackageId();
|
||||||
string version = "";
|
string version;
|
||||||
|
string repoOwner;
|
||||||
|
|
||||||
var result = AnsiConsole.Status()
|
|
||||||
.Spinner(Spinner.Known.Dots)
|
|
||||||
.Start<bool>("Preparing project", ctx => {
|
|
||||||
ctx.Status = "Locating project file";
|
|
||||||
if (!ProjectFile.TryLoad(Environment.CurrentDirectory, out var projectFile, out var error)) {
|
|
||||||
ShowError(error.EscapeMarkup());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
packageId = projectFile.GetPackageId();
|
|
||||||
|
|
||||||
try {
|
|
||||||
projectFile.Backup();
|
|
||||||
if (Verbose)
|
|
||||||
AnsiConsole.WriteLine(
|
|
||||||
$"Created project file backup at {projectFile.GetDefaultBackupLocation()}");
|
|
||||||
|
|
||||||
ctx.Status = "Repairing project file";
|
|
||||||
if (!Flags.ContainsKey("--skip-repair"))
|
|
||||||
if (!projectFile.TryRepair(out error)) {
|
|
||||||
ShowError(error.EscapeMarkup());
|
|
||||||
projectFile.Restore();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Mode == Mode.Increment && !Flags.ContainsKey("--simulate")) {
|
|
||||||
int delta = 1;
|
|
||||||
if (Flags.TryGetValue("--delta", out var deltaStrings)) {
|
|
||||||
if (deltaStrings.Length != 1) {
|
|
||||||
ShowError(Exceptions.flag_parameter_length_incorrect.EscapeMarkup(), "--delta", 1,
|
|
||||||
deltaStrings.Length);
|
|
||||||
projectFile.Restore();
|
|
||||||
ShowHelp();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!int.TryParse(deltaStrings[0], out delta)) {
|
|
||||||
ShowError(Exceptions.flag_parameter_type_incorrect.EscapeMarkup(), "--delta", 0, nameof(Int32),
|
|
||||||
deltaStrings[0]);
|
|
||||||
projectFile.Restore();
|
|
||||||
ShowHelp();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
projectFile.SetVersion(version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
ShowError(Exceptions.generic_error.EscapeMarkup(), e.ToString().EscapeMarkup());
|
|
||||||
projectFile.Restore();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
version = projectFile.GetVersion();
|
|
||||||
|
|
||||||
if (!Flags.ContainsKey("--simulate")) {
|
|
||||||
try {
|
|
||||||
var packageReferences = projectFile.GetPackageReferences();
|
|
||||||
foreach (var reference in packageReferences.Where(x => !projectFile.IsTransitive(x)))
|
|
||||||
projectFile.SetPrivateAssets(reference, PrivateAssetsValue.All);
|
|
||||||
foreach (var reference in packageReferences.Where(x => projectFile.IsTransitive(x)))
|
|
||||||
projectFile.RemovePackage(reference);
|
|
||||||
|
|
||||||
HashSet<string> visited = [];
|
|
||||||
var projectReferences = new Queue<Item>(projectFile.GetProjectReferences().Cast<Item>());
|
|
||||||
while (projectReferences.Count != 0) {
|
|
||||||
var reference = projectReferences.Dequeue();
|
|
||||||
visited.Add(reference.Include);
|
|
||||||
|
|
||||||
if (Verbose)
|
|
||||||
AnsiConsole.WriteLine($"Processing project reference {reference.Include} out of {visited.Count} so far");
|
|
||||||
|
|
||||||
projectFile.SetPrivateAssets(reference, PrivateAssetsValue.All);
|
|
||||||
string pathToReferencedProjectFile = projectFile.GetAbsoluteIncludePath(reference);
|
|
||||||
if (!ProjectFile.TryLoad(pathToReferencedProjectFile, out var referencedProjectFile,
|
|
||||||
out error)) {
|
|
||||||
ShowError(error.EscapeMarkup());
|
|
||||||
projectFile.Restore();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var referencedPackageReferences = referencedProjectFile.GetPackageReferences();
|
|
||||||
foreach (var package in referencedPackageReferences) {
|
|
||||||
if (Verbose)
|
|
||||||
AnsiConsole.WriteLine($"Hoisting package {package.Include} from {pathToReferencedProjectFile}");
|
|
||||||
var hoisted = projectFile.AddPackage(package);
|
|
||||||
projectFile.SetTransitive(hoisted, true);
|
|
||||||
projectFile.SetPrivateAssets(hoisted, PrivateAssetsValue.None);
|
|
||||||
referencedProjectFile.SetPrivateAssets(package, PrivateAssetsValue.All);
|
|
||||||
}
|
|
||||||
|
|
||||||
var referencedProjectReferences = referencedProjectFile.GetProjectReferences();
|
|
||||||
foreach (var project in referencedProjectReferences) {
|
|
||||||
if (!visited.Contains(project.Include))
|
|
||||||
projectReferences.Enqueue(project);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
ShowError(Exceptions.generic_error.EscapeMarkup(), e.ToString().EscapeMarkup());
|
|
||||||
projectFile.Restore();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
projectFile.Save();
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!result) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var outDir = Path.GetRandomFileName();
|
|
||||||
result = AnsiConsole.Status()
|
|
||||||
.Spinner(Spinner.Known.Dots)
|
|
||||||
.Start<bool>("Creating package with 'dotnet pack' ", ctx => {
|
|
||||||
var p = Process.Start(new ProcessStartInfo() {
|
|
||||||
FileName = "dotnet",
|
|
||||||
Arguments = $"pack -o {outDir}",
|
|
||||||
WorkingDirectory = Environment.CurrentDirectory,
|
|
||||||
UseShellExecute = Verbose,
|
|
||||||
RedirectStandardOutput = !Verbose,
|
|
||||||
RedirectStandardError = !Verbose
|
|
||||||
});
|
|
||||||
p?.WaitForExit();
|
|
||||||
return p?.ExitCode == 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!result) {
|
|
||||||
ShowError(Exceptions.dotnet_pack_failure.EscapeMarkup());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var package = Directory.GetFiles(outDir, "*.nupkg").FirstOrDefault();
|
|
||||||
if (package == null) {
|
|
||||||
ShowError(Exceptions.generic_error.EscapeMarkup());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var inMemory = await File.ReadAllBytesAsync(package);
|
|
||||||
var size = new FileInfo(package).Length;
|
|
||||||
const long bufferSize = 80 * 1024; // 80 KB
|
|
||||||
try {
|
try {
|
||||||
await AnsiConsole.Progress()
|
projectFile.Backup();
|
||||||
.AutoClear(true)
|
rctx.RestoreActions.Add(() => {
|
||||||
.HideCompleted(true)
|
projectFile.Restore();
|
||||||
.Columns(new ProgressColumn[] {
|
AnsiConsole.MarkupLine("[yellow]Restored project file from backup.[/]");
|
||||||
new TaskDescriptionColumn(),
|
});
|
||||||
new ProgressBarColumn()
|
|
||||||
.RemainingStyle(Style.Parse("dim gray slowblink"))
|
|
||||||
.CompletedStyle(Style.Parse("green strikethrough"))
|
|
||||||
.FinishedStyle("green strikethrough"),
|
|
||||||
new DownloadedColumn(),
|
|
||||||
new RemainingTimeColumn(),
|
|
||||||
new TransferSpeedColumn(),
|
|
||||||
})
|
|
||||||
.StartAsync(async ctx => {
|
|
||||||
await Parallel.ForEachAsync(Destinations, new ParallelOptions() {
|
|
||||||
MaxDegreeOfParallelism = Environment.ProcessorCount,
|
|
||||||
}, async (dest, ct) => {
|
|
||||||
using var reader = new MemoryStream(inMemory);
|
|
||||||
var task = ctx.AddTask(dest, new ProgressTaskSettings() {
|
|
||||||
MaxValue = size
|
|
||||||
});
|
|
||||||
|
|
||||||
if (dest.StartsWith("local-")) {
|
|
||||||
var name = dest[("local-".Length)..];
|
|
||||||
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
|
|
||||||
name, Path.GetFileName(package));
|
|
||||||
if (!Directory.Exists(Path.GetDirectoryName(path)))
|
|
||||||
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
|
|
||||||
await using var writer = File.OpenWrite(path);
|
|
||||||
var buffer = new byte[bufferSize];
|
|
||||||
int read;
|
|
||||||
do {
|
|
||||||
read = await reader.ReadAsync(buffer, ct);
|
|
||||||
writer.Write(buffer, 0, read);
|
|
||||||
task.Increment(read);
|
|
||||||
} while (read > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (dest.StartsWith("cloud-")) {
|
if (rctx.Args.Verbose)
|
||||||
var name = dest[("cloud-".Length)..];
|
AnsiConsole.WriteLine(
|
||||||
var connectionTask = ctx.AddTaskBefore($"Preparing cloud-{name}", new ProgressTaskSettings() {
|
$"Created project file backup at {projectFile.GetDefaultBackupLocation()}");
|
||||||
MaxValue = 100
|
|
||||||
}, task);
|
|
||||||
|
|
||||||
if (!SshHosts.TryGetHost(name, out var host)) {
|
ctx.Status = "Repairing project file";
|
||||||
ShowError(Exceptions.cloud_host_not_found.EscapeMarkup(), name);
|
if (!rctx.Args.Flags.ContainsKey("--skip-repair"))
|
||||||
return;
|
if (!projectFile.TryRepair(out error)) {
|
||||||
}
|
return new ReadableError(error.EscapeMarkup(), false);
|
||||||
|
}
|
||||||
|
|
||||||
var connectionInfo = SshHosts.GetConnection(name);
|
if (rctx.Args.Mode == Mode.Increment && !rctx.Args.Flags.ContainsKey("--simulate")) {
|
||||||
using var sshClient = new SshClient(connectionInfo);
|
int delta = 1;
|
||||||
if (!sshClient.IsConnected)
|
if (rctx.Args.Flags.TryGetValue("--delta", out var deltaStrings)) {
|
||||||
await sshClient.ConnectAsync(ct);
|
if (deltaStrings.Length != 1) {
|
||||||
connectionTask.Increment(33);
|
return new ReadableError(string.Format(Exceptions.flag_parameter_length_incorrect.EscapeMarkup(), "--delta", 1,
|
||||||
|
deltaStrings.Length));
|
||||||
|
}
|
||||||
|
|
||||||
var winC = sshClient.RunCommand("cmd /c ver");
|
if (!int.TryParse(deltaStrings[0], out delta)) {
|
||||||
var othC = sshClient.RunCommand("uname -s");
|
return new ReadableError(string.Format(Exceptions.flag_parameter_type_incorrect.EscapeMarkup(), "--delta", 0,
|
||||||
|
nameof(Int32),
|
||||||
|
deltaStrings[0]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var os = (winC.ExitStatus, othC.ExitStatus) switch {
|
ctx.Status = "Updating version";
|
||||||
(0, _) => "windows",
|
version = projectFile.GetVersion();
|
||||||
(_, 0) => "linux",
|
version = ProjectFile.ChangeVersion(version, delta, rctx.Args.Target ?? IncrementTarget.Patch).Unwrap(rctx);
|
||||||
_ => "unknown"
|
projectFile.SetVersion(version);
|
||||||
};
|
|
||||||
|
|
||||||
string remoteDirectory;
|
}
|
||||||
string packageFileDirectory;
|
|
||||||
if (os == "windows") {
|
|
||||||
var userDirC = sshClient.RunCommand("cmd /c echo %USERPROFILE%");
|
|
||||||
if (userDirC.ExitStatus != 0) {
|
|
||||||
ShowError(Exceptions.failed_to_prepare_server_directory, "n/a", name, os, userDirC.Result);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var userDir = userDirC.Result.Trim();
|
|
||||||
remoteDirectory = RemotePath.Combine(RemoteOs.Windows,userDir, "dotnet-packages");
|
|
||||||
packageFileDirectory = RemotePath.Combine(RemoteOs.Windows, remoteDirectory, Path.GetFileName(package));
|
|
||||||
|
|
||||||
var mkdirC = sshClient.RunCommand($"cmd /c if not exist \"{remoteDirectory}\" mkdir \"{remoteDirectory}\"");
|
|
||||||
if (mkdirC.ExitStatus != 0) {
|
|
||||||
ShowError(Exceptions.failed_to_prepare_server_directory, remoteDirectory, name, os, mkdirC.Result);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (os == "linux") {
|
|
||||||
var homeDirC = sshClient.RunCommand("printf %s \"$HOME\"");
|
|
||||||
if (homeDirC.ExitStatus != 0) {
|
|
||||||
ShowError(Exceptions.failed_to_prepare_server_directory, "n/a", name, os, homeDirC.Result);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var homeDir = homeDirC.Result.Trim(); // no CRLF on unix, but Trim() is safest
|
|
||||||
remoteDirectory = RemotePath.Combine(RemoteOs.Unix, homeDir, ".dotnet-packages");
|
|
||||||
packageFileDirectory = RemotePath.Combine(RemoteOs.Unix, remoteDirectory, Path.GetFileName(package));
|
|
||||||
|
|
||||||
// Use -p and single quotes to handle spaces safely
|
|
||||||
var mkdirC = sshClient.RunCommand($"mkdir -p '{remoteDirectory}'");
|
|
||||||
if (mkdirC.ExitStatus != 0) {
|
|
||||||
ShowError(Exceptions.failed_to_prepare_server_directory, remoteDirectory, name, os, mkdirC.Result);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ShowError(Exceptions.failed_to_prepare_server_directory, "n/a", name, os, "Unsupported OS");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
connectionTask.Increment(33);
|
|
||||||
|
|
||||||
sshClient.Disconnect();
|
|
||||||
|
|
||||||
using var client = new SftpClient(connectionInfo);
|
|
||||||
if (!client.IsConnected)
|
|
||||||
await client.ConnectAsync(ct);
|
|
||||||
connectionTask.Increment(33);
|
|
||||||
connectionTask.StopTask();
|
|
||||||
|
|
||||||
await using var writer = client.OpenWrite(packageFileDirectory);
|
|
||||||
byte[] buffer = new byte[bufferSize];
|
|
||||||
int read;
|
|
||||||
do {
|
|
||||||
read = await reader.ReadAsync(buffer, ct);
|
|
||||||
writer.Write(buffer, 0, read);
|
|
||||||
task.Increment(read);
|
|
||||||
} while (read > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (dest == "github") {
|
|
||||||
var p = Process.Start(new ProcessStartInfo() {
|
|
||||||
FileName = "dotnet",
|
|
||||||
Arguments = $"nuget push {package} --source github",
|
|
||||||
WorkingDirectory = Environment.CurrentDirectory,
|
|
||||||
UseShellExecute = false,
|
|
||||||
RedirectStandardOutput = !Verbose,
|
|
||||||
RedirectStandardError = !Verbose
|
|
||||||
});
|
|
||||||
|
|
||||||
if (p == null) {
|
|
||||||
ShowError(Exceptions.generic_error.EscapeMarkup());
|
|
||||||
}
|
|
||||||
|
|
||||||
task.Increment(size / 2);
|
|
||||||
if (p != null)
|
|
||||||
await p.WaitForExitAsync(ct);
|
|
||||||
if (p?.ExitCode != 0) {
|
|
||||||
ShowError(Exceptions.dotnet_nuget_push_failure, p.ExitCode);
|
|
||||||
}
|
|
||||||
task.Increment(size / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
task.StopTask();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
finally {
|
catch (Exception e) {
|
||||||
|
return new ReadableError(string.Format(Exceptions.generic_error.EscapeMarkup(), e.ToString().EscapeMarkup()), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
version = projectFile.GetVersion();
|
||||||
|
repoOwner = projectFile.GetRepositoryOwner();
|
||||||
|
|
||||||
|
|
||||||
|
if (!rctx.Args.Flags.ContainsKey("--simulate")) {
|
||||||
try {
|
try {
|
||||||
Directory.Delete(outDir, true);
|
var packageReferences = projectFile.GetPackageReferences();
|
||||||
|
foreach (var reference in packageReferences.Where(x => !projectFile.IsTransitive(x)))
|
||||||
|
projectFile.SetPrivateAssets(reference, PrivateAssetsValue.All);
|
||||||
|
foreach (var reference in packageReferences.Where(x => projectFile.IsTransitive(x)))
|
||||||
|
projectFile.RemovePackage(reference);
|
||||||
|
|
||||||
|
HashSet<string> visited = [];
|
||||||
|
var projectReferences = new Queue<Item>(projectFile.GetProjectReferences().Cast<Item>());
|
||||||
|
while (projectReferences.Count != 0) {
|
||||||
|
var reference = projectReferences.Dequeue();
|
||||||
|
visited.Add(reference.Include);
|
||||||
|
|
||||||
|
if (rctx.Args.Verbose)
|
||||||
|
AnsiConsole.WriteLine(
|
||||||
|
$"Processing project reference {reference.Include} out of {visited.Count} so far");
|
||||||
|
|
||||||
|
// if (Flags.ContainsKey("--force-private"))
|
||||||
|
projectFile.SetPrivateAssets(reference, PrivateAssetsValue.All);
|
||||||
|
string pathToReferencedProjectFile = projectFile.GetAbsoluteIncludePath(reference);
|
||||||
|
if (!ProjectFile.TryLoad(pathToReferencedProjectFile, out var referencedProjectFile,
|
||||||
|
out error)) {
|
||||||
|
return new ReadableError(error.EscapeMarkup(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var referencedPackageReferences = referencedProjectFile.GetPackageReferences();
|
||||||
|
foreach (var package in referencedPackageReferences) {
|
||||||
|
if (rctx.Args.Verbose)
|
||||||
|
AnsiConsole.WriteLine(
|
||||||
|
$"Hoisting package {package.Include} from {pathToReferencedProjectFile}");
|
||||||
|
var hoisted = projectFile.AddPackage(package);
|
||||||
|
projectFile.SetTransitive(hoisted, true);
|
||||||
|
projectFile.SetPrivateAssets(hoisted, PrivateAssetsValue.None);
|
||||||
|
referencedProjectFile.SetPrivateAssets(package, PrivateAssetsValue.All);
|
||||||
|
}
|
||||||
|
|
||||||
|
var referencedProjectReferences = referencedProjectFile.GetProjectReferences();
|
||||||
|
foreach (var project in referencedProjectReferences) {
|
||||||
|
if (!visited.Contains(project.Include))
|
||||||
|
projectReferences.Enqueue(project);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
ShowError(string.Format(Exceptions.failed_to_clean_up.EscapeMarkup(), outDir.EscapeMarkup(), e.ToString().EscapeMarkup()));
|
return new ReadableError(string.Format(Exceptions.generic_error.EscapeMarkup(), e.ToString().EscapeMarkup()), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AnsiConsole.MarkupLine("Completed processing of all destinations.");
|
|
||||||
AnsiConsole.MarkupLine("Example usage:\n\t <PackageReference Include=\"{0}\" Version=\"{1}\" />".EscapeMarkup(), packageId, version);
|
projectFile.Save();
|
||||||
|
return new Ok<ProjectResult>(new ProjectResult(packageId, version, repoOwner));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
static async Task<Result<Success, ReadableError>> PackProject(RunContext rctx, StatusContext ctx) {
|
||||||
/// Updates the version string by applying the specified operation to the major, minor, and patch components of the version.
|
DataReceivedEventHandler dataHandler = rctx.Args.Verbose switch {
|
||||||
/// </summary>
|
false => (_, _) => {},
|
||||||
/// <param name="version">The current version string in the format "major.minor.patch[-tag]".</param>
|
true => (_ , e) => {
|
||||||
/// <param name="patch">The value to apply to the patch component.</param>
|
AnsiConsole.MarkupLine("[Packing]: " + e.Data?.EscapeMarkup() ?? string.Empty);
|
||||||
/// <param name="minor">The value to apply to the minor component.</param>
|
}
|
||||||
/// <param name="major">The value to apply to the major component.</param>
|
};
|
||||||
/// <param name="operation">A function that defines the adjustment operation to be performed on each version component.</param>
|
var result = (await Shell.Dotnet.Pack(rctx.TempDir, dataHandler, dataHandler)).Unwrap(rctx);
|
||||||
/// <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>
|
|
||||||
private static string ChangeVersion(string version, int patch, int minor, int major,
|
|
||||||
Func<int, int, int> operation) {
|
|
||||||
string[] split = version.Split('.');
|
|
||||||
if (split.Length != 3) {
|
|
||||||
throw new Exception(string.Format(Exceptions.version_string_not_formatted_correctly, version));
|
|
||||||
}
|
|
||||||
|
|
||||||
string tag = "";
|
if (result.ExitCode != 0)
|
||||||
if (split[2].Contains('-')) {
|
return new ReadableError(result.Error + "\n" + string.Format(Exceptions.dotnet_pack_failure.EscapeMarkup(), result.ExitCode), false);
|
||||||
var split2 = split[2].Split('-');
|
|
||||||
split[2] = split2[0];
|
|
||||||
tag = "-" + split2[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (split.Any(x => !int.TryParse(x, out _)))
|
return Success.AsResult();
|
||||||
throw new Exception(string.Format(Exceptions.version_string_not_formatted_correctly, version));
|
|
||||||
|
|
||||||
int[] parsedVersion = split.Select(int.Parse).ToArray();
|
|
||||||
|
|
||||||
return
|
|
||||||
$"{operation(parsedVersion[0], major)}.{operation(parsedVersion[1], minor)}.{operation(parsedVersion[2], patch)}{tag}";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ShowError(string message, params object[] args) {
|
enum DestinationType {
|
||||||
|
Local,
|
||||||
|
Github,
|
||||||
|
Main,
|
||||||
|
Cloud
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task Main(string[] args) {
|
||||||
|
ArgValues? parsed = ReadArgs(args).Unwrap();
|
||||||
|
if (parsed is null) return;
|
||||||
|
|
||||||
|
RunContext rctx = new([], parsed, Path.GetRandomFileName());
|
||||||
|
|
||||||
|
Console.CancelKeyPress += (sender, eventArgs) => {
|
||||||
|
rctx.Restore();
|
||||||
|
};
|
||||||
|
|
||||||
|
var stager = new Stager(rctx);
|
||||||
|
|
||||||
|
ProjectResult? project = await stager.Spinner("Preparing project", PrepareProject);
|
||||||
|
if (project is null) return;
|
||||||
|
|
||||||
|
int destinationsProcessed = 0;
|
||||||
|
|
||||||
|
var dotnetPackResult = await stager.Spinner("Creating package with 'dotnet pack'", PackProject);
|
||||||
|
if (dotnetPackResult is null) return;
|
||||||
|
|
||||||
|
if (rctx.Args.Verbose)
|
||||||
|
AnsiConsole.MarkupLine("Successfully created package with exit code [green]{0}[/]. Processing destinations.", 0);
|
||||||
|
|
||||||
|
var progress = stager.Progress();
|
||||||
|
var task = progress.Run("push to destinations", async (rctx, ctx) => {
|
||||||
|
var pkg = await Shell.Dotnet.FindPackage(rctx.TempDir).Unwrap(rctx);
|
||||||
|
await Parallel.ForEachAsync(rctx.Args.Destinations, new ParallelOptions() {
|
||||||
|
MaxDegreeOfParallelism = Environment.ProcessorCount,
|
||||||
|
}, async (dest, ct) => {
|
||||||
|
using var reader = new MemoryStream(pkg.Read());
|
||||||
|
var task = ctx.AddTask(dest, new ProgressTaskSettings() {
|
||||||
|
MaxValue = pkg.Size()
|
||||||
|
});
|
||||||
|
|
||||||
|
DestinationType destType;
|
||||||
|
if (dest.StartsWith("local-")) {
|
||||||
|
destType = DestinationType.Local;
|
||||||
|
} else if (dest.StartsWith("cloud-")) {
|
||||||
|
destType = DestinationType.Cloud;
|
||||||
|
} else if (dest == "github") {
|
||||||
|
destType = DestinationType.Github;
|
||||||
|
} else if (dest == "main") {
|
||||||
|
destType = DestinationType.Main;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lock(rctx) {
|
||||||
|
ShowError(string.Format(Exceptions.destination_unrecognizable, dest));
|
||||||
|
ShowHelp();
|
||||||
|
}
|
||||||
|
task.StopTask();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dctx = new DestinationContext(task, ctx, reader, pkg.FileInfo, destType switch {
|
||||||
|
DestinationType.Cloud => dest["cloud-".Length..],
|
||||||
|
DestinationType.Github => dest["github".Length..],
|
||||||
|
DestinationType.Main => dest["main".Length..],
|
||||||
|
DestinationType.Local => dest["local-".Length..]
|
||||||
|
}, BufferSize, pkg.Size());
|
||||||
|
|
||||||
|
Result<IDestination, ReadableError> destinationResult = destType switch {
|
||||||
|
DestinationType.Local => new LocalDestination(dctx).Ok<IDestination>(),
|
||||||
|
DestinationType.Github => GitDestination.CreateForGithub(dctx, project.RepoOwner, rctx.Args.Verbose).UpcastSuccess<GitDestination, IDestination, ReadableError>(),
|
||||||
|
DestinationType.Main => GitDestination.CreateForGitea(dctx, project.RepoOwner, rctx.Args.Verbose).UpcastSuccess<GitDestination, IDestination, ReadableError>(),
|
||||||
|
DestinationType.Cloud => new CloudDestiantion(dctx).Ok<IDestination>(),
|
||||||
|
_ => throw new UnreachableException()
|
||||||
|
};
|
||||||
|
|
||||||
|
var destination = destinationResult.Unwrap(rctx);
|
||||||
|
|
||||||
|
var result = await destination.WaitForCompletion(ct);
|
||||||
|
lock(rctx) {
|
||||||
|
if (result.Unwrap(rctx) is not null) {
|
||||||
|
Interlocked.Increment(ref destinationsProcessed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task.StopTask();
|
||||||
|
});
|
||||||
|
|
||||||
|
return Success.AsResult();
|
||||||
|
});
|
||||||
|
|
||||||
|
await task.Value;
|
||||||
|
|
||||||
|
if (destinationsProcessed == 0) {
|
||||||
|
AnsiConsole.MarkupLine("[bold red]No destinations were processed. Reverting changes to project file.[/]");
|
||||||
|
rctx.Restore();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AnsiConsole.MarkupLine("Completed processing of all destinations.");
|
||||||
|
AnsiConsole.MarkupLine(
|
||||||
|
"Example usage:\n\t <PackageReference Include=\"{0}\" Version=\"{1}\" />".EscapeMarkup(), project.PackageId,
|
||||||
|
project.Version);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShowError(string message, params object[] args) {
|
||||||
AnsiConsole.MarkupLine($"[bold red]{message}[/]", args);
|
AnsiConsole.MarkupLine($"[bold red]{message}[/]", args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ShowHelp() {
|
public static void ShowHelp() {
|
||||||
AnsiConsole.Markup(("Usage: publish overwrite|increment [patch|minor|major] destinations [flags]\n" +
|
AnsiConsole.Markup(("Usage: publish overwrite|increment [patch|minor|major] destinations [flags]\n" +
|
||||||
"\t if mode: overwrite destinations [flags]\n" +
|
"\t if mode: overwrite destinations [flags]\n" +
|
||||||
"\t if mode: increment patch|minor|major [flags]\n").EscapeMarkup());
|
"\t if mode: increment patch|minor|major [flags]\n").EscapeMarkup());
|
||||||
|
|||||||
@@ -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,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", "");
|
||||||
@@ -112,6 +114,7 @@ internal class ProjectFile {
|
|||||||
set("PackageProjectUrl", "", required: false);
|
set("PackageProjectUrl", "", required: false);
|
||||||
set("RepositoryUrl", "", required: true);
|
set("RepositoryUrl", "", required: true);
|
||||||
set("PackageId", "", required: true);
|
set("PackageId", "", required: true);
|
||||||
|
set("RepositoryOwner", "", required: true);
|
||||||
|
|
||||||
if (failed.Count > 0) {
|
if (failed.Count > 0) {
|
||||||
error = string.Format(Exceptions.project_file_irreparable, Path, string.Join(", ", failed));
|
error = string.Format(Exceptions.project_file_irreparable, Path, string.Join(", ", failed));
|
||||||
@@ -122,6 +125,10 @@ internal class ProjectFile {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GetRepositoryOwner() {
|
||||||
|
return MainPropertyGroup.GetProperty("RepositoryOwner");
|
||||||
|
}
|
||||||
|
|
||||||
public List<PackageReference> GetPackageReferences() {
|
public List<PackageReference> GetPackageReferences() {
|
||||||
return Project.ItemGroups
|
return Project.ItemGroups
|
||||||
.SelectMany(g => g.Items)
|
.SelectMany(g => g.Items)
|
||||||
@@ -212,5 +219,55 @@ 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the version string by applying the specified operation to the major, minor, and patch components of the version.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="version">The current version string in the format "major.minor.patch[-tag]".</param>
|
||||||
|
/// <param name="patch">The value to apply to the patch component.</param>
|
||||||
|
/// <param name="minor">The value to apply to the minor component.</param>
|
||||||
|
/// <param name="major">The value to apply to the major 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>
|
||||||
|
/// <exception cref="Exception">Thrown if the version string is not in the correct format.</exception>
|
||||||
|
public static Result<string, ReadableError> ChangeVersion(string version, int delta, IncrementTarget target) {
|
||||||
|
string[] split = version.Split('.');
|
||||||
|
if (split.Length != 3) {
|
||||||
|
return new ReadableError(string.Format(Exceptions.version_string_not_formatted_correctly, version));
|
||||||
|
}
|
||||||
|
|
||||||
|
string tag = "";
|
||||||
|
if (split[2].Contains('-')) {
|
||||||
|
var split2 = split[2].Split('-');
|
||||||
|
split[2] = split2[0];
|
||||||
|
tag = "-" + split2[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (split.Any(x => !int.TryParse(x, out _)))
|
||||||
|
return new ReadableError(string.Format(Exceptions.version_string_not_formatted_correctly, version));
|
||||||
|
|
||||||
|
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
|
||||||
|
$"{parsedVersion[0]}.{parsedVersion[1]}.{parsedVersion[2]}{tag}".Ok();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
using System.Xml;
|
|
||||||
|
|
||||||
namespace aeqw89.tools.Publish;
|
|
||||||
|
|
||||||
internal sealed class ProjectReference : Item {
|
|
||||||
public ProjectReference(XmlElement node) : base(node) { }
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generated by TARGET FORGE — MSBuild publish target -->
|
||||||
|
<!-- Save as PublishAll.targets and <Import Project="PublishAll.targets" /> in your .csproj, -->
|
||||||
|
<!-- or paste the <Target> below directly into the .csproj. -->
|
||||||
|
<!-- Run: dotnet msbuild -t:PublishAll -->
|
||||||
|
<Project>
|
||||||
|
|
||||||
|
<Target Name="PublishAll">
|
||||||
|
<ItemGroup>
|
||||||
|
<Rid Include="win-x64;linux-x64;osx-x64;osx-arm64" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<MSBuild Projects="$(MSBuildProjectFullPath)"
|
||||||
|
Targets="Publish"
|
||||||
|
BuildInParallel="true"
|
||||||
|
Properties="Configuration=Release;
|
||||||
|
Platform=Any CPU;
|
||||||
|
TargetFramework=net9.0;
|
||||||
|
RuntimeIdentifier=%(Rid.Identity);
|
||||||
|
SelfContained=true;
|
||||||
|
PublishSingleFile=true;
|
||||||
|
PublishDir=bin\Release\publish\%(Rid.Identity)\" />
|
||||||
|
</Target>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<!-- All four are overridable from the CLI: -p:ArchiveVersion=1.2.3 etc. -->
|
||||||
|
<ArchiveAppName Condition="'$(ArchiveAppName)' == ''">$(AssemblyName)</ArchiveAppName>
|
||||||
|
<ArchiveVersion Condition="'$(ArchiveVersion)' == ''">$(Version)</ArchiveVersion>
|
||||||
|
<ArchiveVersion Condition="'$(ArchiveVersion)' == ''">1.3.0</ArchiveVersion>
|
||||||
|
<ArchiveOutputDir Condition="'$(ArchiveOutputDir)' == ''">$(MSBuildProjectDirectory)\dist\</ArchiveOutputDir>
|
||||||
|
<PublishBaseDir Condition="'$(PublishBaseDir)' == ''">$(MSBuildProjectDirectory)\bin\Release\publish\</PublishBaseDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<Target Name="Archive" DependsOnTargets="PublishAll">
|
||||||
|
<MakeDir Directories="$(ArchiveOutputDir)" />
|
||||||
|
|
||||||
|
<ZipDirectory SourceDirectory="$(PublishBaseDir)%(Rid.Identity)\"
|
||||||
|
DestinationFile="$(ArchiveOutputDir)$(ArchiveAppName)-$(ArchiveVersion)-%(Rid.Identity).zip"
|
||||||
|
Overwrite="true" />
|
||||||
|
|
||||||
|
<Exec Command='tar -czf "$(ArchiveOutputDir)$(ArchiveAppName)-$(ArchiveVersion)-%(Rid.Identity).tar.gz" -C "$(PublishBaseDir)%(Rid.Identity)" .' />
|
||||||
|
|
||||||
|
<Message Importance="high" Text="Archived $(ArchiveAppName) $(ArchiveVersion) → $(ArchiveOutputDir)" />
|
||||||
|
</Target>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
namespace aeqw89.tools.Publish;
|
||||||
|
|
||||||
|
record Success {
|
||||||
|
public static Ok<Success> AsResult() => new Ok<Success>(new Success());
|
||||||
|
}
|
||||||
|
record Ok<T>(T Value);
|
||||||
|
record ReadableError(string Reason, bool ShowHelp = true, bool RestoreContext = true);
|
||||||
|
union Result<T, E>(Ok<T>, E);
|
||||||
|
|
||||||
|
internal static class ResultExtensions {
|
||||||
|
public static T Unwrap<T>(this Result<T, ReadableError> result, Program.RunContext? rctx = null) {
|
||||||
|
switch (result) {
|
||||||
|
case Ok<T> r:
|
||||||
|
return r.Value;
|
||||||
|
case ReadableError error:
|
||||||
|
Program.ShowError(error.Reason);
|
||||||
|
if (error.ShowHelp) Program.ShowHelp();
|
||||||
|
if (error.RestoreContext) rctx?.Restore();
|
||||||
|
Environment.Exit(1);
|
||||||
|
throw new UnreachableException();
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new UnreachableException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<T> Unwrap<T>(this Task<Result<T, ReadableError>> result, Program.RunContext? rctx = null) {
|
||||||
|
return (await result).Unwrap(rctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<TTo, ETo> Cast<TFrom, EFrom, TTo, ETo>(this Result<TFrom, EFrom> result) where TTo : notnull, TFrom where ETo: notnull, EFrom {
|
||||||
|
return result switch {
|
||||||
|
TFrom tfrom => ((TTo)tfrom).Ok(),
|
||||||
|
EFrom efrom => ((ETo)efrom),
|
||||||
|
_ => throw new UnreachableException()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<TTo, ETo> Upcast<TFrom, EFrom, TTo, ETo>(this Result<TFrom, EFrom> result)
|
||||||
|
where TFrom : TTo
|
||||||
|
where EFrom : ETo
|
||||||
|
{
|
||||||
|
return result switch {
|
||||||
|
TFrom tfrom => ((TTo)tfrom).Ok(), // Foo -> IFoo, implicit upcast, can't throw
|
||||||
|
EFrom efrom => ((ETo)efrom),
|
||||||
|
_ => throw new UnreachableException()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<TTo, E> CastSuccess<TFrom, TTo, E>(this Result<TFrom, E> result) where TTo : notnull, TFrom where E: notnull
|
||||||
|
=> Cast<TFrom, E, TTo, E>(result);
|
||||||
|
|
||||||
|
public static Result<TTo, E> UpcastSuccess<TFrom, TTo, E>(this Result<TFrom, E> result) where TFrom : notnull, TTo where E: notnull
|
||||||
|
=> Upcast<TFrom, E, TTo, E>(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static class ObjectExtensions {
|
||||||
|
public static Ok<T> Ok<T>(this T any) {
|
||||||
|
return new Ok<T>(any);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.Text;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace aeqw89.tools.Publish;
|
||||||
|
|
||||||
|
internal static class Shell {
|
||||||
|
internal record ShellResult(string Output, string Error, int ExitCode);
|
||||||
|
internal record PackageInfo(FileInfo FileInfo) {
|
||||||
|
byte[]? _inMemory = null;
|
||||||
|
public long Size() => FileInfo.Length;
|
||||||
|
public async Task<byte[]> ReadAsync() => _inMemory ??= await File.ReadAllBytesAsync(FileInfo.FullName);
|
||||||
|
public byte[] Read() => _inMemory ??= File.ReadAllBytes(FileInfo.FullName);
|
||||||
|
}
|
||||||
|
internal static class Dotnet {
|
||||||
|
internal static async Task<Result<PackageInfo, ReadableError>> FindPackage(string dir) {
|
||||||
|
var package = Directory.GetFiles(dir, "*.nupkg").FirstOrDefault();
|
||||||
|
if (package == null) return new ReadableError(Exceptions.generic_error.EscapeMarkup());
|
||||||
|
return new PackageInfo(new FileInfo(package)).Ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static async Task<Result<ShellResult, ReadableError>> Pack(string tempdir, DataReceivedEventHandler? stderr, DataReceivedEventHandler? stdout) {
|
||||||
|
var p = Process.Start(new ProcessStartInfo() {
|
||||||
|
FileName = "dotnet",
|
||||||
|
Arguments = $"pack -o {tempdir}",
|
||||||
|
WorkingDirectory = Environment.CurrentDirectory,
|
||||||
|
UseShellExecute = false,
|
||||||
|
RedirectStandardOutput = true,
|
||||||
|
RedirectStandardError = true
|
||||||
|
});
|
||||||
|
|
||||||
|
StringBuilder errorLines = new();
|
||||||
|
StringBuilder outputLines = new();
|
||||||
|
|
||||||
|
CancellationTokenSource cts = new();
|
||||||
|
p?.ErrorDataReceived += stderr;
|
||||||
|
p?.ErrorDataReceived += (_, e) => {
|
||||||
|
cts.Cancel();
|
||||||
|
errorLines.Append(e.Data);
|
||||||
|
};
|
||||||
|
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
p?.OutputDataReceived += stdout;
|
||||||
|
p?.OutputDataReceived += (_, e) => {
|
||||||
|
if (e.Data?.ToLower().Contains("press any key") == true)
|
||||||
|
cts.Cancel();
|
||||||
|
if (e.Data?.ToLower().Contains($"successfully created package '{Path.GetFullPath(tempdir)}") == true) {
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
p?.BeginErrorReadLine();
|
||||||
|
p?.BeginOutputReadLine();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await (p?.WaitForExitAsync(cts.Token) ?? Task.CompletedTask);
|
||||||
|
} catch (TaskCanceledException) {
|
||||||
|
p?.Kill();
|
||||||
|
} catch (Exception e) {
|
||||||
|
return new ReadableError(Exceptions.generic_error.EscapeMarkup(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ShellResult(outputLines.ToString(), errorLines.ToString(), p!.ExitCode).Ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using Spectre.Console;
|
||||||
|
using static aeqw89.tools.Publish.Program;
|
||||||
|
|
||||||
|
namespace aeqw89.tools.Publish;
|
||||||
|
|
||||||
|
internal record Stager(RunContext RunContext) {
|
||||||
|
public async Task<T?> Spinner<T>(string name, Func<RunContext, StatusContext, Task<Result<T, ReadableError>>> factory) {
|
||||||
|
try {
|
||||||
|
var result = AnsiConsole.Status()
|
||||||
|
.Spinner(Spectre.Console.Spinner.Known.Dots)
|
||||||
|
.Start(name, async ctx => await factory(RunContext, ctx));
|
||||||
|
return (await result).Unwrap(RunContext);
|
||||||
|
} catch (Exception e) {
|
||||||
|
ShowError(string.Format(Exceptions.generic_error.EscapeMarkup(), e.ToString().EscapeMarkup()));
|
||||||
|
RunContext.Restore();
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new UnreachableException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProgressStager Progress() {
|
||||||
|
return new ProgressStager(RunContext, [], AnsiConsole.Progress()
|
||||||
|
.AutoClear(true)
|
||||||
|
.HideCompleted(false)
|
||||||
|
.Columns([
|
||||||
|
new TaskDescriptionColumn(),
|
||||||
|
new ProgressBarColumn()
|
||||||
|
.RemainingStyle(Style.Parse("dim gray slowblink"))
|
||||||
|
.CompletedStyle(Style.Parse("green strikethrough"))
|
||||||
|
.FinishedStyle("green strikethrough"),
|
||||||
|
new DownloadedColumn(),
|
||||||
|
new RemainingTimeColumn(),
|
||||||
|
new TransferSpeedColumn(),
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal record TaskWithProgress<T>(string Name, Task<T> Value);
|
||||||
|
internal record ProgressStager(RunContext RunContext, Task[] Tasks, Progress Progress) {
|
||||||
|
public TaskWithProgress<T> Run<T>(string Name, Func<RunContext, ProgressContext, Task<T>> factory) {
|
||||||
|
return new(Name, Progress.StartAsync(async ctx => {
|
||||||
|
return await factory(RunContext, ctx);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace System.Runtime.CompilerServices {
|
||||||
|
public interface IUnion { }
|
||||||
|
|
||||||
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
|
public sealed class UnionAttribute : Attribute { }
|
||||||
|
}
|
||||||
@@ -1,17 +1,26 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<Import Project="PublishAll.targets" />
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<RuntimeIdentifiers>win-x64;linux-x64;osx-arm64;osx-x64</RuntimeIdentifiers>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<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="2.0.0" />
|
||||||
|
<PackageReference Include="Aigamo.ResXGenerator" Version="4.3.0">
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
<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>
|
||||||
@@ -29,4 +38,8 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<ResXGenerator_NullForgivingOperators>true</ResXGenerator_NullForgivingOperators>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,176 +0,0 @@
|
|||||||
{
|
|
||||||
"runtimeTarget": {
|
|
||||||
"name": ".NETCoreApp,Version=v9.0",
|
|
||||||
"signature": ""
|
|
||||||
},
|
|
||||||
"compilationOptions": {},
|
|
||||||
"targets": {
|
|
||||||
".NETCoreApp,Version=v9.0": {
|
|
||||||
"aeqw89.tools.Publish/1.0.0": {
|
|
||||||
"dependencies": {
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"aeqw89.tools.Publish.dll": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"BouncyCastle.Cryptography/2.5.1": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/BouncyCastle.Cryptography.dll": {
|
|
||||||
"assemblyVersion": "2.0.0.0",
|
|
||||||
"fileVersion": "2.5.1.28965"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
|
||||||
"assemblyVersion": "8.0.0.0",
|
|
||||||
"fileVersion": "8.0.1024.46610"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions/8.0.3": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
|
||||||
"assemblyVersion": "8.0.0.0",
|
|
||||||
"fileVersion": "8.0.1325.6609"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Spectre.Console/0.51.2-preview.0.1": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/net9.0/Spectre.Console.dll": {
|
|
||||||
"assemblyVersion": "0.0.0.0",
|
|
||||||
"fileVersion": "0.51.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Spectre.Console.Cli/0.51.2-preview.0.1": {
|
|
||||||
"dependencies": {
|
|
||||||
"Spectre.Console": "0.51.2-preview.0.1"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net9.0/Spectre.Console.Cli.dll": {
|
|
||||||
"assemblyVersion": "0.0.0.0",
|
|
||||||
"fileVersion": "0.51.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"resources": {
|
|
||||||
"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": {
|
|
||||||
"dependencies": {
|
|
||||||
"BouncyCastle.Cryptography": "2.5.1",
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.3"
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net9.0/Renci.SshNet.dll": {
|
|
||||||
"assemblyVersion": "2025.0.0.1",
|
|
||||||
"fileVersion": "2025.0.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"VsTools.Projects/1.2.0": {
|
|
||||||
"runtime": {
|
|
||||||
"lib/netstandard2.0/VsTools.Projects.dll": {
|
|
||||||
"assemblyVersion": "1.2.0.0",
|
|
||||||
"fileVersion": "1.2.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"libraries": {
|
|
||||||
"aeqw89.tools.Publish/1.0.0": {
|
|
||||||
"type": "project",
|
|
||||||
"serviceable": false,
|
|
||||||
"sha512": ""
|
|
||||||
},
|
|
||||||
"BouncyCastle.Cryptography/2.5.1": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-zy8TMeTP+1FH2NrLaNZtdRbBdq7u5MI+NFZQOBSM69u5RFkciinwzV2eveY6Kjf5MzgsYvvl6kTStsj3JrXqkg==",
|
|
||||||
"path": "bouncycastle.cryptography/2.5.1",
|
|
||||||
"hashPath": "bouncycastle.cryptography.2.5.1.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==",
|
|
||||||
"path": "microsoft.extensions.dependencyinjection.abstractions/8.0.2",
|
|
||||||
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions/8.0.3": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==",
|
|
||||||
"path": "microsoft.extensions.logging.abstractions/8.0.3",
|
|
||||||
"hashPath": "microsoft.extensions.logging.abstractions.8.0.3.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Spectre.Console/0.51.2-preview.0.1": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-eTojiXsispvwl5i3o6BsBt0fV7pn+jsJ3nbQVCTCwBoYbeczNO2w7wjPfB2Tx+Y5+mplLEtSFi5Mp0aFZSP3tA==",
|
|
||||||
"path": "spectre.console/0.51.2-preview.0.1",
|
|
||||||
"hashPath": "spectre.console.0.51.2-preview.0.1.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"Spectre.Console.Cli/0.51.2-preview.0.1": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-sgcQ28dkBJG66JU+BI/vhXvgqYOS+0S2OaW5sYkpShk0MzHO2hnnyg8Ef636NG6U+OmIALVZ69CP3oImeUUrag==",
|
|
||||||
"path": "spectre.console.cli/0.51.2-preview.0.1",
|
|
||||||
"hashPath": "spectre.console.cli.0.51.2-preview.0.1.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"SSH.NET/2025.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-AKYbB+q2zFkNQbBFx5gXdv+Wje0baBtADQ35WnMKi4bg1ka74wTQtWoPd+fOWcydohdfsD0nfT8ErMOAPxtSfA==",
|
|
||||||
"path": "ssh.net/2025.0.0",
|
|
||||||
"hashPath": "ssh.net.2025.0.0.nupkg.sha512"
|
|
||||||
},
|
|
||||||
"VsTools.Projects/1.2.0": {
|
|
||||||
"type": "package",
|
|
||||||
"serviceable": true,
|
|
||||||
"sha512": "sha512-Zja9D1HlSi+6goiAYUkcuE1dUC7MyoU4ZiXCNMcQ6JFNloHpwO8ne7cATi4jeMco56TB3Trzv+vtAiK4jDydlw==",
|
|
||||||
"path": "vstools.projects/1.2.0",
|
|
||||||
"hashPath": "vstools.projects.1.2.0.nupkg.sha512"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"runtimeOptions": {
|
|
||||||
"tfm": "net9.0",
|
|
||||||
"framework": {
|
|
||||||
"name": "Microsoft.NETCore.App",
|
|
||||||
"version": "9.0.0"
|
|
||||||
},
|
|
||||||
"configProperties": {
|
|
||||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")]
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
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+cd823abb020af62611aa6afe16e1ac5b49e961b0")]
|
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("aeqw89.tools.Publish")]
|
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("aeqw89.tools.Publish")]
|
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
|
||||||
|
|
||||||
// Generated by the MSBuild WriteCodeFragment class.
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
c58d819abcee216515191fe2fec7fe270f4c3f5f7e8de377d7c3810ae96fcc2a
|
|
||||||
Binary file not shown.
-19
@@ -1,19 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.EnableAotAnalyzer =
|
|
||||||
build_property.EnableSingleFileAnalyzer =
|
|
||||||
build_property.EnableTrimAnalyzer =
|
|
||||||
build_property.IncludeAllContentForSelfExtract =
|
|
||||||
build_property.TargetFramework = net9.0
|
|
||||||
build_property.TargetPlatformMinVersion =
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules =
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = aeqw89.tools.Publish
|
|
||||||
build_property.ProjectDir = C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\
|
|
||||||
build_property.EnableComHosting =
|
|
||||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
||||||
build_property.EffectiveAnalysisLevelStyle = 9.0
|
|
||||||
build_property.EnableCodeStyleSeverity =
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
// <auto-generated/>
|
|
||||||
global using global::System;
|
|
||||||
global using global::System.Collections.Generic;
|
|
||||||
global using global::System.IO;
|
|
||||||
global using global::System.Linq;
|
|
||||||
global using global::System.Net.Http;
|
|
||||||
global using global::System.Threading;
|
|
||||||
global using global::System.Threading.Tasks;
|
|
||||||
Binary file not shown.
BIN
Binary file not shown.
-1
@@ -1 +0,0 @@
|
|||||||
5d197b168fe8c90856a81b99d1fce6aff6057143a768436bb5102085caca4cb0
|
|
||||||
-35
@@ -1,35 +0,0 @@
|
|||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\aeqw89.tools.Publish.exe
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\aeqw89.tools.Publish.deps.json
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\aeqw89.tools.Publish.runtimeconfig.json
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\aeqw89.tools.Publish.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\aeqw89.tools.Publish.pdb
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\Spectre.Console.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\Spectre.Console.Cli.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\de\Spectre.Console.Cli.resources.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\es\Spectre.Console.Cli.resources.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\fr\Spectre.Console.Cli.resources.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\it\Spectre.Console.Cli.resources.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\ja\Spectre.Console.Cli.resources.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\ko\Spectre.Console.Cli.resources.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\pt\Spectre.Console.Cli.resources.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\ru\Spectre.Console.Cli.resources.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\sv\Spectre.Console.Cli.resources.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\zh-Hans\Spectre.Console.Cli.resources.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.csproj.AssemblyReference.cache
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.Exceptions.resources
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.csproj.GenerateResource.cache
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.GeneratedMSBuildEditorConfig.editorconfig
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.AssemblyInfoInputs.cache
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.AssemblyInfo.cs
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.csproj.CoreCompileInputs.cache
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.t.65D2674F.Up2Date
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\refint\aeqw89.tools.Publish.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.pdb
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\aeqw89.tools.Publish.genruntimeconfig.cache
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\obj\Debug\net9.0\ref\aeqw89.tools.Publish.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\VsTools.Projects.dll
|
|
||||||
C:\Users\qwsdc\source\repos\aeqw89.tools.Publish\aeqw89.tools.Publish\bin\Debug\net9.0\BouncyCastle.Cryptography.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\Renci.SshNet.dll
|
|
||||||
BIN
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
168cdf600308143eb70e75e0de49fe275399afb34dc3d60504d380fe24fdc670
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,104 +0,0 @@
|
|||||||
{
|
|
||||||
"format": 1,
|
|
||||||
"restore": {
|
|
||||||
"C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\aeqw89.tools.Publish.csproj": {}
|
|
||||||
},
|
|
||||||
"projects": {
|
|
||||||
"C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\aeqw89.tools.Publish.csproj": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"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",
|
|
||||||
"packagesPath": "C:\\Users\\qwsdc\\.nuget\\packages\\",
|
|
||||||
"outputPath": "C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\qwsdc\\AppData\\Roaming\\NuGet\\NuGet.Config"
|
|
||||||
],
|
|
||||||
"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": {
|
|
||||||
"Microsoft.NET.ILLink.Tasks": {
|
|
||||||
"suppressParent": "All",
|
|
||||||
"target": "Package",
|
|
||||||
"version": "[9.0.0, )",
|
|
||||||
"autoReferenced": true
|
|
||||||
},
|
|
||||||
"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,
|
|
||||||
"downloadDependencies": [
|
|
||||||
{
|
|
||||||
"name": "Microsoft.NETCore.App.Host.linux-x64",
|
|
||||||
"version": "[9.0.0, 9.0.0]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.101/PortableRuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimes": {
|
|
||||||
"linux-x64": {
|
|
||||||
"#import": []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
|
||||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
|
||||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
|
||||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
|
||||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\qwsdc\.nuget\packages\</NuGetPackageFolders>
|
|
||||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
|
||||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.12.2</NuGetToolVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<SourceRoot Include="C:\Users\qwsdc\.nuget\packages\" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<Import Project="$(NuGetPackageRoot)microsoft.net.illink.tasks\9.0.0\build\Microsoft.NET.ILLink.Tasks.props" Condition="Exists('$(NuGetPackageRoot)microsoft.net.illink.tasks\9.0.0\build\Microsoft.NET.ILLink.Tasks.props')" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<PkgMicrosoft_NET_ILLink_Tasks Condition=" '$(PkgMicrosoft_NET_ILLink_Tasks)' == '' ">C:\Users\qwsdc\.nuget\packages\microsoft.net.illink.tasks\9.0.0</PkgMicrosoft_NET_ILLink_Tasks>
|
|
||||||
</PropertyGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\8.0.3\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\8.0.3\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,683 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 3,
|
|
||||||
"targets": {
|
|
||||||
"net9.0": {
|
|
||||||
"BouncyCastle.Cryptography/2.5.1": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net6.0/BouncyCastle.Cryptography.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/BouncyCastle.Cryptography.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net6.0/_._": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions/8.0.3": {
|
|
||||||
"type": "package",
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.NET.ILLink.Tasks/9.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"build": {
|
|
||||||
"build/Microsoft.NET.ILLink.Tasks.props": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Spectre.Console/0.51.2-preview.0.1": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net9.0/Spectre.Console.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net9.0/Spectre.Console.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"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": {
|
|
||||||
"BouncyCastle.Cryptography": "2.5.1",
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.3"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net9.0/Renci.SshNet.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net9.0/Renci.SshNet.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"VsTools.Projects/1.2.0": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/netstandard2.0/VsTools.Projects.dll": {}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/netstandard2.0/VsTools.Projects.dll": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"net9.0/linux-x64": {
|
|
||||||
"BouncyCastle.Cryptography/2.5.1": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net6.0/BouncyCastle.Cryptography.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net6.0/BouncyCastle.Cryptography.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net6.0/_._": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions/8.0.3": {
|
|
||||||
"type": "package",
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Microsoft.NET.ILLink.Tasks/9.0.0": {
|
|
||||||
"type": "package",
|
|
||||||
"build": {
|
|
||||||
"build/Microsoft.NET.ILLink.Tasks.props": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Spectre.Console/0.51.2-preview.0.1": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/net9.0/Spectre.Console.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net9.0/Spectre.Console.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"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": {
|
|
||||||
"BouncyCastle.Cryptography": "2.5.1",
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.3"
|
|
||||||
},
|
|
||||||
"compile": {
|
|
||||||
"lib/net9.0/Renci.SshNet.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/net9.0/Renci.SshNet.dll": {
|
|
||||||
"related": ".xml"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"VsTools.Projects/1.2.0": {
|
|
||||||
"type": "package",
|
|
||||||
"compile": {
|
|
||||||
"lib/netstandard2.0/VsTools.Projects.dll": {}
|
|
||||||
},
|
|
||||||
"runtime": {
|
|
||||||
"lib/netstandard2.0/VsTools.Projects.dll": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"libraries": {
|
|
||||||
"BouncyCastle.Cryptography/2.5.1": {
|
|
||||||
"sha512": "zy8TMeTP+1FH2NrLaNZtdRbBdq7u5MI+NFZQOBSM69u5RFkciinwzV2eveY6Kjf5MzgsYvvl6kTStsj3JrXqkg==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "bouncycastle.cryptography/2.5.1",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"LICENSE.md",
|
|
||||||
"README.md",
|
|
||||||
"bouncycastle.cryptography.2.5.1.nupkg.sha512",
|
|
||||||
"bouncycastle.cryptography.nuspec",
|
|
||||||
"lib/net461/BouncyCastle.Cryptography.dll",
|
|
||||||
"lib/net461/BouncyCastle.Cryptography.xml",
|
|
||||||
"lib/net6.0/BouncyCastle.Cryptography.dll",
|
|
||||||
"lib/net6.0/BouncyCastle.Cryptography.xml",
|
|
||||||
"lib/netstandard2.0/BouncyCastle.Cryptography.dll",
|
|
||||||
"lib/netstandard2.0/BouncyCastle.Cryptography.xml",
|
|
||||||
"packageIcon.png"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
|
|
||||||
"sha512": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "microsoft.extensions.dependencyinjection.abstractions/8.0.2",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"LICENSE.TXT",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets",
|
|
||||||
"buildTransitive/net462/_._",
|
|
||||||
"buildTransitive/net6.0/_._",
|
|
||||||
"buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets",
|
|
||||||
"lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
|
|
||||||
"lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
|
|
||||||
"microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512",
|
|
||||||
"microsoft.extensions.dependencyinjection.abstractions.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions/8.0.3": {
|
|
||||||
"sha512": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "microsoft.extensions.logging.abstractions/8.0.3",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"LICENSE.TXT",
|
|
||||||
"PACKAGE.md",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll",
|
|
||||||
"buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets",
|
|
||||||
"buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets",
|
|
||||||
"buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets",
|
|
||||||
"buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets",
|
|
||||||
"buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets",
|
|
||||||
"lib/net462/Microsoft.Extensions.Logging.Abstractions.dll",
|
|
||||||
"lib/net462/Microsoft.Extensions.Logging.Abstractions.xml",
|
|
||||||
"lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll",
|
|
||||||
"lib/net6.0/Microsoft.Extensions.Logging.Abstractions.xml",
|
|
||||||
"lib/net7.0/Microsoft.Extensions.Logging.Abstractions.dll",
|
|
||||||
"lib/net7.0/Microsoft.Extensions.Logging.Abstractions.xml",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll",
|
|
||||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll",
|
|
||||||
"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml",
|
|
||||||
"microsoft.extensions.logging.abstractions.8.0.3.nupkg.sha512",
|
|
||||||
"microsoft.extensions.logging.abstractions.nuspec",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Microsoft.NET.ILLink.Tasks/9.0.0": {
|
|
||||||
"sha512": "zAwp213evC3UkimtVXRb+Dlgc/40QG145nmZDtp2LO9zJJMfrp+i/87BnXN7tRXEA4liyzdFkjqG1HE8/RPb4A==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "microsoft.net.illink.tasks/9.0.0",
|
|
||||||
"hasTools": true,
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"Icon.png",
|
|
||||||
"LICENSE.TXT",
|
|
||||||
"Sdk/Sdk.props",
|
|
||||||
"THIRD-PARTY-NOTICES.TXT",
|
|
||||||
"analyzers/dotnet/cs/ILLink.CodeFixProvider.dll",
|
|
||||||
"analyzers/dotnet/cs/ILLink.RoslynAnalyzer.dll",
|
|
||||||
"build/Microsoft.NET.ILLink.Analyzers.props",
|
|
||||||
"build/Microsoft.NET.ILLink.Tasks.props",
|
|
||||||
"build/Microsoft.NET.ILLink.targets",
|
|
||||||
"microsoft.net.illink.tasks.9.0.0.nupkg.sha512",
|
|
||||||
"microsoft.net.illink.tasks.nuspec",
|
|
||||||
"tools/net472/ILLink.Tasks.dll",
|
|
||||||
"tools/net472/ILLink.Tasks.dll.config",
|
|
||||||
"tools/net472/Mono.Cecil.Mdb.dll",
|
|
||||||
"tools/net472/Mono.Cecil.Pdb.dll",
|
|
||||||
"tools/net472/Mono.Cecil.Rocks.dll",
|
|
||||||
"tools/net472/Mono.Cecil.dll",
|
|
||||||
"tools/net472/Sdk/Sdk.props",
|
|
||||||
"tools/net472/System.Buffers.dll",
|
|
||||||
"tools/net472/System.Collections.Immutable.dll",
|
|
||||||
"tools/net472/System.Memory.dll",
|
|
||||||
"tools/net472/System.Numerics.Vectors.dll",
|
|
||||||
"tools/net472/System.Reflection.Metadata.dll",
|
|
||||||
"tools/net472/System.Runtime.CompilerServices.Unsafe.dll",
|
|
||||||
"tools/net472/build/Microsoft.NET.ILLink.Analyzers.props",
|
|
||||||
"tools/net472/build/Microsoft.NET.ILLink.Tasks.props",
|
|
||||||
"tools/net472/build/Microsoft.NET.ILLink.targets",
|
|
||||||
"tools/net9.0/ILLink.Tasks.deps.json",
|
|
||||||
"tools/net9.0/ILLink.Tasks.dll",
|
|
||||||
"tools/net9.0/Mono.Cecil.Mdb.dll",
|
|
||||||
"tools/net9.0/Mono.Cecil.Pdb.dll",
|
|
||||||
"tools/net9.0/Mono.Cecil.Rocks.dll",
|
|
||||||
"tools/net9.0/Mono.Cecil.dll",
|
|
||||||
"tools/net9.0/Sdk/Sdk.props",
|
|
||||||
"tools/net9.0/build/Microsoft.NET.ILLink.Analyzers.props",
|
|
||||||
"tools/net9.0/build/Microsoft.NET.ILLink.Tasks.props",
|
|
||||||
"tools/net9.0/build/Microsoft.NET.ILLink.targets",
|
|
||||||
"tools/net9.0/illink.deps.json",
|
|
||||||
"tools/net9.0/illink.dll",
|
|
||||||
"tools/net9.0/illink.runtimeconfig.json",
|
|
||||||
"useSharedDesignerContext.txt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Spectre.Console/0.51.2-preview.0.1": {
|
|
||||||
"sha512": "eTojiXsispvwl5i3o6BsBt0fV7pn+jsJ3nbQVCTCwBoYbeczNO2w7wjPfB2Tx+Y5+mplLEtSFi5Mp0aFZSP3tA==",
|
|
||||||
"type": "package",
|
|
||||||
"path": "spectre.console/0.51.2-preview.0.1",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"README.md",
|
|
||||||
"lib/net8.0/Spectre.Console.dll",
|
|
||||||
"lib/net8.0/Spectre.Console.xml",
|
|
||||||
"lib/net9.0/Spectre.Console.dll",
|
|
||||||
"lib/net9.0/Spectre.Console.xml",
|
|
||||||
"lib/netstandard2.0/Spectre.Console.dll",
|
|
||||||
"lib/netstandard2.0/Spectre.Console.xml",
|
|
||||||
"logo.png",
|
|
||||||
"spectre.console.0.51.2-preview.0.1.nupkg.sha512",
|
|
||||||
"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",
|
|
||||||
"path": "ssh.net/2025.0.0",
|
|
||||||
"files": [
|
|
||||||
".nupkg.metadata",
|
|
||||||
".signature.p7s",
|
|
||||||
"README.md",
|
|
||||||
"SS-NET-icon-h500.png",
|
|
||||||
"lib/net462/Renci.SshNet.dll",
|
|
||||||
"lib/net462/Renci.SshNet.xml",
|
|
||||||
"lib/net8.0/Renci.SshNet.dll",
|
|
||||||
"lib/net8.0/Renci.SshNet.xml",
|
|
||||||
"lib/net9.0/Renci.SshNet.dll",
|
|
||||||
"lib/net9.0/Renci.SshNet.xml",
|
|
||||||
"lib/netstandard2.0/Renci.SshNet.dll",
|
|
||||||
"lib/netstandard2.0/Renci.SshNet.xml",
|
|
||||||
"lib/netstandard2.1/Renci.SshNet.dll",
|
|
||||||
"lib/netstandard2.1/Renci.SshNet.xml",
|
|
||||||
"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": [
|
|
||||||
"Microsoft.NET.ILLink.Tasks >= 9.0.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"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"packageFolders": {
|
|
||||||
"C:\\Users\\qwsdc\\.nuget\\packages\\": {}
|
|
||||||
},
|
|
||||||
"project": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"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",
|
|
||||||
"packagesPath": "C:\\Users\\qwsdc\\.nuget\\packages\\",
|
|
||||||
"outputPath": "C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\qwsdc\\AppData\\Roaming\\NuGet\\NuGet.Config"
|
|
||||||
],
|
|
||||||
"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": {
|
|
||||||
"Microsoft.NET.ILLink.Tasks": {
|
|
||||||
"suppressParent": "All",
|
|
||||||
"target": "Package",
|
|
||||||
"version": "[9.0.0, )",
|
|
||||||
"autoReferenced": true
|
|
||||||
},
|
|
||||||
"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,
|
|
||||||
"downloadDependencies": [
|
|
||||||
{
|
|
||||||
"name": "Microsoft.NETCore.App.Host.linux-x64",
|
|
||||||
"version": "[9.0.0, 9.0.0]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.101/PortableRuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimes": {
|
|
||||||
"linux-x64": {
|
|
||||||
"#import": []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 2,
|
|
||||||
"dgSpecHash": "XMPV4aaWYzc=",
|
|
||||||
"success": true,
|
|
||||||
"projectFilePath": "C:\\Users\\qwsdc\\source\\repos\\aeqw89.tools.Publish\\aeqw89.tools.Publish\\aeqw89.tools.Publish.csproj",
|
|
||||||
"expectedPackageFiles": [
|
|
||||||
"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\\microsoft.net.illink.tasks\\9.0.0\\microsoft.net.illink.tasks.9.0.0.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\\microsoft.netcore.app.host.linux-x64\\9.0.0\\microsoft.netcore.app.host.linux-x64.9.0.0.nupkg.sha512"
|
|
||||||
],
|
|
||||||
"logs": []
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
"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, )"},"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"}}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
17584342196004454
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
17584333772830899
|
|
||||||
Reference in New Issue
Block a user