145 lines
4.7 KiB
C#
145 lines
4.7 KiB
C#
![]() |
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.GetLastWriteTimeUtc(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;
|
|||
|
|
|||
|
foreach (var dir in Directory.GetDirectories(cacheRoot))
|
|||
|
{
|
|||
|
if (dir.Contains(packageName + "@"))
|
|||
|
{
|
|||
|
return dir;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|