diff --git a/.gitea/workflows/unity-verify.yml b/.gitea/workflows/unity-verify.yml index c604475..21458c0 100644 --- a/.gitea/workflows/unity-verify.yml +++ b/.gitea/workflows/unity-verify.yml @@ -26,6 +26,11 @@ jobs: shell: bash run: | set -eu + machine_id_file="/root/.local/share/unity3d/Unity/.machine-id" + if test -s "$machine_id_file"; then + cat "$machine_id_file" > /etc/machine-id + echo "Unity machine identity restored" + fi unity_bin="$(command -v unity-editor || command -v unity || command -v Unity || true)" test -n "$unity_bin" "$unity_bin" \ diff --git a/Editor/ShrinkSdkInstallerWindow.cs b/Editor/ShrinkSdkInstallerWindow.cs index d18c38e..00f0305 100644 --- a/Editor/ShrinkSdkInstallerWindow.cs +++ b/Editor/ShrinkSdkInstallerWindow.cs @@ -12,9 +12,7 @@ namespace ShrinkSDK.Installer { internal sealed class ShrinkSdkInstallerWindow : EditorWindow { - private AddRequest? _addRequest; private ListRequest? _listRequest; - private ShrinkSdkPackageEntry? _pendingInstall; private int _selectedPackageIndex; private string _status = "Ready"; private MessageType _statusType = MessageType.Info; @@ -69,26 +67,10 @@ namespace ShrinkSDK.Installer EditorGUILayout.HelpBox(_status, _statusType); } - private bool IsBusy => _addRequest != null || _listRequest != null; + private bool IsBusy => _listRequest != null; private void Update() { - if (_addRequest != null && _addRequest.IsCompleted) - { - var request = _addRequest; - _addRequest = null; - if (request.Status == StatusCode.Success) - { - SetStatus("Installed " + request.Result.name + " " + request.Result.version, MessageType.Info); - } - else - { - SetStatus("Package install failed: " + request.Error.message, MessageType.Error); - } - - _pendingInstall = null; - } - if (_listRequest != null && _listRequest.IsCompleted) { var request = _listRequest; @@ -110,7 +92,6 @@ namespace ShrinkSDK.Installer try { ShrinkSdkManifestStore.EnsureShrinkSdkRegistry(); - _pendingInstall = null; Client.Resolve(); SetStatus("Registry configuration written. Unity is resolving packages.", MessageType.Info); } @@ -124,11 +105,11 @@ namespace ShrinkSDK.Installer { try { - ShrinkSdkManifestStore.EnsureShrinkSdkRegistry(); + ShrinkSdkManifestStore.EnsurePackageInstallation(entry); Client.Resolve(); - _pendingInstall = entry; - _addRequest = Client.Add(entry.PackageSpecifier); - SetStatus("Installing " + entry.PackageSpecifier, MessageType.Info); + SetStatus( + "Pinned " + entry.PackageName + " " + entry.Version + " in Packages/manifest.json. Unity is resolving packages.", + MessageType.Info); } catch (Exception exception) { diff --git a/Editor/ShrinkSdkManifestStore.cs b/Editor/ShrinkSdkManifestStore.cs index 5b4e5da..a1e123a 100644 --- a/Editor/ShrinkSdkManifestStore.cs +++ b/Editor/ShrinkSdkManifestStore.cs @@ -27,6 +27,28 @@ namespace ShrinkSDK.Installer internal static void EnsureShrinkSdkRegistry() { var manifest = ReadManifest(); + EnsureShrinkSdkRegistry(manifest); + AtomicWrite(manifest.ToString(Formatting.Indented) + Environment.NewLine); + } + + internal static void EnsurePackageInstallation(ShrinkSdkPackageEntry package) + { + var manifest = ReadManifest(); + EnsureShrinkSdkRegistry(manifest); + EnsurePinnedDependency(manifest, package.PackageName, package.Version); + if (package.RequiresUniTask) + { + EnsurePinnedDependency( + manifest, + ShrinkSdkPackageCatalog.UniTaskPackageName, + ShrinkSdkPackageCatalog.UniTaskGitUrl); + } + + AtomicWrite(manifest.ToString(Formatting.Indented) + Environment.NewLine); + } + + private static void EnsureShrinkSdkRegistry(JObject manifest) + { var registries = manifest["scopedRegistries"] as JArray; if (registries == null) { @@ -71,8 +93,26 @@ namespace ShrinkSDK.Installer registry["scopes"] = scopes; } + } - AtomicWrite(manifest.ToString(Formatting.Indented) + Environment.NewLine); + private static void EnsurePinnedDependency(JObject manifest, string packageName, string version) + { + var dependencies = manifest["dependencies"] as JObject; + if (dependencies == null) + { + dependencies = new JObject(); + manifest["dependencies"] = dependencies; + } + + var existing = dependencies[packageName]; + if (existing != null && !string.Equals(existing.Value(), version, StringComparison.Ordinal)) + { + throw new InvalidOperationException( + "Packages/manifest.json already pins " + packageName + " to " + existing.Value() + + ". ShrinkSDK requires the fixed version " + version + "."); + } + + dependencies[packageName] = version; } private static JObject ReadManifest() diff --git a/Editor/ShrinkSdkPackageCatalog.cs b/Editor/ShrinkSdkPackageCatalog.cs index de5592a..b5149c7 100644 --- a/Editor/ShrinkSdkPackageCatalog.cs +++ b/Editor/ShrinkSdkPackageCatalog.cs @@ -7,17 +7,18 @@ namespace ShrinkSDK.Installer { internal sealed class ShrinkSdkPackageEntry { - public ShrinkSdkPackageEntry(string displayName, string packageName, string version) + public ShrinkSdkPackageEntry(string displayName, string packageName, string version, bool requiresUniTask = false) { DisplayName = displayName; PackageName = packageName; Version = version; + RequiresUniTask = requiresUniTask; } public string DisplayName { get; } public string PackageName { get; } public string Version { get; } - public string PackageSpecifier => PackageName + "@" + Version; + public bool RequiresUniTask { get; } } internal static class ShrinkSdkPackageCatalog @@ -25,32 +26,35 @@ namespace ShrinkSDK.Installer internal const string RegistryName = "ShrinkSDK"; internal const string RegistryUrl = "https://git.crash.work/api/packages/ShrinkSDK/npm/"; internal const string RegistryScope = "com.cneicy"; + internal const string UniTaskPackageName = "com.cysharp.unitask"; + internal const string UniTaskGitUrl = "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask#7c0f199fe0d3fc528024488ccd671e6c7b27745b"; internal static readonly ShrinkSdkPackageEntry StarterBasic = new( "ShrinkApp Starter Basic", "com.cneicy.shrink-app-starter-basic", - "0.1.0"); + "0.1.0", + requiresUniTask: true); internal static readonly IReadOnlyList Packages = new[] { - new ShrinkSdkPackageEntry("ShrinkApp Core", "com.cneicy.shrink-app-core", "0.1.1"), + new ShrinkSdkPackageEntry("ShrinkApp Core", "com.cneicy.shrink-app-core", "0.1.1", requiresUniTask: true), StarterBasic, - new ShrinkSdkPackageEntry("ShrinkCommand", "com.cneicy.shrink-command", "0.2.0"), - new ShrinkSdkPackageEntry("ShrinkCommand Integration App", "com.cneicy.shrink-command-integration-app", "0.1.0"), - new ShrinkSdkPackageEntry("ShrinkCommand Integration EventBus", "com.cneicy.shrink-command-integration-eventbus", "0.1.1"), - new ShrinkSdkPackageEntry("ShrinkCommand Integration Network", "com.cneicy.shrink-command-integration-network", "0.1.0"), - new ShrinkSdkPackageEntry("ShrinkContext App Adapter", "com.cneicy.shrink-context-app-adapter", "0.1.0"), - new ShrinkSdkPackageEntry("ShrinkContext Core", "com.cneicy.shrink-context-core", "0.1.0"), - new ShrinkSdkPackageEntry("ShrinkContext EventBus Adapter", "com.cneicy.shrink-context-eventbus-adapter", "0.1.0"), - new ShrinkSdkPackageEntry("ShrinkDataSaver", "com.cneicy.shrink-datasaver", "2.2.0"), - new ShrinkSdkPackageEntry("ShrinkDataSaver Integration App", "com.cneicy.shrink-datasaver-integration-app", "0.1.0"), - new ShrinkSdkPackageEntry("ShrinkDataSaver Integration EventBus", "com.cneicy.shrink-datasaver-integration-eventbus", "2.1.0"), - new ShrinkSdkPackageEntry("ShrinkEventBus", "com.cneicy.shrink-eventbus", "2.0.0"), - new ShrinkSdkPackageEntry("ShrinkEventBus Entities", "com.cneicy.shrink-eventbus-entities", "0.1.0"), - new ShrinkSdkPackageEntry("ShrinkModFramework", "com.cneicy.shrink-mod-framework", "0.2.1"), - new ShrinkSdkPackageEntry("ShrinkNetwork", "com.cneicy.shrink-network", "0.2.0"), - new ShrinkSdkPackageEntry("ShrinkNetwork Integration App", "com.cneicy.shrink-network-integration-app", "0.1.0"), - new ShrinkSdkPackageEntry("ShrinkNetwork Integration EventBus", "com.cneicy.shrink-network-integration-eventbus", "0.1.1"), + new ShrinkSdkPackageEntry("ShrinkCommand", "com.cneicy.shrink-command", "0.2.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkCommand Integration App", "com.cneicy.shrink-command-integration-app", "0.1.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkCommand Integration EventBus", "com.cneicy.shrink-command-integration-eventbus", "0.1.1", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkCommand Integration Network", "com.cneicy.shrink-command-integration-network", "0.1.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkContext App Adapter", "com.cneicy.shrink-context-app-adapter", "0.1.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkContext Core", "com.cneicy.shrink-context-core", "0.1.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkContext EventBus Adapter", "com.cneicy.shrink-context-eventbus-adapter", "0.1.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkDataSaver", "com.cneicy.shrink-datasaver", "2.2.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkDataSaver Integration App", "com.cneicy.shrink-datasaver-integration-app", "0.1.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkDataSaver Integration EventBus", "com.cneicy.shrink-datasaver-integration-eventbus", "2.1.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkEventBus", "com.cneicy.shrink-eventbus", "2.0.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkEventBus Entities", "com.cneicy.shrink-eventbus-entities", "0.1.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkModFramework", "com.cneicy.shrink-mod-framework", "0.2.1", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkNetwork", "com.cneicy.shrink-network", "0.2.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkNetwork Integration App", "com.cneicy.shrink-network-integration-app", "0.1.0", requiresUniTask: true), + new ShrinkSdkPackageEntry("ShrinkNetwork Integration EventBus", "com.cneicy.shrink-network-integration-eventbus", "0.1.1", requiresUniTask: true), new ShrinkSdkPackageEntry("ShrinkShared CodeGen", "com.cneicy.shrink-shared-codegen", "0.1.0"), new ShrinkSdkPackageEntry("ShrinkTutorial", "com.cneicy.shrink-tutorial", "0.1.0") }; diff --git a/README.md b/README.md index 08b0c0c..f11a5a0 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,12 @@ `com.cneicy.shrink-installer` is the Git URL bootstrap package for ShrinkSDK. -Install the package from an immutable tag, then open `ShrinkSDK/Packages` in the Unity editor. The window merges the public ShrinkSDK scoped registry without replacing other registries and installs only catalogued package versions. +Install the package from an immutable tag, then open `ShrinkSDK/Packages` in the Unity editor. The window merges the public ShrinkSDK scoped registry without replacing other registries and writes only catalogue-pinned dependencies to `Packages/manifest.json`. Packages which require UniTask also receive its fixed Git revision. The installer does not copy templates into `Assets`, does not store credentials, and does not add an unpinned package version. ## Bootstrap URL ```text -https://git.crash.work/ShrinkSDK/Installer.git#v0.1.2 +https://git.crash.work/ShrinkSDK/Installer.git#v0.1.3 ``` diff --git a/package.json b/package.json index 4896706..7bc5409 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.cneicy.shrink-installer", - "version": "0.1.2", + "version": "0.1.3", "displayName": "ShrinkSDK Installer", "description": "ShrinkSDK registry bootstrapper and fixed-version package installer.", "unity": "2022.3",