com.alicizax.unity.packagem.../Editor/PackageManager/PackageManagerCheckTool.cs
陈思海 85aa78bf12 m
2025-02-20 12:48:58 +08:00

137 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Newtonsoft.Json;
namespace AlicizaX.PackageManager.Editor
{
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.PackageManager;
using UnityEditor.PackageManager.Requests;
using Newtonsoft.Json.Linq;
public static class PackageManagerCheckTool
{
private static Dictionary<string, string> cachedManifestDependencies;
private static ListRequest listRequest;
[Serializable]
public class ManifestDependencies
{
public Dictionary<string, string> dependencies = new Dictionary<string, string>();
}
public static void ValidatePackageStates(List<RepositoryPackageData> packages)
{
var manifest = ReadManifestFile();
var installedPackages = GetInstalledPackagesFromPM();
foreach (var package in packages)
{
// 检查是否在manifest中存在
if (manifest.dependencies.TryGetValue(package.name, out var gitUrl))
{
// 检查PackageCache目录
var cachePath = FindInPackageCache(package.name);
if (!string.IsNullOrEmpty(cachePath))
{
var localTime = Directory.GetLastWriteTime(cachePath);
if (DateTime.TryParse(package.updatedAt, out var remoteTime))
{
package.PackageState = remoteTime > localTime ? PackageState.Update : PackageState.Install;
}
else
{
package.PackageState = PackageState.Install;
}
}
else
{
package.PackageState = PackageState.Install;
}
}
else
{
// 检查Packages目录
var packagePath = Path.GetFullPath($"Packages/{package.name}");
package.PackageState = Directory.Exists(packagePath) ? PackageState.InstallLocal : PackageState.UnInstall;
}
}
}
private static string FindInPackageCache(string packageName)
{
var cacheRoot = Path.GetFullPath("Library/PackageCache");
if (!Directory.Exists(cacheRoot)) return null;
return Path.Combine(cacheRoot, packageName);
}
private static ManifestDependencies ReadManifestFile()
{
var manifestPath = Path.GetFullPath("Packages/manifest.json");
var json = File.ReadAllText(manifestPath);
return JsonConvert.DeserializeObject<ManifestDependencies>(json);
}
public static void InstallPackage(string gitUrl)
{
Client.Add(gitUrl);
}
public static void UpdatePackage(string packageName)
{
Client.Add($"git:{packageName}");
}
public static void UninstallPackage(string packageName)
{
Client.Remove(packageName);
}
private static List<string> GetInstalledPackagesFromPM()
{
var packages = new List<string>();
listRequest = Client.List();
EditorApplication.CallbackFunction checkProgress = null;
checkProgress = () =>
{
if (listRequest.IsCompleted)
{
if (listRequest.Status == StatusCode.Success)
{
foreach (var package in listRequest.Result)
{
packages.Add(package.name);
}
}
EditorApplication.update -= checkProgress;
}
};
EditorApplication.update += checkProgress;
return packages;
}
// 辅助方法从Git URL提取包名
public static string ExtractPackageNameFromUrl(string gitUrl)
{
try
{
Uri uri = new Uri(gitUrl);
string path = uri.AbsolutePath;
int startIndex = path.LastIndexOf('/') + 1;
string name = path.Substring(startIndex);
return name.Replace(".git", "").Replace("_", ".").ToLower();
}
catch
{
return Path.GetFileNameWithoutExtension(gitUrl);
}
}
}
}