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.