diff --git a/BuildCLI/build_android.bat b/BuildCLI/build_android.bat new file mode 100644 index 00000000..dde33c01 --- /dev/null +++ b/BuildCLI/build_android.bat @@ -0,0 +1,9 @@ +cd /d %~dp0 + +call path_define.bat + +%UNITYEDITOR_PATH%/Unity.exe %WORKSPACE% -logFile %BUILD_LOGFILE% -executeMethod TEngine.ReleaseTools.AutomationBuildAndroid -quit -batchmode -CustomArgs:Language=en_US; %WORKSPACE% + +@REM for /f "delims=[" %%i in (%BUILD_LOGFILE%) do echo %%i + +pause \ No newline at end of file diff --git a/BuildCLI/path_define.bat b/BuildCLI/path_define.bat new file mode 100644 index 00000000..4e20de33 --- /dev/null +++ b/BuildCLI/path_define.bat @@ -0,0 +1,6 @@ +cd /d %~dp0 + +set WORKSPACE=G:/github/TEngine/UnityProject +set UNITYEDITOR_PATH=G:/UnityEditor/2021.3.20f1c1/Editor +set BUILD_DLL_LOGFILE=./build_dll.log +set BUILD_LOGFILE=./build.log diff --git a/UnityProject/Assets/TEngine/Editor/HybridCLR/BuildAssetsCommand.cs b/UnityProject/Assets/TEngine/Editor/HybridCLR/BuildDLLCommand.cs similarity index 94% rename from UnityProject/Assets/TEngine/Editor/HybridCLR/BuildAssetsCommand.cs rename to UnityProject/Assets/TEngine/Editor/HybridCLR/BuildDLLCommand.cs index 54cef264..126e5853 100644 --- a/UnityProject/Assets/TEngine/Editor/HybridCLR/BuildAssetsCommand.cs +++ b/UnityProject/Assets/TEngine/Editor/HybridCLR/BuildDLLCommand.cs @@ -4,7 +4,7 @@ using TEngine.Editor; using UnityEditor; using UnityEngine; -public static class BuildAssetsCommand +public static class BuildDLLCommand { private const string EnableHybridClrScriptingDefineSymbol = "ENABLE_HYBRIDCLR"; @@ -35,6 +35,12 @@ public static class BuildAssetsCommand CopyAOTHotUpdateDlls(target); } + public static void BuildAndCopyDlls(BuildTarget target) + { + CompileDllCommand.CompileDll(target); + CopyAOTHotUpdateDlls(target); + } + public static void CopyAOTHotUpdateDlls(BuildTarget target) { CopyAOTAssembliesToAssetPath(); diff --git a/UnityProject/Assets/TEngine/Editor/HybridCLR/BuildAssetsCommand.cs.meta b/UnityProject/Assets/TEngine/Editor/HybridCLR/BuildDLLCommand.cs.meta similarity index 100% rename from UnityProject/Assets/TEngine/Editor/HybridCLR/BuildAssetsCommand.cs.meta rename to UnityProject/Assets/TEngine/Editor/HybridCLR/BuildDLLCommand.cs.meta diff --git a/UnityProject/Assets/TEngine/Editor/ReleaseTools/ReleaseTools.cs b/UnityProject/Assets/TEngine/Editor/ReleaseTools/ReleaseTools.cs index 15fb81fb..1440c28d 100644 --- a/UnityProject/Assets/TEngine/Editor/ReleaseTools/ReleaseTools.cs +++ b/UnityProject/Assets/TEngine/Editor/ReleaseTools/ReleaseTools.cs @@ -1,42 +1,119 @@ -using UnityEditor; +using System; +using UnityEditor; +using UnityEditor.Build.Reporting; using UnityEngine; using YooAsset.Editor; +using BuildResult = UnityEditor.Build.Reporting.BuildResult; namespace TEngine { /// /// 打包工具类。 - /// 通过CommandLineReader可以不前台开启Unity实现静默打包,详见CommandLineReader.cs example1 + /// 通过CommandLineReader可以不前台开启Unity实现静默打包以及CLI工作流,详见CommandLineReader.cs example1 /// public static class ReleaseTools { - public static void BuildPackage() + public static void BuildDll() + { + string platform = CommandLineReader.GetCustomArgument("platform"); + if (string.IsNullOrEmpty(platform)) + { + Debug.LogError($"Build Asset Bundle Error!platform is null"); + return; + } + + BuildTarget target = GetBuildTarget(platform); + BuildDLLCommand.BuildAndCopyDlls(target); + } + + public static void BuildAssetBundle() { string outputRoot = CommandLineReader.GetCustomArgument("outputRoot"); - BuildTarget target = BuildTarget.StandaloneWindows64; - BuildInternal(target,outputRoot); + if (string.IsNullOrEmpty(outputRoot)) + { + Debug.LogError($"Build Asset Bundle Error!outputRoot is null"); + return; + } + + string packageVersion = CommandLineReader.GetCustomArgument("packageVersion"); + if (string.IsNullOrEmpty(packageVersion)) + { + Debug.LogError($"Build Asset Bundle Error!packageVersion is null"); + return; + } + + string platform = CommandLineReader.GetCustomArgument("platform"); + if (string.IsNullOrEmpty(platform)) + { + Debug.LogError($"Build Asset Bundle Error!platform is null"); + return; + } + + BuildTarget target = GetBuildTarget(platform); + BuildInternal(target, outputRoot); Debug.LogWarning($"Start BuildPackage BuildTarget:{target} outputPath:{outputRoot}"); } - - private static void BuildInternal(BuildTarget buildTarget,string outputRoot) + + private static BuildTarget GetBuildTarget(string platform) + { + BuildTarget target = BuildTarget.NoTarget; + switch (platform) + { + case "Android": + target = BuildTarget.Android; + break; + case "IOS": + target = BuildTarget.iOS; + break; + case "Windows": + target = BuildTarget.StandaloneWindows64; + break; + case "MacOS": + target = BuildTarget.StandaloneOSX; + break; + case "Linux": + target = BuildTarget.StandaloneLinux64; + break; + case "WebGL": + target = BuildTarget.WebGL; + break; + case "Switch": + target = BuildTarget.Switch; + break; + case "PS4": + target = BuildTarget.PS4; + break; + case "PS5": + target = BuildTarget.PS5; + break; + } + + return target; + } + + private static void BuildInternal(BuildTarget buildTarget, string outputRoot, string packageVersion = "1.0") { Debug.Log($"开始构建 : {buildTarget}"); + BuildParameters.SBPBuildParameters sbpBuildParameters = new BuildParameters.SBPBuildParameters(); + sbpBuildParameters.WriteLinkXML = true; + // 构建参数 BuildParameters buildParameters = new BuildParameters(); buildParameters.StreamingAssetsRoot = AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot(); - buildParameters.BuildOutputRoot = outputRoot;//AssetBundleBuilderHelper.GetDefaultBuildOutputRoot(); + buildParameters.BuildOutputRoot = outputRoot; //AssetBundleBuilderHelper.GetDefaultBuildOutputRoot(); buildParameters.BuildTarget = buildTarget; - buildParameters.BuildPipeline = EBuildPipeline.BuiltinBuildPipeline; - buildParameters.BuildMode = EBuildMode.ForceRebuild; + buildParameters.BuildPipeline = EBuildPipeline.ScriptableBuildPipeline; + buildParameters.BuildMode = EBuildMode.IncrementalBuild; buildParameters.PackageName = "DefaultPackage"; - buildParameters.PackageVersion = "1.0"; + buildParameters.PackageVersion = packageVersion; buildParameters.VerifyBuildingResult = true; buildParameters.SharedPackRule = new ZeroRedundancySharedPackRule(); - buildParameters.CompressOption = ECompressOption.LZ4; + buildParameters.CompressOption = ECompressOption.LZMA; buildParameters.OutputNameStyle = EOutputNameStyle.HashName; - buildParameters.CopyBuildinFileOption = ECopyBuildinFileOption.None; - + buildParameters.CopyBuildinFileOption = ECopyBuildinFileOption.ClearAndCopyAll; + buildParameters.SBPParameters = sbpBuildParameters; + // 执行构建 AssetBundleBuilder builder = new AssetBundleBuilder(); var buildResult = builder.Run(buildParameters); @@ -50,15 +127,66 @@ namespace TEngine } } - // 从构建命令里获取参数示例 - private static string GetBuildPackageName() + [MenuItem("TEngine/Build/一键打包Windows", false, 30)] + public static void AutomationBuild() { - foreach (string arg in System.Environment.GetCommandLineArgs()) + BuildDLLCommand.BuildAndCopyDlls(BuildTarget.StandaloneWindows64); + AssetDatabase.Refresh(); + BuildInternal(BuildTarget.StandaloneWindows64, Application.dataPath + "/../Builds/Windows", "1.0"); + AssetDatabase.Refresh(); + BuildImp(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64, $"{Application.dataPath}/../Builds/Windows/{GetBuildPackageVersion()}Windows.exe"); + } + + // 构建版本相关 + private static string GetBuildPackageVersion() + { + int totalMinutes = DateTime.Now.Hour * 60 + DateTime.Now.Minute; + return DateTime.Now.ToString("yyyy-MM-dd") + "-" + totalMinutes; + } + + [MenuItem("TEngine/Build/一键打包Android", false, 30)] + public static void AutomationBuildAndroid() + { + BuildDLLCommand.BuildAndCopyDlls(BuildTarget.Android); + AssetDatabase.Refresh(); + BuildInternal(BuildTarget.Android, outputRoot:Application.dataPath + "/../Bundles",packageVersion: GetBuildPackageVersion()); + AssetDatabase.Refresh(); + BuildImp(BuildTargetGroup.Android, BuildTarget.Android, $"{Application.dataPath}/../Build/Android/{GetBuildPackageVersion()}Android.apk"); + } + + [MenuItem("TEngine/Build/一键打包IOS", false, 30)] + public static void AutomationBuildIOS() + { + BuildDLLCommand.BuildAndCopyDlls(BuildTarget.iOS); + AssetDatabase.Refresh(); + BuildInternal(BuildTarget.iOS, outputRoot:Application.dataPath + "/../Bundles",packageVersion: GetBuildPackageVersion()); + AssetDatabase.Refresh(); + BuildImp(BuildTargetGroup.iOS, BuildTarget.iOS, $"{Application.dataPath}/../Build/IOS/XCode_Project"); + } + + public static void BuildImp(BuildTargetGroup buildTargetGroup, BuildTarget buildTarget, string locationPathName) + { + EditorUserBuildSettings.SwitchActiveBuildTarget(buildTargetGroup, BuildTarget.StandaloneWindows64); + AssetDatabase.Refresh(); + + BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions { - if (arg.StartsWith("buildPackage")) - return arg.Split("="[0])[1]; + scenes = new[] { "Assets/Scenes/main.unity" }, + locationPathName = locationPathName, + targetGroup = buildTargetGroup, + target = buildTarget, + options = BuildOptions.None + }; + var report = BuildPipeline.BuildPlayer(buildPlayerOptions); + BuildSummary summary = report.summary; + if (summary.result == BuildResult.Succeeded) + { + Debug.Log($"Build success: {summary.totalSize / 1024 / 1024} MB"); + } + else + { + Debug.Log($"Build Failed" + summary.result); } - return string.Empty; } } } \ No newline at end of file