142 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
		
		
			
		
	
	
			142 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
| 
								 | 
							
								namespace Guru.Editor
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    using System;
							 | 
						||
| 
								 | 
							
								    using UnityEditor;
							 | 
						||
| 
								 | 
							
								    using System.Diagnostics;
							 | 
						||
| 
								 | 
							
								    using System.IO;
							 | 
						||
| 
								 | 
							
								    using UnityEngine;
							 | 
						||
| 
								 | 
							
								    using Debug=UnityEngine.Debug;
							 | 
						||
| 
								 | 
							
								    using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    public class DepsOutputHelper
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        public static readonly string DepsScriptName = "deps.sh";
							 | 
						||
| 
								 | 
							
								        public static readonly string EnvScriptName = ".deps_env";
							 | 
						||
| 
								 | 
							
								        private static string _scriptFilePath = String.Empty;
							 | 
						||
| 
								 | 
							
								        public static string ScriptFilePath
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            get
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if(string.IsNullOrEmpty(_scriptFilePath))
							 | 
						||
| 
								 | 
							
								                    _scriptFilePath = GetScriptFilePath();
							 | 
						||
| 
								 | 
							
								                return _scriptFilePath;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// 获取脚本路径
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						||
| 
								 | 
							
								        private static string GetScriptFilePath()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            string sc = string.Empty;
							 | 
						||
| 
								 | 
							
								            var guids = AssetDatabase.FindAssets($"{nameof(DepsOutputHelper)} t:script");
							 | 
						||
| 
								 | 
							
								            if (guids.Length > 0)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                sc = AssetDatabase.GUIDToAssetPath(guids[0]);
							 | 
						||
| 
								 | 
							
								                var fpath = $"{Directory.GetParent(sc).FullName}/files/{DepsScriptName}";
							 | 
						||
| 
								 | 
							
								                if(File.Exists(fpath)) return fpath;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return string.Empty;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// 执行脚本
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="projPath"></param>
							 | 
						||
| 
								 | 
							
								        /// <param name="cmd"></param>
							 | 
						||
| 
								 | 
							
								        public static void CallDepsScript(string workpath, string cmd = "")
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (string.IsNullOrEmpty(cmd)) cmd = DepsScriptName;
							 | 
						||
| 
								 | 
							
								            RunShellCmd(workpath, cmd);
							 | 
						||
| 
								 | 
							
								            Debug.Log($"---- running command: {cmd} is over -----");
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // 运行命令
							 | 
						||
| 
								 | 
							
								        public static void RunShellCmd(string workpath, string cmd)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            //------ 启动命令 --------
							 | 
						||
| 
								 | 
							
								            Process p = new Process();
							 | 
						||
| 
								 | 
							
								            p.StartInfo.WorkingDirectory = workpath;
							 | 
						||
| 
								 | 
							
								            p.StartInfo.FileName = "/bin/bash";
							 | 
						||
| 
								 | 
							
								            p.StartInfo.Arguments = cmd;
							 | 
						||
| 
								 | 
							
								            p.StartInfo.UseShellExecute = false;
							 | 
						||
| 
								 | 
							
								            p.StartInfo.RedirectStandardOutput = true;
							 | 
						||
| 
								 | 
							
								            p.Start();
							 | 
						||
| 
								 | 
							
								            var log = p.StandardOutput.ReadToEnd();
							 | 
						||
| 
								 | 
							
								            p.WaitForExit();
							 | 
						||
| 
								 | 
							
								            Debug.Log(log);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // 设置ENV文件
							 | 
						||
| 
								 | 
							
								        private static void SetupEnvScript(string projPath, string depauditPath = "")
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            string buildName = $"1.0.0-00000000";
							 | 
						||
| 
								 | 
							
								            string platform = $"editor";
							 | 
						||
| 
								 | 
							
								            string dir = projPath;
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								#if UNITY_ANDROID
							 | 
						||
| 
								 | 
							
								            buildName = $"{Application.version}-{PlayerSettings.Android.bundleVersionCode}";
							 | 
						||
| 
								 | 
							
								            platform = "android";
							 | 
						||
| 
								 | 
							
								#elif UNITY_IOS
							 | 
						||
| 
								 | 
							
								            buildName = $"{Application.version}-{PlayerSettings.iOS.buildNumber}";
							 | 
						||
| 
								 | 
							
								            platform = "ios";
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								            List<string> lines = new List<string>()
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                $"export BUILD_NAME={buildName}",
							 | 
						||
| 
								 | 
							
								                $"export APP_NAME=\"{PlayerSettings.productName}\"",
							 | 
						||
| 
								 | 
							
								                $"export APP_ID={Application.identifier}",
							 | 
						||
| 
								 | 
							
								                $"export PLATFORM={platform}",
							 | 
						||
| 
								 | 
							
								                $"export DIR={dir}",
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            if (!string.IsNullOrEmpty(depauditPath))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                // 本地调试, 需要工具路径
							 | 
						||
| 
								 | 
							
								                lines.Add($"export depaudit={depauditPath}");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            File.WriteAllLines($"{projPath}/{EnvScriptName}", lines.ToArray());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// 安装和运行依赖输出器
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="buildPath"></param>
							 | 
						||
| 
								 | 
							
								        public static void InstallAndRun(string buildPath)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (string.IsNullOrEmpty(ScriptFilePath) || !File.Exists(ScriptFilePath))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Debug.LogError($"--- deps script file not found, skip output deps...");
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            string projPath = buildPath;
							 | 
						||
| 
								 | 
							
								#if UNITY_ANDROID
							 | 
						||
| 
								 | 
							
								            projPath = Directory.GetParent(buildPath).FullName;
							 | 
						||
| 
								 | 
							
								#elif UNITY_IOS
							 | 
						||
| 
								 | 
							
								            //TBD
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								            //---- Setup Env ----
							 | 
						||
| 
								 | 
							
								            SetupEnvScript(projPath);
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            //---- Setup Deps ----
							 | 
						||
| 
								 | 
							
								            string to = $"{projPath}/{DepsScriptName}";
							 | 
						||
| 
								 | 
							
								            if (File.Exists(to)) File.Delete(to);
							 | 
						||
| 
								 | 
							
								            FileUtil.CopyFileOrDirectory(ScriptFilePath, to); //拷贝脚本
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Debug.Log($"=== Output build deps data ===");
							 | 
						||
| 
								 | 
							
								                CallDepsScript(projPath);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Debug.LogError(ex);
							 | 
						||
| 
								 | 
							
								                Debug.Log($"=== Output pods deps failed: {ex}");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |