diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml
index b4ab074..4fe341f 100644
--- a/.forgejo/workflows/ci.yml
+++ b/.forgejo/workflows/ci.yml
@@ -22,8 +22,11 @@ jobs:
- name: dotnet format check
run: dotnet format arcade.slnx --verify-no-changes --verbosity minimal
+ - name: dotnet pack sdk
+ run: dotnet pack src/sdk/Sdk.slnx -p:Version=${{ steps.version.outputs.version }}
+
- name: dotnet pack
- run: dotnet pack arcade.slnx -p:Version=${{ steps.version.outputs.version }}
+ run: dotnet pack arcade.slnx -p:Version=${{ steps.version.outputs.version }}
- name: dotnet test
run: dotnet test --solution arcade.slnx -p:Version=${{ steps.version.outputs.version }}
diff --git a/.forgejo/workflows/release.yml b/.forgejo/workflows/release.yml
index 9609014..7bfd81a 100644
--- a/.forgejo/workflows/release.yml
+++ b/.forgejo/workflows/release.yml
@@ -19,8 +19,11 @@ jobs:
id: version
uses: ./.forgejo/actions/version
+ - name: dotnet pack sdk
+ run: dotnet pack src/sdk/Sdk.slnx -p:Version=${{ steps.version.outputs.version }}
+
- name: dotnet pack
- run: dotnet pack arcade.slnx -p:Version=${{ steps.version.outputs.version }}
+ run: dotnet pack arcade.slnx -p:Version=${{ steps.version.outputs.version }}
- name: upload packages
uses: https://code.geekeey.de/actions/artifacts/push@ae8d20e174a8706675e6d54ebd3719a2802ea9dd # 1
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 649f17a..accabe6 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -1,8 +1,8 @@
-
- true
-
-
-
-
-
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/arcade.slnx b/arcade.slnx
index 8850128..ce92a47 100644
--- a/arcade.slnx
+++ b/arcade.slnx
@@ -1,7 +1,3 @@
-
-
-
-
diff --git a/src/sdk.tests/DirectoryExtensions.cs b/src/sdk.tests/DirectoryExtensions.cs
index 1b73e4d..8364808 100644
--- a/src/sdk.tests/DirectoryExtensions.cs
+++ b/src/sdk.tests/DirectoryExtensions.cs
@@ -19,5 +19,18 @@ public static class DirectoryExtensions
File.Copy(file, Path.Combine(destinationDirectory, Path.GetRelativePath(sourceDirectory, file)));
}
}
+
+ public static string? GetDirectoryNameOfFileAbove(string directory, string file)
+ {
+ for (var current = new DirectoryInfo(directory); current is not null; current = current.Parent)
+ {
+ if (File.Exists(Path.Combine(current.FullName, file)))
+ {
+ return current.FullName;
+ }
+ }
+
+ return null;
+ }
}
}
diff --git a/src/sdk.tests/FileExtensions.cs b/src/sdk.tests/FileExtensions.cs
new file mode 100644
index 0000000..dcb3980
--- /dev/null
+++ b/src/sdk.tests/FileExtensions.cs
@@ -0,0 +1,16 @@
+// Copyright (c) The Geekeey Authors
+// SPDX-License-Identifier: EUPL-1.2
+
+namespace Geekeey.Arcade.NET.Tests;
+
+public static class FileExtensions
+{
+ extension(File)
+ {
+ public static string? GetPathOfFileAbove(string directory, string file)
+ {
+ var directoryName = Directory.GetDirectoryNameOfFileAbove(directory, file);
+ return directoryName is null ? null : Path.Combine(directoryName, file);
+ }
+ }
+}
diff --git a/src/sdk.tests/Geekeey.Arcade.NET.Tests.csproj b/src/sdk.tests/Geekeey.Arcade.NET.Tests.csproj
index ae672d9..2486b7b 100644
--- a/src/sdk.tests/Geekeey.Arcade.NET.Tests.csproj
+++ b/src/sdk.tests/Geekeey.Arcade.NET.Tests.csproj
@@ -2,14 +2,15 @@
net10.0
false
- true
Exe
+ $(DefaultItemExcludes);$(MSBuildProjectDirectory)/fixtures/**/*
-
-
-
+
+
+
+
diff --git a/src/sdk.tests/SdkNuGetTests.cs b/src/sdk.tests/SdkNuGetTests.cs
new file mode 100644
index 0000000..c0af84d
--- /dev/null
+++ b/src/sdk.tests/SdkNuGetTests.cs
@@ -0,0 +1,97 @@
+// Copyright (c) The Geekeey Authors
+// SPDX-License-Identifier: EUPL-1.2
+
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using Geekeey.Arcade.NET.Tests.Shared;
+
+namespace Geekeey.Arcade.NET.Tests;
+
+internal sealed class SdkNuGetTests
+{
+ private static Dictionary Feed { get; set; } = [];
+
+ [Before(Class)]
+ public static async Task BuildSdkBeforeTest()
+ {
+ var path = Directory.GetDirectoryNameOfFileAbove(AppContext.BaseDirectory, "global.json")
+ ?? throw new InvalidOperationException("Could not locate the repository root containing global.json.");
+ var package = Path.Combine(path, "artifacts", "package", "release");
+ File.Delete(Path.Combine(package, "Geekeey.Arcade.NET.Sdk.Test.1.0.0.nupkg"));
+ var command = Command.WithWorkingDirectory(path)
+ .WithThrowOnExit()
+ .WithEnvironment("DOTNET_CLI_DO_NOT_USE_MSBUILD_SERVER", "1");
+ await command.RunAsync("dotnet", "pack", Path.Combine("src", "sdk", "Sdk.slnx"));
+
+ var search = await command.RunAsync("dotnet", "package", "search", "--format=json", "--source", package, "Geekeey.Arcade.NET.Sdk");
+
+ var result = JsonSerializer.Deserialize(search.StdOut)
+ ?? throw new InvalidOperationException("The package search response was empty.");
+ Feed = result.SearchResults
+ .SelectMany(static result => result.Packages)
+ .ToDictionary(static result => result.Id, static result => result.LatestVersion);
+ }
+
+ [Test]
+ [Arguments("Geekeey.Arcade.NET.Sdk", "base")]
+ [Arguments("Geekeey.Arcade.NET.Sdk.Razor", "razor")]
+ [Arguments("Geekeey.Arcade.NET.Sdk.Web", "web")]
+ [Arguments("Geekeey.Arcade.NET.Sdk.Test", "test")]
+ public async Task DotNetBuildCanRestoreSdkFromNuGet(string packageId, string name)
+ {
+ // Arrange
+ using var project = await CreateProjectFromTemplate(packageId, name);
+
+ // Act
+ var output = await project.RunAsync("dotnet", "build");
+
+ // Assert
+ Console.WriteLine(output.StdOut);
+ Console.WriteLine(output.StdErr);
+ await Assert.That(output.ExitCode).IsZero();
+ await Assert.That(project.File("bin", "Debug", "net10.0", "project.dll")).Exists();
+ }
+
+ [Test]
+ [Arguments("Geekeey.Arcade.NET.Sdk", "base")]
+ [Arguments("Geekeey.Arcade.NET.Sdk.Razor", "razor")]
+ public async Task DotNetPackCanRestoreSdkFromNuGet(string sdkPackageId, string name)
+ {
+ // Arrange
+ using var project = await CreateProjectFromTemplate(sdkPackageId, name);
+
+ // Act
+ var output = await project.RunAsync("dotnet", "pack");
+
+ // Assert
+ await Assert.That(output.ExitCode).IsZero();
+ await Assert.That(project.File("bin", "Release", "My.Package.1.0.0.nupkg")).Exists();
+ }
+
+ private static async Task CreateProjectFromTemplate(string packageId, string name)
+ {
+ var repository = Directory.GetDirectoryNameOfFileAbove(AppContext.BaseDirectory, "global.json")
+ ?? throw new InvalidOperationException("Could not locate the repository root containing global.json.");
+ var package = Path.Combine(repository, "artifacts", "package", "release");
+
+ var project = new Project(Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), $"arcade-sdk-test-{Guid.NewGuid():N}")));
+ project.CopyFrom(Path.Combine(repository, "src", "sdk.tests", "fixtures", name));
+ await project.Template("nuget.config", "{0}", package);
+ await project.Template("project.csproj", "{0}", Feed[packageId]);
+
+ return project;
+ }
+
+ private sealed record PackageSearchResponse(
+ [property: JsonPropertyName("searchResult")]
+ IReadOnlyList SearchResults);
+
+ private sealed record PackageSearchSource(
+ [property: JsonPropertyName("packages")]
+ IReadOnlyList Packages);
+
+ private sealed record PackageSearchPackage(
+ [property: JsonPropertyName("id")] string Id,
+ [property: JsonPropertyName("latestVersion")]
+ string LatestVersion);
+}
diff --git a/src/sdk.tests/SdkPackageIntegrationTests.cs b/src/sdk.tests/SdkPackageIntegrationTests.cs
deleted file mode 100644
index d254336..0000000
--- a/src/sdk.tests/SdkPackageIntegrationTests.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (c) The Geekeey Authors
-// SPDX-License-Identifier: EUPL-1.2
-
-using System.Diagnostics;
-using System.Text.RegularExpressions;
-
-namespace Geekeey.Arcade.NET.Tests;
-
-public sealed class SdkPackageIntegrationTests
-{
-
- private static string RepositoryPath
- {
- get
- {
- for (var directory = new DirectoryInfo(AppContext.BaseDirectory); directory is not null; directory = directory.Parent)
- {
- if (File.Exists(Path.Combine(directory.FullName, "global.json")))
- {
- return directory.FullName;
- }
- }
-
- throw new InvalidOperationException("Could not locate the repository root containing global.json.");
- }
- }
-
- private static string NuGetFeedPath { get; } = Path.Combine(RepositoryPath, "artifacts", "package", "release");
-
- [Test]
- [Arguments("Geekeey.Arcade.NET.Sdk", "base")]
- [Arguments("Geekeey.Arcade.NET.Sdk.Razor", "razor")]
- [Arguments("Geekeey.Arcade.NET.Sdk.Web", "web")]
- public async Task SdkPackageCanBeConsumedFromAFeed(string packageId, string name)
- {
- // Arrange
- var version = FindPackageVersion(packageId);
- using var sut = await SdkTestProject.CreateAsync(name, version);
-
- // Act
- await sut.RunDotnetAsync($"restore --configfile \"{sut.NuGetConfigPath}\" --packages \"{sut.PackagesPath}\" --nologo");
- await sut.RunDotnetAsync("build --no-restore --nologo");
- await sut.RunDotnetAsync($"pack --no-restore --configuration Debug --output \"{sut.PackedPath}\" --nologo");
-
- // Assert
- await Assert.That(File.Exists(Path.Combine(sut.ProjectPath, "bin", "Debug", "net10.0", $"{sut.ProjectName}.dll"))).IsTrue();
- await Assert.That(Directory.Exists(sut.PackedPath)).IsTrue();
- await Assert.That(Directory.EnumerateFiles(sut.PackedPath, $"{sut.ProjectName}.*.nupkg").Any()).IsTrue();
- }
-
- [Test]
- public async Task TestSdkPackageStoresTestOutputInArtifacts()
- {
- // Arrange
- var version = FindPackageVersion("Geekeey.Arcade.NET.Sdk.Test");
- using var sut = await SdkTestProject.CreateAsync("test", version);
- await sut.RunDotnetAsync($"restore --configfile \"{sut.NuGetConfigPath}\" --packages \"{sut.PackagesPath}\" --nologo");
- await sut.RunDotnetAsync("build --no-restore --nologo");
-
- var outputDirectory = Path.Combine(sut.ProjectPath, "artifacts", "bin", sut.ProjectName, "debug");
- await Assert.That(File.Exists(Path.Combine(outputDirectory, $"{sut.ProjectName}.dll"))).IsTrue();
-
- // Act
- var stdout = await sut.RunDotnetAsync("run --no-build --no-restore");
-
- // Assert
- await Assert.That(stdout.Contains("succeeded: 1", StringComparison.Ordinal)).IsTrue();
- }
-
- private static string FindPackageVersion(string packageId)
- {
- var pattern = $"""^{Regex.Escape(packageId)}\.(?\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)\.nupkg$""";
- foreach (var package in Directory.EnumerateFiles(NuGetFeedPath, "*.nupkg"))
- {
- var match = Regex.Match(Path.GetFileName(package), pattern, RegexOptions.CultureInvariant);
- if (match.Success)
- {
- return match.Groups["version"].Value;
- }
- }
-
- throw new InvalidOperationException($"No current package found for {packageId}. Run dotnet pack first.");
- }
-
- private sealed class SdkTestProject : IDisposable
- {
- private SdkTestProject(string root)
- {
- RootPath = root;
- ProjectPath = Path.Combine(RootPath, "Project");
- PackagesPath = Path.Combine(RootPath, "packages");
- PackedPath = Path.Combine(RootPath, "packed");
- NuGetConfigPath = Path.Combine(RootPath, "NuGet.config");
- }
-
- public static async Task CreateAsync(string name, string version)
- {
- var sut = new SdkTestProject(Path.Combine(Path.GetTempPath(), $"arcade-sdk-test-{Guid.NewGuid():N}"));
- try
- {
- Directory.CreateDirectory(sut.ProjectPath);
- Directory.Copy(Path.Combine(AppContext.BaseDirectory, "fixtures", name), sut.ProjectPath);
- sut.ProjectFilePath = Directory.EnumerateFiles(sut.ProjectPath, "*.csproj").Single();
- sut.ProjectName = Path.GetFileNameWithoutExtension(sut.ProjectFilePath);
- var project = await File.ReadAllTextAsync(sut.ProjectFilePath);
- await File.WriteAllTextAsync(sut.ProjectFilePath, project.Replace("{0}", version, StringComparison.Ordinal));
- var contents = $"""
-
-
-
-
-
-
-
- """;
- await File.WriteAllTextAsync(sut.NuGetConfigPath, contents);
- return sut;
- }
- catch
- {
- sut.Dispose();
- throw;
- }
- }
-
- public string RootPath { get; }
-
- public string ProjectPath { get; }
-
- public string ProjectFilePath { get; private set; } = "";
-
- public string ProjectName { get; private set; } = "";
-
- public string PackagesPath { get; }
-
- public string PackedPath { get; }
-
- public string NuGetConfigPath { get; }
-
- public async Task RunDotnetAsync(string arguments)
- {
- var startInfo = new ProcessStartInfo("dotnet", arguments)
- {
- WorkingDirectory = ProjectPath,
- RedirectStandardOutput = true,
- RedirectStandardError = true,
- UseShellExecute = false,
- CreateNoWindow = true,
- Environment =
- {
- ["NUGET_PACKAGES"] = PackagesPath,
- ["DOTNET_CLI_DO_NOT_USE_MSBUILD_SERVER"] = "1",
- ["TUNIT_DISABLE_GITHUB_REPORTER"] = "true"
- }
- };
- var process = Process.Start(startInfo) ?? throw new InvalidOperationException("Could not start dotnet.");
- var output = await process.StandardOutput.ReadToEndAsync();
- var error = await process.StandardError.ReadToEndAsync();
- await process.WaitForExitAsync();
- return process.ExitCode is 0 ? output : throw new InvalidOperationException($"dotnet {arguments} failed with exit code {process.ExitCode}.\n{output}\n{error}");
- }
-
- public void Dispose()
- {
- Directory.Delete(RootPath, recursive: true);
- }
- }
-}
diff --git a/src/sdk.tests/Shared/Command.cs b/src/sdk.tests/Shared/Command.cs
new file mode 100644
index 0000000..a14b2ed
--- /dev/null
+++ b/src/sdk.tests/Shared/Command.cs
@@ -0,0 +1,74 @@
+// Copyright (c) The Geekeey Authors
+// SPDX-License-Identifier: EUPL-1.2
+
+using System.Diagnostics;
+
+namespace Geekeey.Arcade.NET.Tests.Shared;
+
+internal sealed record Command(string WorkingDirectory, IEnumerable> Environment)
+{
+ public bool ThrowOnExit { get; init; }
+
+ public static Command WithWorkingDirectory(string path)
+ {
+ return new Command(path, []);
+ }
+
+ public Command WithEnvironment(string name, string value)
+ {
+ return WithEnvironment([new KeyValuePair(name, value)]);
+ }
+
+ public Command WithEnvironment(IEnumerable> environment)
+ {
+ var env = new Dictionary(Environment);
+
+ foreach (var pair in environment)
+ {
+ env[pair.Key] = pair.Value;
+ }
+
+ return this with { Environment = env };
+ }
+
+ public Command WithThrowOnExit()
+ {
+ return this with { ThrowOnExit = true };
+ }
+
+ public async Task RunAsync(string exe, params IReadOnlyList args)
+ {
+ ArgumentNullException.ThrowIfNull(args);
+
+ var startInfo = new ProcessStartInfo(exe)
+ {
+ WorkingDirectory = WorkingDirectory,
+ RedirectStandardOutput = true,
+ RedirectStandardError = true,
+ UseShellExecute = false,
+ CreateNoWindow = true
+ };
+
+ foreach (var argument in args)
+ {
+ startInfo.ArgumentList.Add(argument);
+ }
+
+ foreach (var pair in Environment)
+ {
+ startInfo.Environment[pair.Key] = pair.Value;
+ }
+
+ var process = Process.Start(startInfo) ?? throw new InvalidOperationException("Could not start dotnet.");
+ var output = await process.StandardOutput.ReadToEndAsync();
+ var error = await process.StandardError.ReadToEndAsync();
+
+ await process.WaitForExitAsync();
+
+ _ = ThrowOnExit && process.ExitCode is not 0
+ ? throw new InvalidOperationException($"'{exe}' exited with code {process.ExitCode}.{System.Environment.NewLine}{error}{output}")
+ : 0;
+
+ return new CommandOutput(output, error, process.ExitCode);
+ }
+}
diff --git a/src/sdk.tests/Shared/CommandOutput.cs b/src/sdk.tests/Shared/CommandOutput.cs
new file mode 100644
index 0000000..157733d
--- /dev/null
+++ b/src/sdk.tests/Shared/CommandOutput.cs
@@ -0,0 +1,6 @@
+// Copyright (c) The Geekeey Authors
+// SPDX-License-Identifier: EUPL-1.2
+
+namespace Geekeey.Arcade.NET.Tests.Shared;
+
+internal sealed record CommandOutput(string StdOut, string StdErr, int ExitCode);
diff --git a/src/sdk.tests/Shared/Project.cs b/src/sdk.tests/Shared/Project.cs
new file mode 100644
index 0000000..78ec8a1
--- /dev/null
+++ b/src/sdk.tests/Shared/Project.cs
@@ -0,0 +1,69 @@
+// Copyright (c) The Geekeey Authors
+// SPDX-License-Identifier: EUPL-1.2
+
+namespace Geekeey.Arcade.NET.Tests.Shared;
+
+internal sealed class Project : IDisposable
+{
+ private readonly DirectoryInfo _root;
+ private readonly DirectoryInfo _source;
+ private readonly DirectoryInfo _packages;
+ private readonly Command _shell;
+
+ public Project(DirectoryInfo root)
+ {
+ _root = root;
+ _source = _root.CreateSubdirectory("src");
+ _packages = _root.CreateSubdirectory("packages");
+ _shell = Command.WithWorkingDirectory(_source.FullName)
+ .WithEnvironment("DOTNET_CLI_DO_NOT_USE_MSBUILD_SERVER", "1")
+ .WithEnvironment("TUNIT_DISABLE_GITHUB_REPORTER", "true")
+ .WithEnvironment("NUGET_PACKAGES", _packages.FullName);
+ }
+
+ public string Path
+ {
+ get => _source.FullName;
+ }
+
+ public Task RunAsync(string exe, params IReadOnlyList args)
+ {
+ return _shell.RunAsync(exe, args);
+ }
+
+ public void CopyFrom(string path)
+ {
+ System.IO.Directory.Copy(path, _source.FullName);
+ }
+
+ public FileInfo File(params IReadOnlyList path)
+ {
+ return new FileInfo(System.IO.Path.Combine([_source.FullName, .. path]));
+ }
+
+ public DirectoryInfo Directory(params IReadOnlyList path)
+ {
+ return new DirectoryInfo(System.IO.Path.Combine([_source.FullName, .. path]));
+ }
+
+ public async Task Template(string path, string from, string insert)
+ {
+ string content;
+ var file = File(path);
+
+ using (var text = file.OpenText())
+ {
+ content = await text.ReadToEndAsync();
+ }
+
+ content = content.Replace(from, insert, StringComparison.Ordinal);
+
+ await using var writer = new StreamWriter(file.OpenWrite());
+ await writer.WriteAsync(content);
+ }
+
+ public void Dispose()
+ {
+ _root.Delete(recursive: true);
+ }
+}
diff --git a/src/sdk.tests/fixtures/base/nuget.config b/src/sdk.tests/fixtures/base/nuget.config
new file mode 100644
index 0000000..c2bf5ad
--- /dev/null
+++ b/src/sdk.tests/fixtures/base/nuget.config
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/sdk.tests/fixtures/base/BaseConsumer.csproj b/src/sdk.tests/fixtures/base/project.csproj
similarity index 62%
rename from src/sdk.tests/fixtures/base/BaseConsumer.csproj
rename to src/sdk.tests/fixtures/base/project.csproj
index 65f8f3f..e715221 100644
--- a/src/sdk.tests/fixtures/base/BaseConsumer.csproj
+++ b/src/sdk.tests/fixtures/base/project.csproj
@@ -1,9 +1,7 @@
net10.0
- true
- false
- BaseConsumer
+ My.Package
IDE0055
diff --git a/src/sdk.tests/fixtures/razor/nuget.config b/src/sdk.tests/fixtures/razor/nuget.config
new file mode 100644
index 0000000..c2bf5ad
--- /dev/null
+++ b/src/sdk.tests/fixtures/razor/nuget.config
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/sdk.tests/fixtures/razor/RazorConsumer.csproj b/src/sdk.tests/fixtures/razor/project.csproj
similarity index 63%
rename from src/sdk.tests/fixtures/razor/RazorConsumer.csproj
rename to src/sdk.tests/fixtures/razor/project.csproj
index b3de58d..6f55742 100644
--- a/src/sdk.tests/fixtures/razor/RazorConsumer.csproj
+++ b/src/sdk.tests/fixtures/razor/project.csproj
@@ -1,8 +1,7 @@
net10.0
- RazorConsumer
- false
+ My.Package
IDE0055
diff --git a/src/sdk.tests/fixtures/test/Directory.Build.props b/src/sdk.tests/fixtures/test/Directory.Build.props
deleted file mode 100644
index 1b15241..0000000
--- a/src/sdk.tests/fixtures/test/Directory.Build.props
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- $(MSBuildProjectDirectory)/artifacts/
-
-
diff --git a/src/sdk.tests/fixtures/test/nuget.config b/src/sdk.tests/fixtures/test/nuget.config
new file mode 100644
index 0000000..c2bf5ad
--- /dev/null
+++ b/src/sdk.tests/fixtures/test/nuget.config
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/sdk.tests/fixtures/test/TestConsumer.csproj b/src/sdk.tests/fixtures/test/project.csproj
similarity index 53%
rename from src/sdk.tests/fixtures/test/TestConsumer.csproj
rename to src/sdk.tests/fixtures/test/project.csproj
index 6f86a2d..7e4f26d 100644
--- a/src/sdk.tests/fixtures/test/TestConsumer.csproj
+++ b/src/sdk.tests/fixtures/test/project.csproj
@@ -1,14 +1,11 @@
net10.0
- true
- false
- TestConsumer
- true
+ My.Package
Exe
IDE0055
-
+
diff --git a/src/sdk.tests/fixtures/web/nuget.config b/src/sdk.tests/fixtures/web/nuget.config
new file mode 100644
index 0000000..c2bf5ad
--- /dev/null
+++ b/src/sdk.tests/fixtures/web/nuget.config
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/sdk.tests/fixtures/web/WebConsumer.csproj b/src/sdk.tests/fixtures/web/project.csproj
similarity index 67%
rename from src/sdk.tests/fixtures/web/WebConsumer.csproj
rename to src/sdk.tests/fixtures/web/project.csproj
index 3d9e2d9..2af4418 100644
--- a/src/sdk.tests/fixtures/web/WebConsumer.csproj
+++ b/src/sdk.tests/fixtures/web/project.csproj
@@ -1,9 +1,7 @@
net10.0
- true
- false
- WebConsumer
+ My.Package
Exe
IDE0055
diff --git a/src/sdk.tests/testconfig.json b/src/sdk.tests/testconfig.json
new file mode 100644
index 0000000..2b97a3f
--- /dev/null
+++ b/src/sdk.tests/testconfig.json
@@ -0,0 +1,5 @@
+{
+ "platformOptions": {
+ "resultDirectory": "../../artifacts/log"
+ }
+}
diff --git a/src/sdk/Sdk.slnf b/src/sdk/Sdk.slnf
deleted file mode 100644
index a8bb8ff..0000000
--- a/src/sdk/Sdk.slnf
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "solution": {
- "path": "../../arcade.slnx",
- "projects": [
- "src/sdk/Sdk/Geekeey.Arcade.NET.Sdk/Geekeey.Arcade.NET.Sdk.csproj",
- "src/sdk/Sdk/Geekeey.Arcade.NET.Sdk.Razor/Geekeey.Arcade.NET.Sdk.Razor.csproj",
- "src/sdk/Sdk/Geekeey.Arcade.NET.Sdk.Test/Geekeey.Arcade.NET.Sdk.Test.csproj",
- "src/sdk/Sdk/Geekeey.Arcade.NET.Sdk.Web/Geekeey.Arcade.NET.Sdk.Web.csproj"
- ]
- }
-}
diff --git a/src/sdk/Sdk.slnx b/src/sdk/Sdk.slnx
new file mode 100644
index 0000000..b545fea
--- /dev/null
+++ b/src/sdk/Sdk.slnx
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/sdk/Sdk/Geekeey.Arcade.NET.Sdk.Test/Geekeey.Arcade.NET.Sdk.Test.csproj b/src/sdk/Sdk/Geekeey.Arcade.NET.Sdk.Test/Geekeey.Arcade.NET.Sdk.Test.csproj
index be50037..ef2326b 100644
--- a/src/sdk/Sdk/Geekeey.Arcade.NET.Sdk.Test/Geekeey.Arcade.NET.Sdk.Test.csproj
+++ b/src/sdk/Sdk/Geekeey.Arcade.NET.Sdk.Test/Geekeey.Arcade.NET.Sdk.Test.csproj
@@ -6,9 +6,6 @@
true
false
true
-
- false
MSBuild SDK for test projects with standardized build, analyzer, and editor configuration defaults.