miduo_client/Assets/Scripts/Editor/GameEditor/FrameTool/HotFixWindow.cs

549 lines
21 KiB
C#
Raw Normal View History

2021-05-31 11:24:20 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Linq;
using GameEditor.Core;
using GameEditor.GameEditor.PlayerBuilder;
using GameEditor.Util;
using GameLogic;
using System.Diagnostics;
using ResUpdate;
using System.Threading;
using System.Net;
using System;
2021-05-31 11:24:20 +08:00
namespace GameEditor.FrameTool
{
2021-05-31 11:24:20 +08:00
public static class HotFixTool
{
//重新下载外部.unity3d文件
public static void RegetExternalFile(string resUrl, string outPath, string fileName)
2021-05-31 11:24:20 +08:00
{
//获取下载文件链接
string url = resUrl + "/" + fileName;
string dlPath = outPath + "/" + fileName;
2021-05-31 11:24:20 +08:00
// 文件夹没有就创建
if (!Directory.Exists(outPath))
{
Directory.CreateDirectory(outPath);
}
//获取文件存放路径
if (File.Exists(dlPath))
{
File.Delete(dlPath);
}
// 设置参数
UnityEngine.Debug.Log(url);
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
//创建本地文件写入流
Stream stream = new FileStream(dlPath, FileMode.Create, FileAccess.Write);
byte[] bArr = new byte[1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
stream.Close();
responseStream.Close();
}
//遍历内部unity3d数据
public static List<ResourceFile> GetFilesList(string filesPath)
{
UnityEngine.AssetBundle bundle = UnityEngine.AssetBundle.LoadFromFile(filesPath + UpdateConfigs.FILES);
ResourceFiles files = bundle.LoadAsset<ResourceFiles>("game");
bundle.Unload(true);
return files.files;
}
// 获取差异文件list
public static List<ResourceFile> GetDiffList(List<ResourceFile> inDataList, List<ResourceFile> exDataList)
{
List<ResourceFile> diffList = new List<ResourceFile>();
Dictionary<string, ResourceFile> exDataDic = new Dictionary<string, ResourceFile>();
for (int i = 0; i < exDataList.Count; i++)
{
if (!exDataDic.ContainsKey(exDataList[i].fileName))
{
exDataDic.Add(exDataList[i].fileName, exDataList[i]);
}
else
{
exDataDic[exDataList[i].fileName] = exDataList[i];
}
}
for (int i = 0; i < inDataList.Count; i++)
{
if (!exDataDic.ContainsKey(inDataList[i].fileName))
{
diffList.Add(inDataList[i]);
}
else
{
if (!inDataList[i].crc.Equals(exDataDic[inDataList[i].fileName].crc))
{
diffList.Add(inDataList[i]);
}
}
}
return diffList;
}
// 计算大小
public static decimal GetDiffSize(List<ResourceFile> diffList)
{
decimal size = 0;
foreach (ResourceFile rf in diffList)
2021-05-31 11:24:20 +08:00
{
size += rf.size;
}
return size / 1048576;
}
}
class HotFixConfig
{
public string desc;
public string dir_name;
public bool isCalSize = false;
public bool isChoose = false;
public List<HotFixSetting> hotFixSettings;
public string project_files_path;
public string local_files_path;
2021-05-31 11:24:20 +08:00
public decimal project_local_size = 0;
public List<ResourceFile> project_local_list;
public HotFixConfig(string _dir_name)
{
desc = _dir_name;
dir_name = _dir_name;
hotFixSettings = new List<HotFixSetting>();
//
isCalSize = false;
}
// 添加配置文件夹
public void AddSetting(string _desc, string _dir_name, string _dir_cdn_setting)
{
hotFixSettings.Add(new HotFixSetting(_desc, _dir_name, _dir_cdn_setting));
}
// 计算本地到工程的大小
public void CalHotFixSize()
{
if (HotfixWindow._HotFixProjectPath.Equals(""))
{
UnityEngine.Debug.LogError("热更工程路径为空!");
return;
}
2021-05-31 11:24:20 +08:00
// 工程中的位置
project_files_path = Application.dataPath + "/../BuildABs/" + AppConst.PlatformPath + "/";
2021-05-31 11:24:20 +08:00
// GIT位置
local_files_path = HotfixWindow._HotFixProjectPath + "/Root/" + dir_name + "/" + AppConst.PlatformPath + "/";
2021-05-31 11:24:20 +08:00
// 计算差异文件
project_local_list = HotFixTool.GetDiffList(HotFixTool.GetFilesList(project_files_path), HotFixTool.GetFilesList(local_files_path));
// 计算大小
project_local_size = HotFixTool.GetDiffSize(project_local_list);
//
isCalSize = true;
}
}
class HotFixSetting
{
public string desc; // 设置描述
public string dir_name; // 热更分支文件夹
public string dir_cdn_setting; // cdn设置文件夹
public string path_cdn_setting;// cdn设置文件夹全路径
public bool isCalSize = false; // 判断是否计算过大小了
public bool isChoose = false; // 是否被选中
2021-05-31 11:24:20 +08:00
public decimal local_cdn_size = 0; // git与cdn比较 热更文件的文件大小
public decimal project_cdn_size = 0; // 工程与cdn比较 热更文件的文件大小
public List<ResourceFile> local_cdn_list; // git与cdn比较 热更文件列表
public List<ResourceFile> project_cdn_list; // 工程与cdn比较 热更文件列表
public VersionTxt local_version;
public VersionTxt cdn_version;
2021-05-31 11:24:20 +08:00
public HotFixSetting(string _desc, string _dir_name, string _dir_cdn_setting)
{
desc = _desc;
dir_name = _dir_name;
dir_cdn_setting = _dir_cdn_setting;
path_cdn_setting = HotfixWindow._HotFixProjectPath + "/Root/" + dir_name + "/" + dir_cdn_setting + "/";
isCalSize = false;
}
public void CalHotFixSize()
{
if (HotfixWindow._HotFixProjectPath.Equals(""))
{
2021-05-31 11:24:20 +08:00
UnityEngine.Debug.LogError("热更工程路径为空!");
return;
}
// cdn上files文件保存的位置
string cdn_files_path = path_cdn_setting + "__Download/";
// 工程中的位置
string project_files_path = Application.dataPath + "/../BuildABs/" + AppConst.PlatformPath + "/";
2021-05-31 11:24:20 +08:00
// GIT位置
string local_files_path = HotfixWindow._HotFixProjectPath + "/Root/" + dir_name + "/" + AppConst.PlatformPath + "/";
2021-05-31 11:24:20 +08:00
// 读取version文件
string json = File.ReadAllText(path_cdn_setting + AppConst.GameVersionFile);
local_version = JsonUtility.FromJson<VersionTxt>(json);
// 下载cdn上的files文件
HotFixTool.RegetExternalFile(local_version.resUrl + AppConst.PlatformPath, cdn_files_path, "files.unity3d");
// 读取version文件
HotFixTool.RegetExternalFile(local_version.resUrl + AppConst.PlatformPath, cdn_files_path, AppConst.GameVersionFile);
cdn_version = JsonUtility.FromJson<VersionTxt>(File.ReadAllText(cdn_files_path + AppConst.GameVersionFile));
2021-05-31 11:24:20 +08:00
// 计算差异文件
local_cdn_list = HotFixTool.GetDiffList(HotFixTool.GetFilesList(local_files_path), HotFixTool.GetFilesList(cdn_files_path));
project_cdn_list = HotFixTool.GetDiffList(HotFixTool.GetFilesList(project_files_path), HotFixTool.GetFilesList(cdn_files_path));
// 计算大小
local_cdn_size = HotFixTool.GetDiffSize(local_cdn_list);
project_cdn_size = HotFixTool.GetDiffSize(project_cdn_list);
//
isCalSize = true;
}
}
//看热更大小
public class HotfixWindow : EditorWindow
{
static string[][] _SettingConfig = new string[][]{
new string[]{ "C轮测试v2", "mht_china/local", "cdn_v2", "china/dev-c" },
new string[]{ "C轮测试v3", "mht_china/local", "cdn_v3", "china/dev-c" }
};
static Dictionary<string, HotFixConfig> _HotFixConfigDic = new Dictionary<string, HotFixConfig>();
static string benchName = "";
public static string _HotFixProjectPath;
static string _Password = "tcx123";
static bool _IsUpdateCDN = false;
static bool _IsGitPull = false;
2021-05-31 11:24:20 +08:00
[MenuItem("Build/Hotfix")]
static void Init()
{
benchName = GitUtil.GetCurBenchName();
UnityEngine.Debug.Log("当前分支:" + benchName);
_HotFixProjectPath = EditorPrefs.GetString("_HotFixProjectPath", "");
if (!_IsGitPull && _HotFixProjectPath != "")
{
ABGitPull();
}
2021-05-31 11:24:20 +08:00
InitData();
InitStyle();
// Get existing open window or if none, make a new one:
HotfixWindow window = (HotfixWindow)EditorWindow.GetWindow(typeof(HotfixWindow));
window.titleContent = new GUIContent("热更新");
2021-05-31 11:24:20 +08:00
window.Show();
}
static void InitData()
{
_IsGitPull = false;
2021-05-31 11:24:20 +08:00
_HotFixConfigDic.Clear();
foreach (string[] sc in _SettingConfig)
{
string desc = sc[0];
string folder = sc[1];
string setting = sc[2];
string bench = sc[3];
if (bench.Equals(benchName))
{
HotFixConfig hfc;
_HotFixConfigDic.TryGetValue(folder, out hfc);
if (hfc == null)
{
hfc = new HotFixConfig(folder);
_HotFixConfigDic.Add(folder, hfc);
}
hfc.AddSetting(desc, folder, setting);
}
}
}
// 自定义style
static GUIStyle F_B_30 = new GUIStyle();
static GUIStyle F_25 = new GUIStyle();
static GUIStyle L_PL_50 = new GUIStyle();
2021-05-31 11:24:20 +08:00
static void InitStyle()
{
F_B_30.fontSize = 30;
F_B_30.fontStyle = FontStyle.Bold;
2021-05-31 11:24:20 +08:00
F_25.fontSize = 25;
L_PL_50.padding.left = 50;
2021-05-31 11:24:20 +08:00
}
void OnGUI()
{
if (AppConst.PlatformPath != "Android" && AppConst.PlatformPath != "IOS")
{
EditorGUILayout.LabelField("<color=red>请先切换到Android或者IOS平台</color>", F_B_30);
return;
}
_Password = EditorGUILayout.PasswordField("请输入密码:", _Password);
if (_Password != "tcx123")
{
return;
}
2021-05-31 11:24:20 +08:00
EditorGUILayout.BeginVertical();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.LabelField("当前工程GIT分支" + benchName);
2021-05-31 11:24:20 +08:00
EditorGUILayout.BeginHorizontal();
_HotFixProjectPath = EditorGUILayout.TextField("热更GIT工程地址", _HotFixProjectPath);
if (GUILayout.Button("Browse", GUILayout.ExpandWidth(false)))
{
_HotFixProjectPath = EditorUtility.OpenFolderPanel("Resource path", _HotFixProjectPath, _HotFixProjectPath);
EditorPrefs.SetString("_HotFixProjectPath", _HotFixProjectPath);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.Space();
_IsUpdateCDN = EditorGUILayout.ToggleLeft("是否显示CDN更新选项", _IsUpdateCDN);
2021-05-31 11:24:20 +08:00
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.LabelField("请选择要更新的GIT路径");
foreach (string k in _HotFixConfigDic.Keys)// i = 0; i < _CurConfig.Length; i++)
2021-05-31 11:24:20 +08:00
{
HotFixConfig _CurConfig = _HotFixConfigDic[k];
_CurConfig.isChoose = EditorGUILayout.ToggleLeft("<color=yellow>" + _CurConfig.desc + "</color>", _CurConfig.isChoose, F_B_30, GUILayout.Height(40));
2021-05-31 11:24:20 +08:00
if (_CurConfig.isChoose)
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("工程到Git" + _CurConfig.project_local_size.ToString("0.00") + "M");
2021-05-31 11:24:20 +08:00
if (!_CurConfig.isCalSize)
{
_CurConfig.CalHotFixSize();
}
if (GUILayout.Button("刷新", GUILayout.Height(20f)))
{
_CurConfig.CalHotFixSize();
}
if (GUILayout.Button("更新到GIT", GUILayout.Height(20f)))
2021-05-31 11:24:20 +08:00
{
HotfixConfimWindow.Create("是否要将工程热更文件同步到GIT " + _CurConfig.desc, _CurConfig.project_local_list, () =>
2021-05-31 11:24:20 +08:00
{
UpdateUnity3dToGit(_CurConfig);
});
}
EditorGUILayout.EndHorizontal();
if (_IsUpdateCDN)
{
foreach (HotFixSetting hfs in _CurConfig.hotFixSettings)// i = 0; i < _CurConfig.Length; i++)
{
EditorGUILayout.BeginVertical(L_PL_50);
hfs.isChoose = EditorGUILayout.ToggleLeft("<color=green>" + hfs.desc + "</color>", hfs.isChoose, F_25, GUILayout.Height(30));
if (hfs.isChoose)
2021-05-31 11:24:20 +08:00
{
// 自动计算一遍大小
if (!hfs.isCalSize)
{
hfs.CalHotFixSize();
}
EditorGUILayout.BeginHorizontal();
EditorGUILayout.BeginVertical();
EditorGUILayout.LabelField("CDN当前版本号" + (hfs.cdn_version == null ? "" : hfs.cdn_version.version));
EditorGUILayout.LabelField("GIT到CDN" + hfs.local_cdn_size.ToString("0.00") + "M");
//EditorGUILayout.LabelField("工程到CDN" + hfs.project_cdn_size.ToString("0.00") + "M");
EditorGUILayout.EndVertical();
if (GUILayout.Button("编辑Setting", GUILayout.Height(30f), GUILayout.Width(100f)))
{
string tpath = hfs.path_cdn_setting + "setting.txt";
ProcessUtil.OpenText(tpath);
}
if (GUILayout.Button("编辑Config", GUILayout.Height(30f), GUILayout.Width(100f)))
{
string tpath = hfs.path_cdn_setting + AppConst.GameConfigFile;
ProcessUtil.OpenText(tpath);
}
if (GUILayout.Button("编辑Version", GUILayout.Height(30f), GUILayout.Width(100f)))
{
string tpath = hfs.path_cdn_setting + AppConst.GameVersionFile;
ProcessUtil.OpenText(tpath);
}
if (GUILayout.Button("刷新", GUILayout.Height(30f), GUILayout.Width(100f)))
{
hfs.CalHotFixSize();
}
EditorGUILayout.EndHorizontal();
2021-05-31 11:24:20 +08:00
}
EditorGUILayout.EndVertical();
2021-05-31 11:24:20 +08:00
}
2021-05-31 11:24:20 +08:00
}
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
2021-05-31 11:24:20 +08:00
}
}
EditorGUILayout.EndVertical();
}
// 拉取git工程
private static void ABGitPull()
{
if(!_IsGitPull)
{
ProcessUtil.ProcessCommand(_HotFixProjectPath, "git pull", true);
_IsGitPull = true;
}
}
//同步工程中的热更文件到git
private static void UpdateUnity3dToGit(HotFixConfig hfc)
{
string updateName;
List<ResourceFile> updateList;
List<string> log = new List<string>();
updateList = hfc.project_local_list;
if (updateList.Count <= 0)
{
UnityEngine.Debug.Log("未检测到文件改动");
return;
}
// 初始化数据
updateName = benchName + "_" + GitUtil.GetCurCommitHash() + "_"+DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss");
EditorUtility.DisplayProgressBar("正在获取数据:", updateName, 0f);
log.Add("热更文件版本:" + updateName);
log.Add("热更文件的工程对应的提交信息:" );
string[] infos = GitUtil.GetCurCommitSimpleInfo();
foreach(string info in infos)
{
log.Add(info);
}
log.Add("热更大小:"+hfc.project_local_size);
// copy unity3d
log.Add("热更文件:");
string fromPath = hfc.project_files_path;
string toPath = hfc.local_files_path;
int i = 0;
foreach (ResourceFile rf in updateList)
{
EditorUtility.DisplayProgressBar("正在复制文件:" + toPath, rf.fileName, (float)i/updateList.Count);
File.Copy(fromPath + rf.fileName, toPath + rf.fileName, true);
log.Add(rf.fileName);
}
// write logf
string logName = updateName.Replace("/", "$");
EditorUtility.DisplayProgressBar("正在生成Log文件", logName, 1f);
WriteLog(toPath+"/_log", logName, log.ToArray());
// git commit
string commitName = hfc.dir_name + "热更文件更新:" + updateName;
EditorUtility.DisplayProgressBar("正在提交到GIT", commitName, 1f);
ProcessUtil.ProcessCommand(toPath, "git add .");
ProcessUtil.ProcessCommand(toPath, "git commit -m " + commitName);
EditorUtility.ClearProgressBar();
}
private static void WriteLog(string path, string name, string[] contents)
{
UnityEngine.Debug.Log("创建log文件");
UnityEngine.Debug.Log(path);
UnityEngine.Debug.Log(name);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string filePath = Path.Combine(path, name) + ".log";
//if (!File.Exists(filePath))
//{
// File.Create(filePath).Close();
//}
File.WriteAllLines(filePath, contents);
}
2021-05-31 11:24:20 +08:00
}
//看热更大小
public class HotfixConfimWindow : EditorWindow
{
string content;
List<ResourceFile> diffList;
Action a;
Vector2 _scp = Vector2.zero;
public static void Create(string content, List<ResourceFile> diffList, Action a)
{
HotfixConfimWindow window = (HotfixConfimWindow)EditorWindow.GetWindow(typeof(HotfixConfimWindow), true, "提示", true);
window.SetContent(content, diffList, a);
window.ShowAuxWindow();
}
public void SetContent(string _content, List<ResourceFile> _diffList, Action _a)
{
content = _content;
diffList = _diffList;
a = _a;
}
private void OnGUI()
{
EditorGUILayout.BeginVertical();
EditorGUILayout.LabelField(content);
_scp = EditorGUILayout.BeginScrollView(_scp);
foreach(ResourceFile rf in diffList)
{
EditorGUILayout.LabelField(rf.fileName);
}
EditorGUILayout.EndScrollView();
EditorGUILayout.LabelField("更新大小:" + HotFixTool.GetDiffSize(diffList).ToString("0.00") + "M");
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("取消")){
Close();
}
if (GUILayout.Button("确定"))
{
if (a!= null) a();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
}
}