using HybridCLR.Editor.Meta; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEditor; using UnityEditor.Build; using UnityEngine; namespace HybridCLR.Editor.BuildProcessors { /// /// 将热更新dll从Build过程中过滤,防止打包到主工程中 /// internal class FilterHotFixAssemblies : IFilterBuildAssemblies { public int callbackOrder => 0; public string[] OnFilterAssemblies(BuildOptions buildOptions, string[] assemblies) { if (!SettingsUtil.Enable) { Debug.Log($"[FilterHotFixAssemblies] disabled"); return assemblies; } List allHotUpdateDllNames = SettingsUtil.HotUpdateAssemblyNamesExcludePreserved; // 检查是否重复填写 var hotUpdateDllSet = new HashSet(); foreach(var hotUpdateDll in allHotUpdateDllNames) { if (string.IsNullOrWhiteSpace(hotUpdateDll)) { throw new BuildFailedException($"hot update assembly name cann't be empty"); } if (!hotUpdateDllSet.Add(hotUpdateDll)) { throw new BuildFailedException($"hot update assembly:{hotUpdateDll} is duplicated"); } } var assResolver = MetaUtil.CreateHotUpdateAssemblyResolver(EditorUserBuildSettings.activeBuildTarget, allHotUpdateDllNames); // 检查是否填写了正确的dll名称 foreach (var hotUpdateDllName in allHotUpdateDllNames) { if (assemblies.Select(Path.GetFileNameWithoutExtension).All(ass => ass != hotUpdateDllName) && string.IsNullOrEmpty(assResolver.ResolveAssembly(hotUpdateDllName, false))) { throw new BuildFailedException($"hot update assembly:{hotUpdateDllName} doesn't exist"); } } // 将热更dll从打包列表中移除 return assemblies.Where(ass => { string assName = Path.GetFileNameWithoutExtension(ass); bool reserved = allHotUpdateDllNames.All(dll => !assName.Equals(dll, StringComparison.Ordinal)); if (!reserved) { Debug.Log($"[FilterHotFixAssemblies] filter assembly:{assName}"); } return reserved; }).ToArray(); } } }