From c5acb989961807d434e7d5bc31a4ac1a4e4cc1fd Mon Sep 17 00:00:00 2001 From: rekhoff Date: Tue, 13 Jan 2026 17:03:05 -0800 Subject: [PATCH 1/7] Initial commit of new `cargo ci dlls` command for building C# DLLs and NuGet packages --- Cargo.lock | 1 + sdks/csharp/packages/.gitignore | 3 + .../unversioned/analyzers.meta | 8 + .../unversioned/analyzers/dotnet.meta | 8 + .../unversioned/analyzers/dotnet/cs.meta | 8 + .../cs/SpacetimeDB.BSATN.Codegen.dll.meta | 21 +++ .../unversioned/lib.meta | 8 + .../lib/SpacetimeDB.BSATN.Runtime.dll.meta | 21 +++ .../unversioned/lib/net8.0.meta | 8 + .../unversioned/lib/netstandard2.1.meta | 8 + .../unversioned/analyzers.meta | 8 + .../unversioned/analyzers/dotnet.meta | 8 + .../unversioned/analyzers/dotnet/cs.meta | 8 + .../dotnet/cs/SpacetimeDB.Codegen.dll.meta | 21 +++ .../spacetimedb.runtime/unversioned/lib.meta | 8 + .../lib/SpacetimeDB.BSATN.Runtime.dll.meta | 21 +++ .../lib/SpacetimeDB.Runtime.dll.meta | 21 +++ .../unversioned/lib/net8.0.meta | 8 + tools/ci/Cargo.toml | 1 + tools/ci/README.md | 15 ++ tools/ci/src/main.rs | 154 ++++++++++++++++++ 21 files changed, 367 insertions(+) create mode 100644 sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers.meta create mode 100644 sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet.meta create mode 100644 sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs.meta create mode 100644 sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta create mode 100644 sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib.meta create mode 100644 sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta create mode 100644 sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/net8.0.meta create mode 100644 sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/netstandard2.1.meta create mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers.meta create mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet.meta create mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs.meta create mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta create mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/lib.meta create mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta create mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.Runtime.dll.meta create mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/net8.0.meta diff --git a/Cargo.lock b/Cargo.lock index 4fac718f3b2..40ee962150c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -882,6 +882,7 @@ dependencies = [ "env_logger 0.10.2", "log", "regex", + "semver", "tempfile", ] diff --git a/sdks/csharp/packages/.gitignore b/sdks/csharp/packages/.gitignore index 7d9dea737b9..affae7ffda3 100644 --- a/sdks/csharp/packages/.gitignore +++ b/sdks/csharp/packages/.gitignore @@ -1,6 +1,9 @@ # Ignore most of NuGet package structure, except DLLs which are required by Unity. /*/*/* +!/spacetimedb.bsatn.runtime/unversioned/** +!/spacetimedb.runtime/unversioned/** + !/*/*/analyzers !/*/*/analyzers.meta diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers.meta b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers.meta new file mode 100644 index 00000000000..07ad59dca50 --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4d9e9f57c2d84d77856b55d6f5e1a3f4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet.meta b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet.meta new file mode 100644 index 00000000000..14614426e03 --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37dbf75b4dcd41d3a7c28d69b8b84c9b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs.meta b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs.meta new file mode 100644 index 00000000000..3fd45e52554 --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0f2c3c8aa0d44b0a8b8bfbf78c7dd104 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta new file mode 100644 index 00000000000..4655dc73f7a --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 7bf9b84a9abf4c2fbf4a76b30f4d1e0a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 1 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib.meta b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib.meta new file mode 100644 index 00000000000..e1767a502fc --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6f5c1a1a8c6440a1a4c0c4d6c37f3d21 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta new file mode 100644 index 00000000000..26f9dd59779 --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: d6b42e7a9fba4cdd88c89c03c7396f58 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 1 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/net8.0.meta b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/net8.0.meta new file mode 100644 index 00000000000..af57af108f5 --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/net8.0.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3f1f1d4d0e14434db1d5b6c8b2e4a1f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/netstandard2.1.meta b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/netstandard2.1.meta new file mode 100644 index 00000000000..c49a8c101f9 --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/netstandard2.1.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7ac07b5b5b004f7bb3c20e12b52a3f1c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers.meta new file mode 100644 index 00000000000..119521b6d4d --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6a0f09bc7ea54767a8d114ad57dbbb1c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet.meta new file mode 100644 index 00000000000..ea82b5c585a --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3d3d1170b80c4d66b3fa18fbd93803f3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs.meta new file mode 100644 index 00000000000..c3331ea0d2a --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8db6bdb615d64f9da5c1c5c0ee54eec6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta new file mode 100644 index 00000000000..e1ce393d8cb --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 1e346e9c545943cdb0b4a0e7f3c8dc45 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 1 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib.meta new file mode 100644 index 00000000000..79f1585827f --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e7417505b8d7424fb318ccbb8efee09f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta new file mode 100644 index 00000000000..3cbb277e503 --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 4c8a24576ee74bb9aac08e4e9cb76a31 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 1 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.Runtime.dll.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.Runtime.dll.meta new file mode 100644 index 00000000000..8258ae7175e --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.Runtime.dll.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 1841d579d9b64ed7b81be0d08c6adb2b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 1 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/net8.0.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/net8.0.meta new file mode 100644 index 00000000000..f3c3a590a21 --- /dev/null +++ b/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/net8.0.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1cb19fbc4cd9479fb94e83e3b1bcd0ac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/tools/ci/Cargo.toml b/tools/ci/Cargo.toml index a79a4917ca7..c786d09d8f5 100644 --- a/tools/ci/Cargo.toml +++ b/tools/ci/Cargo.toml @@ -12,3 +12,4 @@ regex.workspace = true duct.workspace = true tempfile.workspace = true env_logger.workspace = true +semver.workspace = true diff --git a/tools/ci/README.md b/tools/ci/README.md index 080dc354f33..3c2a563c3e8 100644 --- a/tools/ci/README.md +++ b/tools/ci/README.md @@ -70,6 +70,21 @@ Usage: wasm-bindings - `--help`: Print help (see a summary with '-h') +### `dlls` + +Builds and packs C# DLLs and NuGet packages for local Unity workflows + +Packs the in-repo C# NuGet packages and restores the C# SDK to populate `sdks/csharp/packages/**`. Then overlays Unity `.meta` skeleton files from an unversioned directory onto the restored versioned package directory, so Unity can associate stable meta files with the most recently built package. + +**Usage:** +```bash +Usage: dlls +``` + +**Options:** + +- `--help`: Print help (see a summary with '-h') + ### `smoketests` Runs smoketests diff --git a/tools/ci/src/main.rs b/tools/ci/src/main.rs index 036e8993033..d2dbbcd5069 100644 --- a/tools/ci/src/main.rs +++ b/tools/ci/src/main.rs @@ -1,7 +1,9 @@ use anyhow::{bail, Result}; use clap::{CommandFactory, Parser, Subcommand}; use duct::cmd; +use semver::Version; use std::path::Path; +use std::path::PathBuf; use std::{env, fs}; const README_PATH: &str = "tools/ci/README.md"; @@ -30,6 +32,105 @@ struct Cli { skip: Vec, } +fn ensure_repo_root() -> Result<()> { + if !Path::new("Cargo.toml").exists() { + bail!("You must execute this command from the SpacetimeDB repository root (where Cargo.toml is located)"); + } + Ok(()) +} + +fn overlay_unversioned_skeleton(pkg_id: &str) -> Result<()> { + let pkg_root = Path::new("sdks/csharp/packages").join(pkg_id); + if !pkg_root.exists() { + log::info!( + "Skipping skeleton overlay for {pkg_id}: {} does not exist", + pkg_root.display() + ); + return Ok(()); + } + + let unversioned = pkg_root.join("unversioned"); + if !unversioned.exists() { + log::info!( + "Skipping skeleton overlay for {pkg_id}: {} does not exist", + unversioned.display() + ); + return Ok(()); + } + + let versioned_dir = match find_latest_semver_subdir(&pkg_root) { + Ok(dir) => dir, + Err(err) => { + log::info!( + "Skipping skeleton overlay for {pkg_id}: could not find a versioned directory under {} ({err})", + pkg_root.display() + ); + return Ok(()); + } + }; + + copy_overlay_dir(&unversioned, &versioned_dir) +} + +fn find_latest_semver_subdir(dir: &Path) -> Result { + let mut best: Option<(Version, PathBuf)> = None; + for entry in fs::read_dir(dir)? { + let entry = entry?; + if !entry.file_type()?.is_dir() { + continue; + } + + let name = entry.file_name().to_string_lossy().to_string(); + if name == "unversioned" { + continue; + } + let Ok(version) = Version::parse(&name) else { + continue; + }; + + match best.as_ref() { + None => best = Some((version, entry.path())), + Some((best_v, _)) if version > *best_v => best = Some((version, entry.path())), + _ => {} + } + } + + best.map(|(_, p)| p).ok_or_else(|| { + anyhow::anyhow!( + "Could not find any versioned directories under {}", + dir.display() + ) + }) +} + +fn copy_overlay_dir(src: &Path, dst: &Path) -> Result<()> { + if !src.exists() { + bail!("Skeleton directory does not exist: {}", src.display()); + } + if !dst.exists() { + bail!("Destination directory does not exist: {}", dst.display()); + } + + for entry in fs::read_dir(src)? { + let entry = entry?; + let src_path = entry.path(); + let dst_path = dst.join(entry.file_name()); + if entry.file_type()?.is_dir() { + if !dst_path.exists() { + fs::create_dir_all(&dst_path)?; + } + copy_overlay_dir(&src_path, &dst_path)?; + } else { + if let Some(parent) = dst_path.parent() { + fs::create_dir_all(parent)?; + } + fs::copy(&src_path, &dst_path)?; + } + } + + Ok(()) +} + #[derive(Subcommand)] enum CiCmd { /// Runs tests @@ -46,6 +147,12 @@ enum CiCmd { /// /// Runs tests for the codegen crate and builds a test module with the wasm bindings. WasmBindings, + /// Builds and packs C# DLLs and NuGet packages for local Unity workflows + /// + /// Packs the in-repo C# NuGet packages and restores the C# SDK to populate `sdks/csharp/packages/**`. + /// Then overlays Unity `.meta` skeleton files from an unversioned directory onto the restored versioned + /// package directory, so Unity can associate stable meta files with the most recently built package. + Dlls, /// Runs smoketests /// /// Executes the smoketests suite with some default exclusions. @@ -211,6 +318,53 @@ fn main() -> Result<()> { .run()?; } + Some(CiCmd::Dlls) => { + ensure_repo_root()?; + + cmd!( + "dotnet", + "pack", + "crates/bindings-csharp/BSATN.Runtime", + "-c", + "Release" + ) + .run()?; + cmd!( + "dotnet", + "pack", + "crates/bindings-csharp/Runtime", + "-c", + "Release" + ) + .run()?; + + cmd!("dotnet", "pack", "-c", "Release") + .dir("sdks/csharp") + .run()?; + + let bsatn_source = Path::new("crates/bindings-csharp/BSATN.Runtime/bin/Release") + .canonicalize() + .unwrap_or_else(|_| PathBuf::from("crates/bindings-csharp/BSATN.Runtime/bin/Release")); + let runtime_source = Path::new("crates/bindings-csharp/Runtime/bin/Release") + .canonicalize() + .unwrap_or_else(|_| PathBuf::from("crates/bindings-csharp/Runtime/bin/Release")); + + let restore_args = vec![ + "restore".to_string(), + "SpacetimeDB.ClientSDK.csproj".to_string(), + "--source".to_string(), + bsatn_source.to_string_lossy().to_string(), + "--source".to_string(), + runtime_source.to_string_lossy().to_string(), + "--source".to_string(), + "https://api.nuget.org/v3/index.json".to_string(), + ]; + cmd("dotnet", restore_args).dir("sdks/csharp").run()?; + + overlay_unversioned_skeleton("spacetimedb.bsatn.runtime")?; + overlay_unversioned_skeleton("spacetimedb.runtime")?; + } + Some(CiCmd::Smoketests { args: smoketest_args }) => { let python = infer_python(); cmd( From 635de16d4dfb3752ea6922a63ca192d7c88729f3 Mon Sep 17 00:00:00 2001 From: rekhoff Date: Wed, 14 Jan 2026 14:41:02 -0800 Subject: [PATCH 2/7] Moved skeleton folder out of packages and fixed some build logic to support Unity --- sdks/csharp/packages/.gitignore | 3 - .../cs/SpacetimeDB.BSATN.Codegen.dll.meta | 21 ---- .../lib/SpacetimeDB.BSATN.Runtime.dll.meta | 21 ---- .../dotnet/cs/SpacetimeDB.Codegen.dll.meta | 21 ---- .../lib/SpacetimeDB.BSATN.Runtime.dll.meta | 21 ---- .../lib/SpacetimeDB.Runtime.dll.meta | 21 ---- sdks/csharp/unity-meta-skeleton.meta | 8 ++ .../spacetimedb.bsatn.runtime.meta | 8 ++ .../spacetimedb.bsatn.runtime}/analyzers.meta | 2 +- .../analyzers/dotnet.meta | 2 +- .../analyzers/dotnet/cs.meta | 2 +- .../cs/SpacetimeDB.BSATN.Codegen.dll.meta | 35 ++++++ .../spacetimedb.bsatn.runtime}/lib.meta | 2 +- .../lib/net8.0.meta | 2 +- .../net8.0/SpacetimeDB.BSATN.Runtime.dll.meta | 33 +++++ .../lib/netstandard2.1.meta | 2 +- .../spacetimedb.runtime.meta | 8 ++ .../spacetimedb.runtime}/analyzers.meta | 0 .../analyzers/dotnet.meta | 0 .../analyzers/dotnet/cs.meta | 0 .../dotnet/cs/SpacetimeDB.Codegen.dll.meta | 33 +++++ .../spacetimedb.runtime}/lib.meta | 0 .../spacetimedb.runtime}/lib/net8.0.meta | 0 tools/ci/src/main.rs | 119 ++++++++++++------ 24 files changed, 211 insertions(+), 153 deletions(-) delete mode 100644 sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta delete mode 100644 sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta delete mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta delete mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta delete mode 100644 sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.Runtime.dll.meta create mode 100644 sdks/csharp/unity-meta-skeleton.meta create mode 100644 sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime.meta rename sdks/csharp/{packages/spacetimedb.bsatn.runtime/unversioned => unity-meta-skeleton~/spacetimedb.bsatn.runtime}/analyzers.meta (77%) rename sdks/csharp/{packages/spacetimedb.bsatn.runtime/unversioned => unity-meta-skeleton~/spacetimedb.bsatn.runtime}/analyzers/dotnet.meta (77%) rename sdks/csharp/{packages/spacetimedb.bsatn.runtime/unversioned => unity-meta-skeleton~/spacetimedb.bsatn.runtime}/analyzers/dotnet/cs.meta (77%) create mode 100644 sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta rename sdks/csharp/{packages/spacetimedb.bsatn.runtime/unversioned => unity-meta-skeleton~/spacetimedb.bsatn.runtime}/lib.meta (77%) rename sdks/csharp/{packages/spacetimedb.bsatn.runtime/unversioned => unity-meta-skeleton~/spacetimedb.bsatn.runtime}/lib/net8.0.meta (77%) create mode 100644 sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib/net8.0/SpacetimeDB.BSATN.Runtime.dll.meta rename sdks/csharp/{packages/spacetimedb.bsatn.runtime/unversioned => unity-meta-skeleton~/spacetimedb.bsatn.runtime}/lib/netstandard2.1.meta (77%) create mode 100644 sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime.meta rename sdks/csharp/{packages/spacetimedb.runtime/unversioned => unity-meta-skeleton~/spacetimedb.runtime}/analyzers.meta (100%) rename sdks/csharp/{packages/spacetimedb.runtime/unversioned => unity-meta-skeleton~/spacetimedb.runtime}/analyzers/dotnet.meta (100%) rename sdks/csharp/{packages/spacetimedb.runtime/unversioned => unity-meta-skeleton~/spacetimedb.runtime}/analyzers/dotnet/cs.meta (100%) create mode 100644 sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta rename sdks/csharp/{packages/spacetimedb.runtime/unversioned => unity-meta-skeleton~/spacetimedb.runtime}/lib.meta (100%) rename sdks/csharp/{packages/spacetimedb.runtime/unversioned => unity-meta-skeleton~/spacetimedb.runtime}/lib/net8.0.meta (100%) diff --git a/sdks/csharp/packages/.gitignore b/sdks/csharp/packages/.gitignore index affae7ffda3..7d9dea737b9 100644 --- a/sdks/csharp/packages/.gitignore +++ b/sdks/csharp/packages/.gitignore @@ -1,9 +1,6 @@ # Ignore most of NuGet package structure, except DLLs which are required by Unity. /*/*/* -!/spacetimedb.bsatn.runtime/unversioned/** -!/spacetimedb.runtime/unversioned/** - !/*/*/analyzers !/*/*/analyzers.meta diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta deleted file mode 100644 index 4655dc73f7a..00000000000 --- a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta +++ /dev/null @@ -1,21 +0,0 @@ -fileFormatVersion: 2 -guid: 7bf9b84a9abf4c2fbf4a76b30f4d1e0a -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 1 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta b/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta deleted file mode 100644 index 26f9dd59779..00000000000 --- a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta +++ /dev/null @@ -1,21 +0,0 @@ -fileFormatVersion: 2 -guid: d6b42e7a9fba4cdd88c89c03c7396f58 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 1 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta deleted file mode 100644 index e1ce393d8cb..00000000000 --- a/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta +++ /dev/null @@ -1,21 +0,0 @@ -fileFormatVersion: 2 -guid: 1e346e9c545943cdb0b4a0e7f3c8dc45 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 1 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta deleted file mode 100644 index 3cbb277e503..00000000000 --- a/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.BSATN.Runtime.dll.meta +++ /dev/null @@ -1,21 +0,0 @@ -fileFormatVersion: 2 -guid: 4c8a24576ee74bb9aac08e4e9cb76a31 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 1 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.Runtime.dll.meta b/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.Runtime.dll.meta deleted file mode 100644 index 8258ae7175e..00000000000 --- a/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/SpacetimeDB.Runtime.dll.meta +++ /dev/null @@ -1,21 +0,0 @@ -fileFormatVersion: 2 -guid: 1841d579d9b64ed7b81be0d08c6adb2b -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 1 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/sdks/csharp/unity-meta-skeleton.meta b/sdks/csharp/unity-meta-skeleton.meta new file mode 100644 index 00000000000..7f5a052ac10 --- /dev/null +++ b/sdks/csharp/unity-meta-skeleton.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 204f4b1e72c6def40970d7871ecc1fad +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime.meta new file mode 100644 index 00000000000..605fd02b9a5 --- /dev/null +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7fd391d5cf1530247a9097f6572ccbd5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers.meta similarity index 77% rename from sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers.meta index 07ad59dca50..61e48372d2b 100644 --- a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers.meta +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4d9e9f57c2d84d77856b55d6f5e1a3f4 +guid: 4d72b75aab0ba43488cf618e31c1c907 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers/dotnet.meta similarity index 77% rename from sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers/dotnet.meta index 14614426e03..6c048c99da5 100644 --- a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet.meta +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers/dotnet.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 37dbf75b4dcd41d3a7c28d69b8b84c9b +guid: dd06752b31474fe4c89bf4269aa940c2 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers/dotnet/cs.meta similarity index 77% rename from sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers/dotnet/cs.meta index 3fd45e52554..73491e551c8 100644 --- a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/analyzers/dotnet/cs.meta +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers/dotnet/cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0f2c3c8aa0d44b0a8b8bfbf78c7dd104 +guid: 3a91a483175b52f49ae96615de55eca1 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta new file mode 100644 index 00000000000..6fc3330ca4c --- /dev/null +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/analyzers/dotnet/cs/SpacetimeDB.BSATN.Codegen.dll.meta @@ -0,0 +1,35 @@ +fileFormatVersion: 2 +guid: 7bf9b84a9abf4c2fbf4a76b30f4d1e0a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 0 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: +labels: + - RoslynAnalyzer \ No newline at end of file diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib.meta similarity index 77% rename from sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib.meta index e1767a502fc..dd68bea6de9 100644 --- a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib.meta +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6f5c1a1a8c6440a1a4c0c4d6c37f3d21 +guid: 35d39a294253b304b9c696d513e31d5b folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/net8.0.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib/net8.0.meta similarity index 77% rename from sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/net8.0.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib/net8.0.meta index af57af108f5..533462058a8 100644 --- a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/net8.0.meta +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib/net8.0.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3f1f1d4d0e14434db1d5b6c8b2e4a1f2 +guid: 965f7ca77cc65f040ae5cc0eae81fd09 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib/net8.0/SpacetimeDB.BSATN.Runtime.dll.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib/net8.0/SpacetimeDB.BSATN.Runtime.dll.meta new file mode 100644 index 00000000000..4ef02633fe1 --- /dev/null +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib/net8.0/SpacetimeDB.BSATN.Runtime.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 92450a91ba82349489665f7d11a31029 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 0 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/netstandard2.1.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib/netstandard2.1.meta similarity index 77% rename from sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/netstandard2.1.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib/netstandard2.1.meta index c49a8c101f9..25fcce10d40 100644 --- a/sdks/csharp/packages/spacetimedb.bsatn.runtime/unversioned/lib/netstandard2.1.meta +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.bsatn.runtime/lib/netstandard2.1.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7ac07b5b5b004f7bb3c20e12b52a3f1c +guid: dcac8bfc0f49a004fac5aaad32502c6b folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime.meta new file mode 100644 index 00000000000..f990b8e6b43 --- /dev/null +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed6383413f54042429fcbaef0423442e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/analyzers.meta similarity index 100% rename from sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/analyzers.meta diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/analyzers/dotnet.meta similarity index 100% rename from sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/analyzers/dotnet.meta diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/analyzers/dotnet/cs.meta similarity index 100% rename from sdks/csharp/packages/spacetimedb.runtime/unversioned/analyzers/dotnet/cs.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/analyzers/dotnet/cs.meta diff --git a/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta new file mode 100644 index 00000000000..eb170b45e97 --- /dev/null +++ b/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/analyzers/dotnet/cs/SpacetimeDB.Codegen.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1e346e9c545943cdb0b4a0e7f3c8dc45 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 0 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/lib.meta similarity index 100% rename from sdks/csharp/packages/spacetimedb.runtime/unversioned/lib.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/lib.meta diff --git a/sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/net8.0.meta b/sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/lib/net8.0.meta similarity index 100% rename from sdks/csharp/packages/spacetimedb.runtime/unversioned/lib/net8.0.meta rename to sdks/csharp/unity-meta-skeleton~/spacetimedb.runtime/lib/net8.0.meta diff --git a/tools/ci/src/main.rs b/tools/ci/src/main.rs index d2dbbcd5069..f53d7f6416c 100644 --- a/tools/ci/src/main.rs +++ b/tools/ci/src/main.rs @@ -39,21 +39,18 @@ fn ensure_repo_root() -> Result<()> { Ok(()) } -fn overlay_unversioned_skeleton(pkg_id: &str) -> Result<()> { +fn overlay_unity_meta_skeleton(pkg_id: &str) -> Result<()> { let pkg_root = Path::new("sdks/csharp/packages").join(pkg_id); if !pkg_root.exists() { - log::info!( - "Skipping skeleton overlay for {pkg_id}: {} does not exist", - pkg_root.display() - ); + log::info!("Skipping skeleton overlay for {pkg_id}: {pkg_root:?} does not exist"); return Ok(()); } - let unversioned = pkg_root.join("unversioned"); - if !unversioned.exists() { + let skeleton_root = Path::new("sdks/csharp/unity-meta-skeleton~").join(pkg_id); + if !skeleton_root.exists() { log::info!( "Skipping skeleton overlay for {pkg_id}: {} does not exist", - unversioned.display() + skeleton_root.display() ); return Ok(()); } @@ -69,7 +66,24 @@ fn overlay_unversioned_skeleton(pkg_id: &str) -> Result<()> { } }; - copy_overlay_dir(&unversioned, &versioned_dir) + copy_overlay_dir(&skeleton_root, &versioned_dir) +} + +fn clear_restored_package_dirs(pkg_id: &str) -> Result<()> { + let pkg_root = Path::new("sdks/csharp/packages").join(pkg_id); + if !pkg_root.exists() { + return Ok(()); + } + + for entry in fs::read_dir(&pkg_root)? { + let entry = entry?; + if !entry.file_type()?.is_dir() { + continue; + } + fs::remove_dir_all(entry.path())?; + } + + Ok(()) } fn find_latest_semver_subdir(dir: &Path) -> Result { @@ -81,9 +95,6 @@ fn find_latest_semver_subdir(dir: &Path) -> Result { } let name = entry.file_name().to_string_lossy().to_string(); - if name == "unversioned" { - continue; - } let Ok(version) = Version::parse(&name) else { continue; }; @@ -116,11 +127,25 @@ fn copy_overlay_dir(src: &Path, dst: &Path) -> Result<()> { let src_path = entry.path(); let dst_path = dst.join(entry.file_name()); if entry.file_type()?.is_dir() { - if !dst_path.exists() { - fs::create_dir_all(&dst_path)?; + if dst_path.exists() { + copy_overlay_dir(&src_path, &dst_path)?; } - copy_overlay_dir(&src_path, &dst_path)?; } else { + if let Some(file_name) = dst_path.file_name().and_then(|n| n.to_str()) { + if let Some(asset_name) = file_name.strip_suffix(".meta") { + let asset_path = dst_path + .parent() + .expect("dst_path should have a parent") + .join(asset_name); + if asset_path.exists() { + fs::copy(&src_path, &dst_path)?; + } else if dst_path.exists() { + let _ = fs::remove_file(&dst_path); + } + continue; + } + } + if let Some(parent) = dst_path.parent() { fs::create_dir_all(parent)?; } @@ -338,31 +363,47 @@ fn main() -> Result<()> { ) .run()?; - cmd!("dotnet", "pack", "-c", "Release") - .dir("sdks/csharp") - .run()?; + let repo_root = env::current_dir()?; + let bsatn_source = repo_root.join("crates/bindings-csharp/BSATN.Runtime/bin/Release"); + let runtime_source = repo_root.join("crates/bindings-csharp/Runtime/bin/Release"); + + let nuget_config_dir = tempfile::tempdir()?; + let nuget_config_path = nuget_config_dir.path().join("nuget.config"); + let nuget_config_contents = format!( + "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + bsatn_source.to_string_lossy(), + runtime_source.to_string_lossy(), + ); + fs::write(&nuget_config_path, nuget_config_contents)?; - let bsatn_source = Path::new("crates/bindings-csharp/BSATN.Runtime/bin/Release") - .canonicalize() - .unwrap_or_else(|_| PathBuf::from("crates/bindings-csharp/BSATN.Runtime/bin/Release")); - let runtime_source = Path::new("crates/bindings-csharp/Runtime/bin/Release") - .canonicalize() - .unwrap_or_else(|_| PathBuf::from("crates/bindings-csharp/Runtime/bin/Release")); - - let restore_args = vec![ - "restore".to_string(), - "SpacetimeDB.ClientSDK.csproj".to_string(), - "--source".to_string(), - bsatn_source.to_string_lossy().to_string(), - "--source".to_string(), - runtime_source.to_string_lossy().to_string(), - "--source".to_string(), - "https://api.nuget.org/v3/index.json".to_string(), - ]; - cmd("dotnet", restore_args).dir("sdks/csharp").run()?; - - overlay_unversioned_skeleton("spacetimedb.bsatn.runtime")?; - overlay_unversioned_skeleton("spacetimedb.runtime")?; + let nuget_config_path_str = nuget_config_path.to_string_lossy().to_string(); + + clear_restored_package_dirs("spacetimedb.bsatn.runtime")?; + clear_restored_package_dirs("spacetimedb.runtime")?; + + cmd!( + "dotnet", + "restore", + "SpacetimeDB.ClientSDK.csproj", + "--configfile", + &nuget_config_path_str, + ) + .dir("sdks/csharp") + .run()?; + + overlay_unity_meta_skeleton("spacetimedb.bsatn.runtime")?; + overlay_unity_meta_skeleton("spacetimedb.runtime")?; + + cmd!( + "dotnet", + "pack", + "SpacetimeDB.ClientSDK.csproj", + "-c", + "Release", + "--no-restore" + ) + .dir("sdks/csharp") + .run()?; } Some(CiCmd::Smoketests { args: smoketest_args }) => { From 5545fa9cf24e4504d086d5275c732e86bc981d5a Mon Sep 17 00:00:00 2001 From: rekhoff Date: Wed, 14 Jan 2026 14:56:41 -0800 Subject: [PATCH 3/7] Lint update --- tools/ci/src/main.rs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/tools/ci/src/main.rs b/tools/ci/src/main.rs index f53d7f6416c..4b221d85d37 100644 --- a/tools/ci/src/main.rs +++ b/tools/ci/src/main.rs @@ -106,12 +106,8 @@ fn find_latest_semver_subdir(dir: &Path) -> Result { } } - best.map(|(_, p)| p).ok_or_else(|| { - anyhow::anyhow!( - "Could not find any versioned directories under {}", - dir.display() - ) - }) + best.map(|(_, p)| p) + .ok_or_else(|| anyhow::anyhow!("Could not find any versioned directories under {}", dir.display())) } fn copy_overlay_dir(src: &Path, dst: &Path) -> Result<()> { @@ -354,14 +350,7 @@ fn main() -> Result<()> { "Release" ) .run()?; - cmd!( - "dotnet", - "pack", - "crates/bindings-csharp/Runtime", - "-c", - "Release" - ) - .run()?; + cmd!("dotnet", "pack", "crates/bindings-csharp/Runtime", "-c", "Release").run()?; let repo_root = env::current_dir()?; let bsatn_source = repo_root.join("crates/bindings-csharp/BSATN.Runtime/bin/Release"); From 67066b96f5a2a259ab4cb0b996f594624ae504b3 Mon Sep 17 00:00:00 2001 From: rekhoff Date: Wed, 14 Jan 2026 19:02:10 -0800 Subject: [PATCH 4/7] Added Unity Meta Check ignore file --- .meta-check-ignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .meta-check-ignore diff --git a/.meta-check-ignore b/.meta-check-ignore new file mode 100644 index 00000000000..f81d0d058a8 --- /dev/null +++ b/.meta-check-ignore @@ -0,0 +1 @@ +sdks/csharp/unity-meta-skeleton~ \ No newline at end of file From e1baca761c6393b51c005305afeeb7cb30bfab61 Mon Sep 17 00:00:00 2001 From: rekhoff Date: Wed, 14 Jan 2026 19:53:46 -0800 Subject: [PATCH 5/7] Moved meta-check-ignore so it is properly detected --- .meta-check-ignore | 1 - sdks/csharp/.meta-check-ignore | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 .meta-check-ignore create mode 100644 sdks/csharp/.meta-check-ignore diff --git a/.meta-check-ignore b/.meta-check-ignore deleted file mode 100644 index f81d0d058a8..00000000000 --- a/.meta-check-ignore +++ /dev/null @@ -1 +0,0 @@ -sdks/csharp/unity-meta-skeleton~ \ No newline at end of file diff --git a/sdks/csharp/.meta-check-ignore b/sdks/csharp/.meta-check-ignore new file mode 100644 index 00000000000..44b5aedf8d4 --- /dev/null +++ b/sdks/csharp/.meta-check-ignore @@ -0,0 +1,3 @@ +unity-meta-skeleton.meta +unity-meta-skeleton~ +unity-meta-skeleton~/** From c022eae0a6155b27fe38df7c0036419c400ab88a Mon Sep 17 00:00:00 2001 From: rekhoff Date: Thu, 15 Jan 2026 17:34:34 -0800 Subject: [PATCH 6/7] Updated with suggested changes --- sdks/csharp/packages/.gitignore | 4 ++ tools/ci/src/main.rs | 65 ++++++++++++++++++--------------- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/sdks/csharp/packages/.gitignore b/sdks/csharp/packages/.gitignore index 7d9dea737b9..6af724b3a55 100644 --- a/sdks/csharp/packages/.gitignore +++ b/sdks/csharp/packages/.gitignore @@ -1,11 +1,15 @@ # Ignore most of NuGet package structure, except DLLs which are required by Unity. +/*/* +!/*/*/ /*/*/* !/*/*/analyzers !/*/*/analyzers.meta +!/*/*/analyzers/** !/*/*/lib !/*/*/lib.meta +!/*/*/lib/** # Ignore XML documentation metadata from packages too. *.xml diff --git a/tools/ci/src/main.rs b/tools/ci/src/main.rs index 4b221d85d37..bafefe3f5f7 100644 --- a/tools/ci/src/main.rs +++ b/tools/ci/src/main.rs @@ -2,6 +2,7 @@ use anyhow::{bail, Result}; use clap::{CommandFactory, Parser, Subcommand}; use duct::cmd; use semver::Version; +use std::ffi::OsStr; use std::path::Path; use std::path::PathBuf; use std::{env, fs}; @@ -75,19 +76,14 @@ fn clear_restored_package_dirs(pkg_id: &str) -> Result<()> { return Ok(()); } - for entry in fs::read_dir(&pkg_root)? { - let entry = entry?; - if !entry.file_type()?.is_dir() { - continue; - } - fs::remove_dir_all(entry.path())?; - } + fs::remove_dir_all(&pkg_root)?; Ok(()) } fn find_latest_semver_subdir(dir: &Path) -> Result { - let mut best: Option<(Version, PathBuf)> = None; + let mut versioned_dirs: Vec<(Version, PathBuf)> = vec![]; + for entry in fs::read_dir(dir)? { let entry = entry?; if !entry.file_type()?.is_dir() { @@ -99,15 +95,23 @@ fn find_latest_semver_subdir(dir: &Path) -> Result { continue; }; - match best.as_ref() { - None => best = Some((version, entry.path())), - Some((best_v, _)) if version > *best_v => best = Some((version, entry.path())), - _ => {} - } + versioned_dirs.push((version, entry.path())); } - best.map(|(_, p)| p) - .ok_or_else(|| anyhow::anyhow!("Could not find any versioned directories under {}", dir.display())) + versioned_dirs.sort_by(|(a, _), (b, _)| a.cmp(b)); + + match versioned_dirs.as_slice() { + [] => Err(anyhow::anyhow!( + "Could not find any versioned directories under {}", + dir.display() + )), + [(_, only)] => Ok(only.clone()), + _ => Err(anyhow::anyhow!( + "Expected at most one restored versioned directory under {}, found {}", + dir.display(), + versioned_dirs.len() + )), + } } fn copy_overlay_dir(src: &Path, dst: &Path) -> Result<()> { @@ -127,19 +131,22 @@ fn copy_overlay_dir(src: &Path, dst: &Path) -> Result<()> { copy_overlay_dir(&src_path, &dst_path)?; } } else { - if let Some(file_name) = dst_path.file_name().and_then(|n| n.to_str()) { - if let Some(asset_name) = file_name.strip_suffix(".meta") { - let asset_path = dst_path - .parent() - .expect("dst_path should have a parent") - .join(asset_name); - if asset_path.exists() { - fs::copy(&src_path, &dst_path)?; - } else if dst_path.exists() { - let _ = fs::remove_file(&dst_path); - } - continue; + if src_path.extension() == Some(OsStr::new("meta")) { + let asset_path = dst_path + .parent() + .expect("dst_path should have a parent") + .join( + dst_path + .file_stem() + .expect(".meta file should have a file stem"), + ); + + if asset_path.exists() { + fs::copy(&src_path, &dst_path)?; + } else if dst_path.exists() { + fs::remove_file(&dst_path)?; } + continue; } if let Some(parent) = dst_path.parent() { @@ -171,8 +178,8 @@ enum CiCmd { /// Builds and packs C# DLLs and NuGet packages for local Unity workflows /// /// Packs the in-repo C# NuGet packages and restores the C# SDK to populate `sdks/csharp/packages/**`. - /// Then overlays Unity `.meta` skeleton files from an unversioned directory onto the restored versioned - /// package directory, so Unity can associate stable meta files with the most recently built package. + /// Then overlays Unity `.meta` skeleton files from `sdks/csharp/unity-meta-skeleton~/**` onto the restored + /// versioned package directory, so Unity can associate stable meta files with the most recently built package. Dlls, /// Runs smoketests /// From a4e3c154549fcf4fa4e81e1580f00bfdde81bd55 Mon Sep 17 00:00:00 2001 From: rekhoff Date: Thu, 15 Jan 2026 18:10:55 -0800 Subject: [PATCH 7/7] Removed uneeded directory check, updated lints, and Readme --- tools/ci/README.md | 2 +- tools/ci/src/main.rs | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/tools/ci/README.md b/tools/ci/README.md index 3c2a563c3e8..3e91f892390 100644 --- a/tools/ci/README.md +++ b/tools/ci/README.md @@ -74,7 +74,7 @@ Usage: wasm-bindings Builds and packs C# DLLs and NuGet packages for local Unity workflows -Packs the in-repo C# NuGet packages and restores the C# SDK to populate `sdks/csharp/packages/**`. Then overlays Unity `.meta` skeleton files from an unversioned directory onto the restored versioned package directory, so Unity can associate stable meta files with the most recently built package. +Packs the in-repo C# NuGet packages and restores the C# SDK to populate `sdks/csharp/packages/**`. Then overlays Unity `.meta` skeleton files from `sdks/csharp/unity-meta-skeleton~/**` onto the restored versioned package directory, so Unity can associate stable meta files with the most recently built package. **Usage:** ```bash diff --git a/tools/ci/src/main.rs b/tools/ci/src/main.rs index bafefe3f5f7..d7c95e0cf15 100644 --- a/tools/ci/src/main.rs +++ b/tools/ci/src/main.rs @@ -135,11 +135,7 @@ fn copy_overlay_dir(src: &Path, dst: &Path) -> Result<()> { let asset_path = dst_path .parent() .expect("dst_path should have a parent") - .join( - dst_path - .file_stem() - .expect(".meta file should have a file stem"), - ); + .join(dst_path.file_stem().expect(".meta file should have a file stem")); if asset_path.exists() { fs::copy(&src_path, &dst_path)?; @@ -149,9 +145,6 @@ fn copy_overlay_dir(src: &Path, dst: &Path) -> Result<()> { continue; } - if let Some(parent) = dst_path.parent() { - fs::create_dir_all(parent)?; - } fs::copy(&src_path, &dst_path)?; } }