From 93967f22c1d5e00a3b75f60c209c7925791eeb56 Mon Sep 17 00:00:00 2001 From: rory-cd Date: Tue, 18 Aug 2026 12:32:50 +1000 Subject: [PATCH] fix: temporaily remove nuget package guide This documentation is for the NuGet package update, which has not yet been merged: https://github.com/thoth-tech/splashkit-core/pull/149 --- .../04-nuget-package-guide.mdx | 264 ------------------ .../images/nuget-testing/1-test-runner.png | Bin 13927 -> 0 bytes 2 files changed, 264 deletions(-) delete mode 100644 src/content/docs/Products/SplashKit/Documentation/SplashKit Expansion/04-nuget-package-guide.mdx delete mode 100644 src/content/docs/Products/SplashKit/Documentation/SplashKit Expansion/images/nuget-testing/1-test-runner.png diff --git a/src/content/docs/Products/SplashKit/Documentation/SplashKit Expansion/04-nuget-package-guide.mdx b/src/content/docs/Products/SplashKit/Documentation/SplashKit Expansion/04-nuget-package-guide.mdx deleted file mode 100644 index cbdf435d6..000000000 --- a/src/content/docs/Products/SplashKit/Documentation/SplashKit Expansion/04-nuget-package-guide.mdx +++ /dev/null @@ -1,264 +0,0 @@ ---- -title: "NuGet Package Guide" -description: "Guide to building and testing the SplashKit NuGet package for .NET" ---- - -import { FileTree, Steps } from "@astrojs/starlight/components"; - -## Introduction - -NuGet is the package manager for .NET. NuGet packages are essentially zip files containing reusable -code, libraries, and metadata. Packages can be distributed privately or publicly via NuGet -repositories. For more information, visit [nuget.org](https://www.nuget.org/). - -The SplashKit NuGet package has two primary purposes: - -- Provides C# bindings for SplashKit, translated from C++ using SplashKit Translator. The bindings - allow users to create SplashKit projects with C#. -- Provides SplashKit native libraries for Windows (x64) and macOS. These libraries allow Windows and - Mac users to create and run SplashKit projects in C# without installing the libraries separately - via SplashKit Manager (SKM). - -:::note - -**Prerequisite:** Ensure [.NET SDK](https://dotnet.microsoft.com/en-us/download) is installed. - -::: - -## Building the Package - - - -1. #### Download the SplashKit native libraries - - Download the latest stable libraries from [SKM](https://github.com/splashkit/skm.git). Libraries - should be placed in `/tools/scripts/nuget-pkg/Libraries/win64` and - `/tools/scripts/nuget-pkg/Libraries/macos` respectively. This step can be automated via the use - of the bash script found at `/tools/scripts/nuget-pkg/download-libraries.sh`. - - :::note - - SKM does not include pre-compiled libraries for Linux. It instead uses a script to install - dependencies and builds based on the detected distro. - - ::: - -2. #### Open the NuGet package directory - - Navigate to `/tools/scripts/nuget-pkg`. This directory contains configuration settings for the - package, along with the associated icon and description. - -3. #### Build the package - - Run one of the below commands, ensuring to replace _YOUR_VERSION_ with the relevant version - number (e.g. 1.3.0): - - **For debug** - - ```shell - dotnet build --configuration Debug -p:version=YOUR_VERSION-debug - ``` - - **For release** - - ```shell - dotnet build --configuration Release -p:version=YOUR_VERSION - ``` - - This will build the package and output to `tools/scripts/nuget-pkg/bin/` as detailed in - [Exploring the Output](#exploring-the-output). - -4. #### Check the output directories - Ensure both `Release` and `Debug` directories exist in `tools/scripts/nuget-pkg/bin/`. If either - is missing, create the empty directory as needed. This is to ensure the test programs run without - errors. - - - -### Exploring the Output - -In the `tools/scripts/nuget-pkg/bin/` directory, there will be a directory corresponding to the -built package - either `Debug` or `Release`. This directory contains the NuGet package itself -(`SplashKit.X.X.X.nupkg`), along with separate directories for each targeted .NET version. These -directories are for referencing/testing, and can be ignored - the package itself does not depend -upon them. - -## Testing - -A suite of test programs is provided in the form of a C# solution, with a separate project/directory -for each test. - - - -- tools - - scripts - - test - - Main/ - - Directory.Build.props - - Directory.Packages.props - - GlobalSettings.cs - - NuGet.config - - NuGetTests.sln - - - -The provided tests are translations of the SplashKit core integration tests. The tests can be run -individually from their respective folders, but are best launched using the test runner located in -the `Main` directory. - -:::note - -For more information on SplashKit core integration tests, see -[here](https://thoth-tech.netlify.app/products/splashkit/documentation/splashkit-expansion/#building-the-test-programs). - -::: - -### Running the Provided Tests - - - -1. #### Check local package sources - - `NuGet.config` sets the local NuGet package sources. If one of these directories does not exist, - either create it, or comment out the corresponding entry in `NuGet.config`. - -2. #### Set target package version - - `Directory.Packages.props` specifies the target NuGet package version. Update this file to match - the version being tested. - -3. #### Check target .NET versions - - `Directory.Build.props` specifies .NET versions for multi-targeting. These should match the .NET - versions being targeted by the package build. - - :::caution - - Ensure **every** listed version of .NET is installed. - - ::: - -4. #### Run the test runner - - Open the `Main` directory. Run the following command, replacing _TARGET_FRAMEWORK_ with the - framework to be tested, e.g. For .NET 9, use `dotnet run -f net9.0`. - - ```shell - dotnet run -f - ``` - - :::note - - To aid testing and ensure consistency, the test runner lists the target and runtime .NET - framework, along with the NuGet package version. These should be checked on every run to ensure - alignment with the intended targets: - - ![Run NuGet Tests](images/nuget-testing/1-test-runner.png) - - ::: - -5. #### Select test - - Input a number to build and run the corresponding test. - - :::caution - - **Known issue:** The included graphics test currently produces inconsistent results in a - MSYS2/Windows environment. This behaviour is consistent with SplashKit installed via SKM and is - being investigated. - - ::: - -6. #### Re-run as necessary - To ensure the package is fully functional, the tests should be re-run to cover each combination - of framework and architecture. Every test should produce the expected output. - - - -### Updating or Adding Tests - -As noted in [Running the Provided Tests](#running-the-provided-tests), the _NuGetTests_ solution -specifies the NuGet version and target frameworks in `Directory.Packages.props` and -`Directory.Build.props` respectively. These should be updated at a solution level, rather than -separate configurations for each test project. This ensures ease of use and reduces room for error. - -### Adding New Tests to the Solution - - - -1. Create a new directory in `/tools/scripts/test`, for example: - - ```shell - mkdir MyTest - ``` - -2. Inside the new directory, create a new project with - - ```shell - dotnet new console - ``` - -3. Edit the project's `.csproj` file to remove any `` tags, since this would - override the solution's multi-targeting. - -4. Write your new test in `Program.cs` - -5. If loading resources (e.g. images, fonts, etc.) use the following line to utilise existing - resources from the main SplashKit test suite. - - ```cs - SetResourcesPath(GlobalSettings.ResourcePath); - ``` - - - -:::note - -The test runner checks the solution directory for any `.csproj` files on input. Therefore, new tests -are detected by the runner automatically, and can even be added without closing the runner. - -::: - -### Updating Existing Tests - -Existing tests can be updated by editing `Program.cs` in the corresponding project's directory. -Since the test runner (`Main`) builds each project before running, there is no need to rebuild the -runner upon updating a test. The runner is designed to be left running during updates, to speed up -development. - -If loading resources (e.g. images, fonts, etc.) use the following line to utilise existing resources -from the main SplashKit test suite: - -```cs -SetResourcesPath(GlobalSettings.ResourcePath); -``` - -### Creating Tests Outside of the Provided Solution - -Normally, an end user would use `dotnet add package splashkit` to reference the SplashKit package. -However, this will default to the latest stable SplashKit version, skipping the locally built one. -Instead, do the following: - - - -1. Create a new project using - - ```shell - dotnet new console - ``` - -2. Create a `NuGet.config` file in the project (or solution) directory, specifying the path to the - target package. An example can be found in `/tools/scripts/test`. - -3. Add the following to the `.csproj`, replacing _TARGET_VERSION_ with the targeted NuGet package - version: - - ```xml - - - - ``` - -4. Add `using static SplashKitSDK.SplashKit;` to `Program.cs` - - diff --git a/src/content/docs/Products/SplashKit/Documentation/SplashKit Expansion/images/nuget-testing/1-test-runner.png b/src/content/docs/Products/SplashKit/Documentation/SplashKit Expansion/images/nuget-testing/1-test-runner.png deleted file mode 100644 index 6255fceca63c73421e69a6743fbd59003f1aaa0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13927 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