From de04ff2bdd519bb294f0776508505bc7a5546035 Mon Sep 17 00:00:00 2001 From: Stanislav Felinskyi Date: Thu, 2 Mar 2023 15:30:08 +0200 Subject: [PATCH 1/3] Interm commit for the new PoC --- Editor/BatchMode/BatchModeBuilder.cs | 200 +++++++++--------- Editor/Core/Pipelines/BuildPipeline.cs | 75 +++++-- .../Pipelines/ScriptablePostBuildPipeline.cs | 4 +- .../Core/Steps/Build/ScriptableBuildStep.cs | 26 +-- .../ScriptableBuildStepWithDefines.cs | 5 +- Editor/Platforms/Android/Build/BuildApk.cs | 9 +- .../Platforms/Standalone/Build/BuildMacOS.cs | 15 +- .../Standalone/Build/BuildWindows.cs | 9 +- .../Standalone/Build/BuildWindows64.cs | 9 +- Editor/Platforms/WebGL/BuildWebGL.cs | 11 +- .../Platforms/iOS/Steps/Build/BuildXCode.cs | 8 +- 11 files changed, 214 insertions(+), 157 deletions(-) diff --git a/Editor/BatchMode/BatchModeBuilder.cs b/Editor/BatchMode/BatchModeBuilder.cs index e338407..f95c7ae 100644 --- a/Editor/BatchMode/BatchModeBuilder.cs +++ b/Editor/BatchMode/BatchModeBuilder.cs @@ -9,103 +9,107 @@ namespace UniTools.Build { public static class BatchModeBuilder { - public static async void Execute() - { - if (!Application.isBatchMode) - { - //TODO Implement BatchMode exception - throw new Exception($"{nameof(BatchModeBuilder)}: can be run only from the BatchMode!"); - } - - BatchModeParameters parameters = CommandLineParser.Parse(Environment.CommandLine); - - string pipelineName = parameters.Pipeline; - - //check if the selected pipeline is composite - if (Find(pipelineName) != null) - { - await RunCompositeBuildPipeline(pipelineName); - } - //check if the selected pipeline is simple - else if (Find(pipelineName) != null) - { - await RunBuildPipeline(pipelineName); - } - else - { - throw new Exception($"Failed to find a pipeline with name {pipelineName}!"); - } - } - - private static TPipeline Find(string pipelineName) where TPipeline : ScriptableBuildPipeline - { - string[] guids = AssetDatabase.FindAssets($"t:{nameof(ScriptableBuildPipeline)}"); - - foreach (string guid in guids) - { - string path = AssetDatabase.GUIDToAssetPath(guid); - TPipeline pipeline = AssetDatabase.LoadAssetAtPath(path); - if (pipeline == null) - { - continue; - } - - if (pipeline.name.Equals(pipelineName)) - { - return pipeline; - } - } - - return null; - } - - private static async Task RunCompositeBuildPipeline(string name) - { - CompositeBuildPipeline pipeline = Find(name); - if (pipeline == null) - { - throw new Exception($"Failed to find a pipeline with name {name}!"); - } - - string[] childNames = pipeline.Pipelines.Select(p => p.name).ToArray(); - - foreach (string s in childNames) - { - Debug.Log($"{nameof(RunCompositeBuildPipeline)}: {s}"); - } - - await pipeline.PreBuild(); - - foreach (string childName in childNames) - { - await RunBuildPipeline(childName); - } - } - - private static async Task RunBuildPipeline(string name) - { - BuildPipeline pipeline = Find(name); - if (pipeline == null) - { - throw new Exception($"Failed to find a pipeline with name {name}!"); - } - - await pipeline.PreBuild(); - BuildReport report = await pipeline.Build(); - BuildSummary summary = report.summary; - if (summary.result == BuildResult.Failed) - { - throw new Exception($"{nameof(BatchModeBuilder)}: {name} failed!"); - } - - //after the build we have to find a pipeline again due to unity clean all serialize fields and previous reference is invalid - pipeline = Find(name); - if (pipeline == null) - { - throw new Exception($"Failed to find a pipeline with name {name}!"); - } - - await pipeline.PostBuild(); - } + + //TODO Batchmode temporary disabled + + + // public static async void Execute() + // { + // if (!Application.isBatchMode) + // { + // //TODO Implement BatchMode exception + // throw new Exception($"{nameof(BatchModeBuilder)}: can be run only from the BatchMode!"); + // } + // + // BatchModeParameters parameters = CommandLineParser.Parse(Environment.CommandLine); + // + // string pipelineName = parameters.Pipeline; + // + // //check if the selected pipeline is composite + // if (Find(pipelineName) != null) + // { + // await RunCompositeBuildPipeline(pipelineName); + // } + // //check if the selected pipeline is simple + // else if (Find(pipelineName) != null) + // { + // await RunBuildPipeline(pipelineName); + // } + // else + // { + // throw new Exception($"Failed to find a pipeline with name {pipelineName}!"); + // } + // } + // + // private static TPipeline Find(string pipelineName) where TPipeline : ScriptableBuildPipeline + // { + // string[] guids = AssetDatabase.FindAssets($"t:{nameof(ScriptableBuildPipeline)}"); + // + // foreach (string guid in guids) + // { + // string path = AssetDatabase.GUIDToAssetPath(guid); + // TPipeline pipeline = AssetDatabase.LoadAssetAtPath(path); + // if (pipeline == null) + // { + // continue; + // } + // + // if (pipeline.name.Equals(pipelineName)) + // { + // return pipeline; + // } + // } + // + // return null; + // } + // + // private static async Task RunCompositeBuildPipeline(string name) + // { + // CompositeBuildPipeline pipeline = Find(name); + // if (pipeline == null) + // { + // throw new Exception($"Failed to find a pipeline with name {name}!"); + // } + // + // string[] childNames = pipeline.Pipelines.Select(p => p.name).ToArray(); + // + // foreach (string s in childNames) + // { + // Debug.Log($"{nameof(RunCompositeBuildPipeline)}: {s}"); + // } + // + // await pipeline.PreBuild(); + // + // foreach (string childName in childNames) + // { + // await RunBuildPipeline(childName); + // } + // } + // + // private static async Task RunBuildPipeline(string name) + // { + // BuildPipeline pipeline = Find(name); + // if (pipeline == null) + // { + // throw new Exception($"Failed to find a pipeline with name {name}!"); + // } + // + // await pipeline.PreBuild(); + // BuildReport report = await pipeline.Build(); + // BuildSummary summary = report.summary; + // if (summary.result == BuildResult.Failed) + // { + // throw new Exception($"{nameof(BatchModeBuilder)}: {name} failed!"); + // } + // + // //after the build we have to find a pipeline again due to unity clean all serialize fields and previous reference is invalid + // pipeline = Find(name); + // if (pipeline == null) + // { + // throw new Exception($"Failed to find a pipeline with name {name}!"); + // } + // + // await pipeline.PostBuild(); + // } } } \ No newline at end of file diff --git a/Editor/Core/Pipelines/BuildPipeline.cs b/Editor/Core/Pipelines/BuildPipeline.cs index 2474d74..882dedc 100644 --- a/Editor/Core/Pipelines/BuildPipeline.cs +++ b/Editor/Core/Pipelines/BuildPipeline.cs @@ -1,6 +1,6 @@ using System; using System.Threading.Tasks; -using UnityEditor.Build.Reporting; +using UnityEditor; using UnityEngine; namespace UniTools.Build @@ -9,34 +9,81 @@ namespace UniTools.Build fileName = nameof(BuildPipeline), menuName = MenuPaths.Pipelines + "Pipeline" )] - public sealed class BuildPipeline : ScriptablePostBuildPipeline + public sealed class BuildPipeline : ScriptableObject + //ScriptablePostBuildPipeline { + [Serializable] + private sealed class PipelineStep + { + public ScriptableCustomBuildStep Step = default; + public bool Skip = false; + } + + [SerializeField] private PipelineStep[] m_steps = default; + [ContextMenu("Run")] - public override async Task Run() + // public override async Task Run() + public async Task Run() { if (Application.isBatchMode) { throw new Exception($"{nameof(BuildPipeline)}: can not be run from the BatchMode!"); } + if (m_steps == null || m_steps.Length == 0) + { + Debug.Log($"{nameof(BuildPipeline)}: no any post build steps"); + + return; + } + try { - await PreBuild(); - BuildReport report = await Build(); - BuildSummary summary = report.summary; - if (summary.result == BuildResult.Failed) + for (int i = 0; i < m_steps.Length; i++) { - throw new Exception($"{nameof(BuildPipeline)}: {name} Build failed!"); - } + EditorUtility.ClearProgressBar(); + if (m_steps[i] == null || m_steps[i].Step == null) + { + Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The step at index {i} is null!"); + + continue; + } + + EditorUtility.DisplayProgressBar($"Execute {m_steps[i].Step.name} ({i + 1}/{m_steps.Length})...", $"{m_steps[i].Step.name} ", i / (float)m_steps.Length); + + if (m_steps[i].Skip) + { + Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The {m_steps[i].Step.name} was skipped!"); - await PostBuild(); + continue; + } + + await m_steps[i].Step.Execute(); + } } - catch (Exception e) + finally { - Debug.LogException(e); - - throw; + EditorUtility.ClearProgressBar(); } + + // try + // { + // await PreBuild(); + // BuildReport report = await Build(); + // BuildSummary summary = report.summary; + // if (summary.result == BuildResult.Failed) + // { + // throw new Exception($"{nameof(BuildPipeline)}: {name} Build failed!"); + // } + // + // await PostBuild(); + // } + // catch (Exception e) + // { + // Debug.LogException(e); + // + // throw; + // } } } } \ No newline at end of file diff --git a/Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs b/Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs index ce93064..f5d040a 100644 --- a/Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs +++ b/Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs @@ -6,6 +6,7 @@ namespace UniTools.Build { + //TODO Has to be removed public abstract class ScriptablePostBuildPipeline : ScriptablePreBuildPipeline { [SerializeField] private ScriptableBuildStep m_build = default; @@ -19,7 +20,8 @@ private sealed class PostBuildStep [SerializeField] private PostBuildStep[] m_postBuild = default; - public async Task Build() => await m_build.Execute(); + // public async Task Build() => await m_build.Execute(); + public async Task Build() => throw new NotImplementedException(); public async Task PostBuild() { diff --git a/Editor/Core/Steps/Build/ScriptableBuildStep.cs b/Editor/Core/Steps/Build/ScriptableBuildStep.cs index 65259ff..98223db 100644 --- a/Editor/Core/Steps/Build/ScriptableBuildStep.cs +++ b/Editor/Core/Steps/Build/ScriptableBuildStep.cs @@ -1,36 +1,12 @@ -using System; -using System.Threading.Tasks; using UnityEditor; -using UnityEditor.Build.Reporting; -using UnityEngine; namespace UniTools.Build { /// /// This step must be user to create a build (artifacts: iOS, Android, etc...) using Unity API /// - public abstract class ScriptableBuildStep : ScriptableObject + public abstract class ScriptableBuildStep : ScriptableCustomBuildStep { public abstract BuildTarget Target { get; } - - public abstract Task Execute(); - - [ContextMenu("Run")] - private void Run() - { - if (EditorUtility.DisplayDialog($"Run {name} separately?", "This option must be used for the debug only. Running steps outside of the pipeline can cause unexpected behavior.", "Yes", "No")) - { - Debug.Log($"Running {name} separately."); - - try - { - Execute().GetAwaiter().GetResult(); - } - catch (Exception e) - { - Debug.LogException(e); - } - } - } } } \ No newline at end of file diff --git a/Editor/Defines/Pipelines/ScriptableBuildStepWithDefines.cs b/Editor/Defines/Pipelines/ScriptableBuildStepWithDefines.cs index 582d216..1b615d4 100644 --- a/Editor/Defines/Pipelines/ScriptableBuildStepWithDefines.cs +++ b/Editor/Defines/Pipelines/ScriptableBuildStepWithDefines.cs @@ -1,6 +1,5 @@ using System.Threading.Tasks; using UnityEditor; -using UnityEditor.Build.Reporting; using UnityEngine; namespace UniTools.Build @@ -16,11 +15,11 @@ public sealed class ScriptableBuildStepWithDefines : ScriptableBuildStep public override BuildTarget Target => m_successor.Target; - public override async Task Execute() + public override async Task Execute() { m_symbols.Apply(UnityEditor.BuildPipeline.GetBuildTargetGroup(Target)); - return await m_successor.Execute(); + await m_successor.Execute(); } } } \ No newline at end of file diff --git a/Editor/Platforms/Android/Build/BuildApk.cs b/Editor/Platforms/Android/Build/BuildApk.cs index fbf8875..d9ec95c 100644 --- a/Editor/Platforms/Android/Build/BuildApk.cs +++ b/Editor/Platforms/Android/Build/BuildApk.cs @@ -1,3 +1,4 @@ +using System; using System.Threading.Tasks; using UnityEditor; using UnityEditor.Build.Reporting; @@ -13,13 +14,17 @@ public sealed class BuildApk : ScriptableBuildStepWithOptions { public override BuildTarget Target => BuildTarget.Android; - public override async Task Execute() + public override async Task Execute() { BuildPlayerOptions buildPlayerOptions = Options; BuildReport report = UnityEditor.BuildPipeline.BuildPlayer(buildPlayerOptions); await Task.CompletedTask; - return report; + BuildSummary summary = report.summary; + if (summary.result == BuildResult.Failed) + { + throw new Exception($"{nameof(BuildPipeline)}: {name} Build failed!"); + } } } } \ No newline at end of file diff --git a/Editor/Platforms/Standalone/Build/BuildMacOS.cs b/Editor/Platforms/Standalone/Build/BuildMacOS.cs index 04f8f98..e911dfe 100644 --- a/Editor/Platforms/Standalone/Build/BuildMacOS.cs +++ b/Editor/Platforms/Standalone/Build/BuildMacOS.cs @@ -1,13 +1,14 @@ +using System; using System.Threading.Tasks; using UnityEditor; using UnityEditor.Build.Reporting; +using UnityEngine; #if UNITY_EDITOR_OSX #if UNITY_2022_2_OR_NEWER using UnityEditor.Build; #endif using UnityEditor.OSXStandalone; #endif -using UnityEngine; namespace UniTools.Build { @@ -18,17 +19,17 @@ namespace UniTools.Build public sealed class BuildMacOS : ScriptableBuildStepWithOptions { #if UNITY_EDITOR_OSX - + #if UNITY_2022_2_OR_NEWER [SerializeField] private OSArchitecture m_architecture = default; -#else +#else [SerializeField] private MacOSArchitecture m_architecture = default; #endif [SerializeField] private bool m_createXcodeProject = false; #endif public override BuildTarget Target => BuildTarget.StandaloneOSX; - public override async Task Execute() + public override async Task Execute() { #if UNITY_EDITOR_OSX UserBuildSettings.architecture = m_architecture; @@ -41,7 +42,11 @@ public override async Task Execute() await Task.CompletedTask; - return report; + BuildSummary summary = report.summary; + if (summary.result == BuildResult.Failed) + { + throw new Exception($"{nameof(BuildPipeline)}: {name} Build failed!"); + } } } } \ No newline at end of file diff --git a/Editor/Platforms/Standalone/Build/BuildWindows.cs b/Editor/Platforms/Standalone/Build/BuildWindows.cs index b14808e..f59278a 100644 --- a/Editor/Platforms/Standalone/Build/BuildWindows.cs +++ b/Editor/Platforms/Standalone/Build/BuildWindows.cs @@ -1,3 +1,4 @@ +using System; using System.Threading.Tasks; using UnityEditor; using UnityEditor.Build.Reporting; @@ -13,13 +14,17 @@ public sealed class BuildWindows : ScriptableBuildStepWithOptions { public override BuildTarget Target => BuildTarget.StandaloneWindows; - public override async Task Execute() + public override async Task Execute() { BuildReport report = UnityEditor.BuildPipeline.BuildPlayer(Options); await Task.CompletedTask; - return report; + BuildSummary summary = report.summary; + if (summary.result == BuildResult.Failed) + { + throw new Exception($"{nameof(BuildPipeline)}: {name} Build failed!"); + } } } } \ No newline at end of file diff --git a/Editor/Platforms/Standalone/Build/BuildWindows64.cs b/Editor/Platforms/Standalone/Build/BuildWindows64.cs index e9ce684..2aae344 100644 --- a/Editor/Platforms/Standalone/Build/BuildWindows64.cs +++ b/Editor/Platforms/Standalone/Build/BuildWindows64.cs @@ -1,3 +1,4 @@ +using System; using System.Threading.Tasks; using UnityEditor; using UnityEditor.Build.Reporting; @@ -13,13 +14,17 @@ public sealed class BuildWindows64 : ScriptableBuildStepWithOptions { public override BuildTarget Target => BuildTarget.StandaloneWindows64; - public override async Task Execute() + public override async Task Execute() { BuildReport report = UnityEditor.BuildPipeline.BuildPlayer(Options); await Task.CompletedTask; - return report; + BuildSummary summary = report.summary; + if (summary.result == BuildResult.Failed) + { + throw new Exception($"{nameof(BuildPipeline)}: {name} Build failed!"); + } } } } \ No newline at end of file diff --git a/Editor/Platforms/WebGL/BuildWebGL.cs b/Editor/Platforms/WebGL/BuildWebGL.cs index fd4af40..460bf75 100644 --- a/Editor/Platforms/WebGL/BuildWebGL.cs +++ b/Editor/Platforms/WebGL/BuildWebGL.cs @@ -1,3 +1,4 @@ +using System; using System.Threading.Tasks; using UnityEditor; using UnityEditor.Build; @@ -28,7 +29,7 @@ public sealed class BuildWebGL : ScriptableBuildStepWithOptions public override BuildTarget Target => BuildTarget.WebGL; - public override async Task Execute() + public override async Task Execute() { AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); @@ -44,7 +45,7 @@ public override async Task Execute() #else EditorUserBuildSettings.SetPlatformSettings(UnityEditor.BuildPipeline.GetBuildTargetName(BuildTarget.WebGL), "CodeOptimization", "Size"); #endif - + #if UNITY_2022 PlayerSettings.SetIl2CppCodeGeneration(NamedBuildTarget.WebGL, m_IL2CPPCodeGeneration); #else @@ -58,7 +59,11 @@ public override async Task Execute() await Task.CompletedTask; - return report; + BuildSummary summary = report.summary; + if (summary.result == BuildResult.Failed) + { + throw new Exception($"{nameof(BuildPipeline)}: {name} Build failed!"); + } } } } \ No newline at end of file diff --git a/Editor/Platforms/iOS/Steps/Build/BuildXCode.cs b/Editor/Platforms/iOS/Steps/Build/BuildXCode.cs index f36c546..7972514 100644 --- a/Editor/Platforms/iOS/Steps/Build/BuildXCode.cs +++ b/Editor/Platforms/iOS/Steps/Build/BuildXCode.cs @@ -17,7 +17,7 @@ public sealed class BuildXCode : ScriptableBuildStepWithOptions public override BuildTarget Target => BuildTarget.iOS; - public override async Task Execute() + public override async Task Execute() { BuildPlayerOptions buildPlayerOptions = Options; @@ -53,7 +53,11 @@ public override async Task Execute() await Task.CompletedTask; - return report; + BuildSummary summary = report.summary; + if (summary.result == BuildResult.Failed) + { + throw new Exception($"{nameof(BuildPipeline)}: {name} Build failed!"); + } } } } \ No newline at end of file From be717fa372e8e2189b52d849b3ba8f6550bffa79 Mon Sep 17 00:00:00 2001 From: Stanislav Felinskyi Date: Thu, 2 Mar 2023 16:19:37 +0200 Subject: [PATCH 2/3] Misc: Updates --- Editor/BatchMode/BatchModeBuilder.cs | 87 ++++++++++++++++++++++-- Editor/Core/Pipelines/BuildPipeline.cs | 93 ++++++++++++++++++++------ 2 files changed, 154 insertions(+), 26 deletions(-) diff --git a/Editor/BatchMode/BatchModeBuilder.cs b/Editor/BatchMode/BatchModeBuilder.cs index f95c7ae..19eab2f 100644 --- a/Editor/BatchMode/BatchModeBuilder.cs +++ b/Editor/BatchMode/BatchModeBuilder.cs @@ -1,18 +1,95 @@ using System; -using System.Linq; using System.Threading.Tasks; using UnityEditor; -using UnityEditor.Build.Reporting; using UnityEngine; namespace UniTools.Build { public static class BatchModeBuilder { - //TODO Batchmode temporary disabled - - + + public static async void Execute() + { + if (!Application.isBatchMode) + { + //TODO Implement BatchMode exception + throw new Exception($"{nameof(BatchModeBuilder)}: can be run only from the BatchMode!"); + } + + BatchModeParameters parameters = CommandLineParser.Parse(Environment.CommandLine); + + string pipelineName = parameters.Pipeline; + + if (Find(pipelineName) != null) + { + await RunBuildPipeline(pipelineName); + } + else + { + throw new Exception($"Failed to find a pipeline with name {pipelineName}!"); + } + } + + private static BuildPipeline Find(string pipelineName) + { + string[] guids = AssetDatabase.FindAssets($"t:{nameof(BuildPipeline)}"); + + foreach (string guid in guids) + { + string path = AssetDatabase.GUIDToAssetPath(guid); + BuildPipeline pipeline = AssetDatabase.LoadAssetAtPath(path); + if (pipeline == null) + { + continue; + } + + if (pipeline.name.Equals(pipelineName)) + { + return pipeline; + } + } + + return null; + } + + private static async Task RunBuildPipeline(string name) + { + BuildPipeline pipeline = Find(name); + if (pipeline == null) + { + throw new Exception($"Failed to find a pipeline with name {name}!"); + } + + int stepsCount = pipeline.Count; + for (int i = 0; i < stepsCount; i++) + { + await pipeline.RunStep(i); + pipeline = Find(name); + if (pipeline == null) + { + throw new Exception($"Failed to find a pipeline with name {name}!"); + } + } + + // await pipeline.PreBuild(); + // BuildReport report = await pipeline.Build(); + // BuildSummary summary = report.summary; + // if (summary.result == BuildResult.Failed) + // { + // throw new Exception($"{nameof(BatchModeBuilder)}: {name} failed!"); + // } + // + // //after the build we have to find a pipeline again due to unity clean all serialize fields and previous reference is invalid + // pipeline = Find(name); + // if (pipeline == null) + // { + // throw new Exception($"Failed to find a pipeline with name {name}!"); + // } + // + // await pipeline.PostBuild(); + } + // public static async void Execute() // { // if (!Application.isBatchMode) diff --git a/Editor/Core/Pipelines/BuildPipeline.cs b/Editor/Core/Pipelines/BuildPipeline.cs index 882dedc..f5bfb19 100644 --- a/Editor/Core/Pipelines/BuildPipeline.cs +++ b/Editor/Core/Pipelines/BuildPipeline.cs @@ -21,6 +21,43 @@ private sealed class PipelineStep [SerializeField] private PipelineStep[] m_steps = default; + public int Count => m_steps.Length; + + public async Task RunStep(int index) + { + if (index < 0 || index >= Count) + { + throw new Exception($"{nameof(BuildPipeline)}: Invalid step index {index}!"); + } + + try + { + EditorUtility.ClearProgressBar(); + if (m_steps[index] == null || m_steps[index].Step == null) + { + Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The step at index {index} is null!"); + + return; + } + + EditorUtility.DisplayProgressBar($"Execute {m_steps[index].Step.name} ({index + 1}/{m_steps.Length})...", $"{m_steps[index].Step.name} ", index / (float)Count); + + if (m_steps[index].Skip) + { + Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The {m_steps[index].Step.name} was skipped!"); + + return; + } + + await m_steps[index].Step.Execute(); + EditorUtility.ClearProgressBar(); + } + finally + { + EditorUtility.ClearProgressBar(); + } + } + [ContextMenu("Run")] // public override async Task Run() public async Task Run() @@ -39,33 +76,47 @@ public async Task Run() try { - for (int i = 0; i < m_steps.Length; i++) + for (int i = 0; i < Count; i++) { - EditorUtility.ClearProgressBar(); - if (m_steps[i] == null || m_steps[i].Step == null) - { - Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The step at index {i} is null!"); - - continue; - } - - EditorUtility.DisplayProgressBar($"Execute {m_steps[i].Step.name} ({i + 1}/{m_steps.Length})...", $"{m_steps[i].Step.name} ", i / (float)m_steps.Length); - - if (m_steps[i].Skip) - { - Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The {m_steps[i].Step.name} was skipped!"); - - continue; - } - - await m_steps[i].Step.Execute(); + await RunStep(i); } } - finally + catch (Exception e) { - EditorUtility.ClearProgressBar(); + Debug.LogException(e); + + throw e; } + // try + // { + // for (int i = 0; i < m_steps.Length; i++) + // { + // EditorUtility.ClearProgressBar(); + // if (m_steps[i] == null || m_steps[i].Step == null) + // { + // Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The step at index {i} is null!"); + // + // continue; + // } + // + // EditorUtility.DisplayProgressBar($"Execute {m_steps[i].Step.name} ({i + 1}/{m_steps.Length})...", $"{m_steps[i].Step.name} ", i / (float)m_steps.Length); + // + // if (m_steps[i].Skip) + // { + // Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The {m_steps[i].Step.name} was skipped!"); + // + // continue; + // } + // + // await m_steps[i].Step.Execute(); + // } + // } + // finally + // { + // EditorUtility.ClearProgressBar(); + // } + // try // { // await PreBuild(); From 7a121ccb339ab366bf3ef11e295466d9b1ffe296 Mon Sep 17 00:00:00 2001 From: Stanislav Felinskyi Date: Thu, 2 Mar 2023 16:39:46 +0200 Subject: [PATCH 3/3] Version 0.1.0-preview --- Editor/BatchMode/BatchModeBuilder.cs | 119 ------------------ ...Presenter.cs => BuildPipelinePresenter.cs} | 8 +- ...cs.meta => BuildPipelinePresenter.cs.meta} | 0 .../BuildPipelinesProjectSettingsProvider.cs | 10 +- Editor/Core/Pipelines/BuildPipeline.cs | 74 ++++------- .../Core/Pipelines/CompositeBuildPipeline.cs | 44 ------- .../Pipelines/CompositeBuildPipeline.cs.meta | 3 - .../Core/Pipelines/ScriptableBuildPipeline.cs | 10 -- .../Pipelines/ScriptableBuildPipeline.cs.meta | 3 - .../Pipelines/ScriptablePostBuildPipeline.cs | 65 ---------- .../ScriptablePostBuildPipeline.cs.meta | 3 - .../Pipelines/ScriptablePreBuildPipeline.cs | 63 ---------- .../ScriptablePreBuildPipeline.cs.meta | 3 - ...riptableBuildStep.cs => UnityBuildStep.cs} | 2 +- ...ildStep.cs.meta => UnityBuildStep.cs.meta} | 0 ...ptions.cs => UnityBuildStepWithOptions.cs} | 2 +- ...meta => UnityBuildStepWithOptions.cs.meta} | 0 ...iptableCustomBuildStep.cs => BuildStep.cs} | 2 +- ...tomBuildStep.cs.meta => BuildStep.cs.meta} | 0 Editor/Defines/Pipelines/ApplyDefines.cs | 31 +++++ ...thDefines.cs.meta => ApplyDefines.cs.meta} | 0 .../ScriptableBuildStepWithDefines.cs | 25 ---- Editor/IO/Archive/CreateZipArchiveStep.cs | 2 +- Editor/IO/Directory/EnsureDirectoryEmpty.cs | 2 +- Editor/IO/Directory/EnsureDirectoryExists.cs | 2 +- Editor/IO/Files/CopyFileToDirectory.cs | 2 +- Editor/IO/Files/DeleteFileOrDirectory.cs | 2 +- Editor/IO/Path/Steps/GenerateRandomPath.cs | 2 +- Editor/Platforms/Android/Build/BuildApk.cs | 2 +- Editor/Platforms/Android/Pre/SetAlias.cs | 2 +- .../Platforms/Android/Pre/SetDebugKeystore.cs | 2 +- .../Android/Pre/SetKeystorePassword.cs | 2 +- .../Platforms/Standalone/Build/BuildMacOS.cs | 2 +- .../Standalone/Build/BuildWindows.cs | 2 +- .../Standalone/Build/BuildWindows64.cs | 2 +- Editor/Platforms/WebGL/BuildWebGL.cs | 2 +- Editor/Platforms/iOS/Steps/Archive/Archive.cs | 2 +- .../Platforms/iOS/Steps/Build/BuildXCode.cs | 2 +- .../DistributeIosApplicationStep.cs | 2 +- .../iOS/Steps/Plist/ModifyInfoPlist.cs | 2 +- .../iOS/Steps/Signing/SetAutomaticSigning.cs | 2 +- .../Signing/SetManualProvisionProfile.cs | 2 +- .../Platforms/iOS/Steps/Signing/SetTeamId.cs | 2 +- .../Steps/Pre/ChangeSemanticVersionStep.cs | 2 +- package.json | 2 +- 45 files changed, 87 insertions(+), 426 deletions(-) rename Editor/Core/CustomEditors/{ScriptableBuildPipelinePresenter.cs => BuildPipelinePresenter.cs} (82%) rename Editor/Core/CustomEditors/{ScriptableBuildPipelinePresenter.cs.meta => BuildPipelinePresenter.cs.meta} (100%) delete mode 100644 Editor/Core/Pipelines/CompositeBuildPipeline.cs delete mode 100644 Editor/Core/Pipelines/CompositeBuildPipeline.cs.meta delete mode 100644 Editor/Core/Pipelines/ScriptableBuildPipeline.cs delete mode 100644 Editor/Core/Pipelines/ScriptableBuildPipeline.cs.meta delete mode 100644 Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs delete mode 100644 Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs.meta delete mode 100644 Editor/Core/Pipelines/ScriptablePreBuildPipeline.cs delete mode 100644 Editor/Core/Pipelines/ScriptablePreBuildPipeline.cs.meta rename Editor/Core/Steps/Build/{ScriptableBuildStep.cs => UnityBuildStep.cs} (77%) rename Editor/Core/Steps/Build/{ScriptableBuildStep.cs.meta => UnityBuildStep.cs.meta} (100%) rename Editor/Core/Steps/Build/{ScriptableBuildStepWithOptions.cs => UnityBuildStepWithOptions.cs} (93%) rename Editor/Core/Steps/Build/{ScriptableBuildStepWithOptions.cs.meta => UnityBuildStepWithOptions.cs.meta} (100%) rename Editor/Core/Steps/Custom/{ScriptableCustomBuildStep.cs => BuildStep.cs} (92%) rename Editor/Core/Steps/Custom/{ScriptableCustomBuildStep.cs.meta => BuildStep.cs.meta} (100%) create mode 100644 Editor/Defines/Pipelines/ApplyDefines.cs rename Editor/Defines/Pipelines/{ScriptableBuildStepWithDefines.cs.meta => ApplyDefines.cs.meta} (100%) delete mode 100644 Editor/Defines/Pipelines/ScriptableBuildStepWithDefines.cs diff --git a/Editor/BatchMode/BatchModeBuilder.cs b/Editor/BatchMode/BatchModeBuilder.cs index 19eab2f..017da01 100644 --- a/Editor/BatchMode/BatchModeBuilder.cs +++ b/Editor/BatchMode/BatchModeBuilder.cs @@ -7,13 +7,10 @@ namespace UniTools.Build { public static class BatchModeBuilder { - //TODO Batchmode temporary disabled - public static async void Execute() { if (!Application.isBatchMode) { - //TODO Implement BatchMode exception throw new Exception($"{nameof(BatchModeBuilder)}: can be run only from the BatchMode!"); } @@ -71,122 +68,6 @@ private static async Task RunBuildPipeline(string name) throw new Exception($"Failed to find a pipeline with name {name}!"); } } - - // await pipeline.PreBuild(); - // BuildReport report = await pipeline.Build(); - // BuildSummary summary = report.summary; - // if (summary.result == BuildResult.Failed) - // { - // throw new Exception($"{nameof(BatchModeBuilder)}: {name} failed!"); - // } - // - // //after the build we have to find a pipeline again due to unity clean all serialize fields and previous reference is invalid - // pipeline = Find(name); - // if (pipeline == null) - // { - // throw new Exception($"Failed to find a pipeline with name {name}!"); - // } - // - // await pipeline.PostBuild(); } - - // public static async void Execute() - // { - // if (!Application.isBatchMode) - // { - // //TODO Implement BatchMode exception - // throw new Exception($"{nameof(BatchModeBuilder)}: can be run only from the BatchMode!"); - // } - // - // BatchModeParameters parameters = CommandLineParser.Parse(Environment.CommandLine); - // - // string pipelineName = parameters.Pipeline; - // - // //check if the selected pipeline is composite - // if (Find(pipelineName) != null) - // { - // await RunCompositeBuildPipeline(pipelineName); - // } - // //check if the selected pipeline is simple - // else if (Find(pipelineName) != null) - // { - // await RunBuildPipeline(pipelineName); - // } - // else - // { - // throw new Exception($"Failed to find a pipeline with name {pipelineName}!"); - // } - // } - // - // private static TPipeline Find(string pipelineName) where TPipeline : ScriptableBuildPipeline - // { - // string[] guids = AssetDatabase.FindAssets($"t:{nameof(ScriptableBuildPipeline)}"); - // - // foreach (string guid in guids) - // { - // string path = AssetDatabase.GUIDToAssetPath(guid); - // TPipeline pipeline = AssetDatabase.LoadAssetAtPath(path); - // if (pipeline == null) - // { - // continue; - // } - // - // if (pipeline.name.Equals(pipelineName)) - // { - // return pipeline; - // } - // } - // - // return null; - // } - // - // private static async Task RunCompositeBuildPipeline(string name) - // { - // CompositeBuildPipeline pipeline = Find(name); - // if (pipeline == null) - // { - // throw new Exception($"Failed to find a pipeline with name {name}!"); - // } - // - // string[] childNames = pipeline.Pipelines.Select(p => p.name).ToArray(); - // - // foreach (string s in childNames) - // { - // Debug.Log($"{nameof(RunCompositeBuildPipeline)}: {s}"); - // } - // - // await pipeline.PreBuild(); - // - // foreach (string childName in childNames) - // { - // await RunBuildPipeline(childName); - // } - // } - // - // private static async Task RunBuildPipeline(string name) - // { - // BuildPipeline pipeline = Find(name); - // if (pipeline == null) - // { - // throw new Exception($"Failed to find a pipeline with name {name}!"); - // } - // - // await pipeline.PreBuild(); - // BuildReport report = await pipeline.Build(); - // BuildSummary summary = report.summary; - // if (summary.result == BuildResult.Failed) - // { - // throw new Exception($"{nameof(BatchModeBuilder)}: {name} failed!"); - // } - // - // //after the build we have to find a pipeline again due to unity clean all serialize fields and previous reference is invalid - // pipeline = Find(name); - // if (pipeline == null) - // { - // throw new Exception($"Failed to find a pipeline with name {name}!"); - // } - // - // await pipeline.PostBuild(); - // } } } \ No newline at end of file diff --git a/Editor/Core/CustomEditors/ScriptableBuildPipelinePresenter.cs b/Editor/Core/CustomEditors/BuildPipelinePresenter.cs similarity index 82% rename from Editor/Core/CustomEditors/ScriptableBuildPipelinePresenter.cs rename to Editor/Core/CustomEditors/BuildPipelinePresenter.cs index 458ede2..f3a77c9 100644 --- a/Editor/Core/CustomEditors/ScriptableBuildPipelinePresenter.cs +++ b/Editor/Core/CustomEditors/BuildPipelinePresenter.cs @@ -3,12 +3,12 @@ namespace UniTools.Build { - public sealed class ScriptableBuildPipelinePresenter + public sealed class BuildPipelinePresenter { - private readonly ScriptableBuildPipeline m_buildPipeline = default; + private readonly BuildPipeline m_buildPipeline = default; private bool m_foldout = false; - public ScriptableBuildPipelinePresenter(ScriptableBuildPipeline buildPipeline) + public BuildPipelinePresenter(BuildPipeline buildPipeline) { m_buildPipeline = buildPipeline; } @@ -38,7 +38,7 @@ public void Draw() if (run) { - m_buildPipeline.Run(); + m_buildPipeline.Run().GetAwaiter().OnCompleted(() => { Debug.Log($"Pipeline {m_buildPipeline} is completed!"); }); } if (modify) diff --git a/Editor/Core/CustomEditors/ScriptableBuildPipelinePresenter.cs.meta b/Editor/Core/CustomEditors/BuildPipelinePresenter.cs.meta similarity index 100% rename from Editor/Core/CustomEditors/ScriptableBuildPipelinePresenter.cs.meta rename to Editor/Core/CustomEditors/BuildPipelinePresenter.cs.meta diff --git a/Editor/Core/CustomEditors/BuildPipelinesProjectSettingsProvider.cs b/Editor/Core/CustomEditors/BuildPipelinesProjectSettingsProvider.cs index 052fb3f..1db2058 100644 --- a/Editor/Core/CustomEditors/BuildPipelinesProjectSettingsProvider.cs +++ b/Editor/Core/CustomEditors/BuildPipelinesProjectSettingsProvider.cs @@ -10,7 +10,7 @@ public sealed class BuildPipelinesProjectSettingsProvider : SettingsProvider public static SettingsProvider Register() => new BuildPipelinesProjectSettingsProvider($"Project/{nameof(UniTools)}/Build"); - private readonly List m_presenters = new List(); + private readonly List m_presenters = new List(); private BuildPipelinesProjectSettingsProvider(string path) : base(path, SettingsScope.Project) @@ -21,18 +21,18 @@ public override void OnActivate(string searchContext, VisualElement rootElement) { m_presenters.Clear(); - string[] guids = AssetDatabase.FindAssets($"t:{nameof(ScriptableBuildPipeline)}"); + string[] guids = AssetDatabase.FindAssets($"t:{nameof(BuildPipeline)}"); foreach (string guid in guids) { string path = AssetDatabase.GUIDToAssetPath(guid); - ScriptableBuildPipeline pipline = AssetDatabase.LoadAssetAtPath(path); - m_presenters.Add(new ScriptableBuildPipelinePresenter(pipline)); + BuildPipeline pipline = AssetDatabase.LoadAssetAtPath(path); + m_presenters.Add(new BuildPipelinePresenter(pipline)); } } public override void OnGUI(string searchContext) { - foreach (ScriptableBuildPipelinePresenter presenter in m_presenters) + foreach (BuildPipelinePresenter presenter in m_presenters) { presenter.Draw(); } diff --git a/Editor/Core/Pipelines/BuildPipeline.cs b/Editor/Core/Pipelines/BuildPipeline.cs index f5bfb19..5291351 100644 --- a/Editor/Core/Pipelines/BuildPipeline.cs +++ b/Editor/Core/Pipelines/BuildPipeline.cs @@ -10,12 +10,12 @@ namespace UniTools.Build menuName = MenuPaths.Pipelines + "Pipeline" )] public sealed class BuildPipeline : ScriptableObject - //ScriptablePostBuildPipeline { [Serializable] private sealed class PipelineStep { - public ScriptableCustomBuildStep Step = default; + public string Name = string.Empty; + public BuildStep Step = default; public bool Skip = false; } @@ -23,6 +23,23 @@ private sealed class PipelineStep public int Count => m_steps.Length; + private void OnValidate() + { + foreach (PipelineStep step in m_steps) + { + if (step == null) continue; + + if (step.Skip) + { + step.Name = $"{step.Step.name}(Skipped)"; + } + else + { + step.Name = step.Step.name; + } + } + } + public async Task RunStep(int index) { if (index < 0 || index >= Count) @@ -35,7 +52,7 @@ public async Task RunStep(int index) EditorUtility.ClearProgressBar(); if (m_steps[index] == null || m_steps[index].Step == null) { - Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The step at index {index} is null!"); + Debug.LogWarning($"{nameof(BuildPipeline)}: The step at index {index} is null!"); return; } @@ -44,7 +61,7 @@ public async Task RunStep(int index) if (m_steps[index].Skip) { - Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The {m_steps[index].Step.name} was skipped!"); + Debug.LogWarning($"{nameof(BuildPipeline)}: The {m_steps[index].Step.name} was skipped!"); return; } @@ -59,7 +76,6 @@ public async Task RunStep(int index) } [ContextMenu("Run")] - // public override async Task Run() public async Task Run() { if (Application.isBatchMode) @@ -87,54 +103,6 @@ public async Task Run() throw e; } - - // try - // { - // for (int i = 0; i < m_steps.Length; i++) - // { - // EditorUtility.ClearProgressBar(); - // if (m_steps[i] == null || m_steps[i].Step == null) - // { - // Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The step at index {i} is null!"); - // - // continue; - // } - // - // EditorUtility.DisplayProgressBar($"Execute {m_steps[i].Step.name} ({i + 1}/{m_steps.Length})...", $"{m_steps[i].Step.name} ", i / (float)m_steps.Length); - // - // if (m_steps[i].Skip) - // { - // Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The {m_steps[i].Step.name} was skipped!"); - // - // continue; - // } - // - // await m_steps[i].Step.Execute(); - // } - // } - // finally - // { - // EditorUtility.ClearProgressBar(); - // } - - // try - // { - // await PreBuild(); - // BuildReport report = await Build(); - // BuildSummary summary = report.summary; - // if (summary.result == BuildResult.Failed) - // { - // throw new Exception($"{nameof(BuildPipeline)}: {name} Build failed!"); - // } - // - // await PostBuild(); - // } - // catch (Exception e) - // { - // Debug.LogException(e); - // - // throw; - // } } } } \ No newline at end of file diff --git a/Editor/Core/Pipelines/CompositeBuildPipeline.cs b/Editor/Core/Pipelines/CompositeBuildPipeline.cs deleted file mode 100644 index ec66ca9..0000000 --- a/Editor/Core/Pipelines/CompositeBuildPipeline.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using UnityEngine; - -namespace UniTools.Build -{ - [CreateAssetMenu( - fileName = nameof(CompositeBuildPipeline), - menuName = MenuPaths.Pipelines + "Composite Pipeline" - )] - public sealed class CompositeBuildPipeline : ScriptablePreBuildPipeline - { - [SerializeField] private BuildPipeline[] m_pipelines = default; - - public IEnumerable Pipelines => m_pipelines; - - [ContextMenu("Run")] - public override async Task Run() - { - if (Application.isBatchMode) - { - //TODO Implement BatchMode exception - throw new Exception($"{nameof(CompositeBuildPipeline)}: can not be run from the BatchMode!"); - } - - try - { - await PreBuild(); - - foreach (BuildPipeline pipeline in m_pipelines) - { - await pipeline.Run(); - } - } - catch (Exception e) - { - Debug.LogException(e); - - throw; - } - } - } -} \ No newline at end of file diff --git a/Editor/Core/Pipelines/CompositeBuildPipeline.cs.meta b/Editor/Core/Pipelines/CompositeBuildPipeline.cs.meta deleted file mode 100644 index 2965e31..0000000 --- a/Editor/Core/Pipelines/CompositeBuildPipeline.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 5dc32d75fe8b45519610108b5d90c5b7 -timeCreated: 1623051310 \ No newline at end of file diff --git a/Editor/Core/Pipelines/ScriptableBuildPipeline.cs b/Editor/Core/Pipelines/ScriptableBuildPipeline.cs deleted file mode 100644 index 95eab1e..0000000 --- a/Editor/Core/Pipelines/ScriptableBuildPipeline.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Threading.Tasks; -using UnityEngine; - -namespace UniTools.Build -{ - public abstract class ScriptableBuildPipeline : ScriptableObject - { - public abstract Task Run(); - } -} \ No newline at end of file diff --git a/Editor/Core/Pipelines/ScriptableBuildPipeline.cs.meta b/Editor/Core/Pipelines/ScriptableBuildPipeline.cs.meta deleted file mode 100644 index 3a563d6..0000000 --- a/Editor/Core/Pipelines/ScriptableBuildPipeline.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: c0e99f3b2bf94088b9c191f3db4860a7 -timeCreated: 1623067766 \ No newline at end of file diff --git a/Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs b/Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs deleted file mode 100644 index f5d040a..0000000 --- a/Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Threading.Tasks; -using UnityEditor; -using UnityEditor.Build.Reporting; -using UnityEngine; - -namespace UniTools.Build -{ - //TODO Has to be removed - public abstract class ScriptablePostBuildPipeline : ScriptablePreBuildPipeline - { - [SerializeField] private ScriptableBuildStep m_build = default; - - [Serializable] - private sealed class PostBuildStep - { - public ScriptableCustomBuildStep Step = default; - public bool Skip = false; - } - - [SerializeField] private PostBuildStep[] m_postBuild = default; - - // public async Task Build() => await m_build.Execute(); - public async Task Build() => throw new NotImplementedException(); - - public async Task PostBuild() - { - if (m_postBuild == null || m_postBuild.Length == 0) - { - Debug.Log($"{nameof(ScriptablePostBuildPipeline)}: no any post build steps"); - - return; - } - - try - { - for (int i = 0; i < m_postBuild.Length; i++) - { - EditorUtility.ClearProgressBar(); - if (m_postBuild[i] == null || m_postBuild[i].Step == null) - { - Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The step at index {i} is null!"); - - continue; - } - - EditorUtility.DisplayProgressBar($"Post Build ({i + 1}/{m_postBuild.Length})...", $"{m_postBuild[i].Step.name} ", i / (float) m_postBuild.Length); - - if (m_postBuild[i].Skip) - { - Debug.LogWarning($"{nameof(ScriptablePostBuildPipeline)}: The {m_postBuild[i].Step.name} was skipped!"); - - continue; - } - - await m_postBuild[i].Step.Execute(); - } - } - finally - { - EditorUtility.ClearProgressBar(); - } - } - } -} \ No newline at end of file diff --git a/Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs.meta b/Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs.meta deleted file mode 100644 index 78119d6..0000000 --- a/Editor/Core/Pipelines/ScriptablePostBuildPipeline.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6eb25b9509d84ca6838b371b559dbe83 -timeCreated: 1617626249 \ No newline at end of file diff --git a/Editor/Core/Pipelines/ScriptablePreBuildPipeline.cs b/Editor/Core/Pipelines/ScriptablePreBuildPipeline.cs deleted file mode 100644 index 068138b..0000000 --- a/Editor/Core/Pipelines/ScriptablePreBuildPipeline.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Threading.Tasks; -using UnityEditor; -using UnityEngine; - -namespace UniTools.Build -{ - public abstract class ScriptablePreBuildPipeline : ScriptableBuildPipeline - { - [Serializable] - private sealed class PreBuildStep - { - public ScriptableCustomBuildStep Step = default; - public bool Skip = false; - } - - [SerializeField] private PreBuildStep[] m_preBuild = default; - - public async Task PreBuild() - { - if (m_preBuild == null || m_preBuild.Length == 0) - { - Debug.Log($"{nameof(ScriptablePreBuildPipeline)}: no any pre build steps"); - - return; - } - - try - { - for (int i = 0; i < m_preBuild.Length; i++) - { - EditorUtility.ClearProgressBar(); - - if (m_preBuild[i] == null || m_preBuild[i].Step == null) - { - Debug.LogWarning($"{nameof(ScriptablePreBuildPipeline)}: The step at index {i} is null!"); - - continue; - } - - EditorUtility.DisplayProgressBar($"Pre Build ({i + 1}/{m_preBuild.Length})...", $"{m_preBuild[i].Step.name} ", i / (float) m_preBuild.Length); - - if (m_preBuild[i].Skip) - { - Debug.LogWarning($"{nameof(ScriptablePreBuildPipeline)}: The {m_preBuild[i].Step.name} was skipped!"); - - continue; - } - - await m_preBuild[i].Step.Execute(); - } - } - catch (Exception e) - { - throw e; - } - finally - { - EditorUtility.ClearProgressBar(); - } - } - } -} \ No newline at end of file diff --git a/Editor/Core/Pipelines/ScriptablePreBuildPipeline.cs.meta b/Editor/Core/Pipelines/ScriptablePreBuildPipeline.cs.meta deleted file mode 100644 index 994cc2a..0000000 --- a/Editor/Core/Pipelines/ScriptablePreBuildPipeline.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 3bc9375c19c9498c9d5a924dcd203f76 -timeCreated: 1623051472 \ No newline at end of file diff --git a/Editor/Core/Steps/Build/ScriptableBuildStep.cs b/Editor/Core/Steps/Build/UnityBuildStep.cs similarity index 77% rename from Editor/Core/Steps/Build/ScriptableBuildStep.cs rename to Editor/Core/Steps/Build/UnityBuildStep.cs index 98223db..3a44af0 100644 --- a/Editor/Core/Steps/Build/ScriptableBuildStep.cs +++ b/Editor/Core/Steps/Build/UnityBuildStep.cs @@ -5,7 +5,7 @@ namespace UniTools.Build /// /// This step must be user to create a build (artifacts: iOS, Android, etc...) using Unity API /// - public abstract class ScriptableBuildStep : ScriptableCustomBuildStep + public abstract class UnityBuildStep : BuildStep { public abstract BuildTarget Target { get; } } diff --git a/Editor/Core/Steps/Build/ScriptableBuildStep.cs.meta b/Editor/Core/Steps/Build/UnityBuildStep.cs.meta similarity index 100% rename from Editor/Core/Steps/Build/ScriptableBuildStep.cs.meta rename to Editor/Core/Steps/Build/UnityBuildStep.cs.meta diff --git a/Editor/Core/Steps/Build/ScriptableBuildStepWithOptions.cs b/Editor/Core/Steps/Build/UnityBuildStepWithOptions.cs similarity index 93% rename from Editor/Core/Steps/Build/ScriptableBuildStepWithOptions.cs rename to Editor/Core/Steps/Build/UnityBuildStepWithOptions.cs index df1c972..47856ae 100644 --- a/Editor/Core/Steps/Build/ScriptableBuildStepWithOptions.cs +++ b/Editor/Core/Steps/Build/UnityBuildStepWithOptions.cs @@ -4,7 +4,7 @@ namespace UniTools.Build { - public abstract class ScriptableBuildStepWithOptions : ScriptableBuildStep + public abstract class UnityBuildStepWithOptions : UnityBuildStep { [SerializeField] private PathProperty m_path = default; [SerializeField] private bool m_developmentBuild = false; diff --git a/Editor/Core/Steps/Build/ScriptableBuildStepWithOptions.cs.meta b/Editor/Core/Steps/Build/UnityBuildStepWithOptions.cs.meta similarity index 100% rename from Editor/Core/Steps/Build/ScriptableBuildStepWithOptions.cs.meta rename to Editor/Core/Steps/Build/UnityBuildStepWithOptions.cs.meta diff --git a/Editor/Core/Steps/Custom/ScriptableCustomBuildStep.cs b/Editor/Core/Steps/Custom/BuildStep.cs similarity index 92% rename from Editor/Core/Steps/Custom/ScriptableCustomBuildStep.cs rename to Editor/Core/Steps/Custom/BuildStep.cs index 9adf4da..9e89296 100644 --- a/Editor/Core/Steps/Custom/ScriptableCustomBuildStep.cs +++ b/Editor/Core/Steps/Custom/BuildStep.cs @@ -8,7 +8,7 @@ namespace UniTools.Build /// /// This type of steps should be user to create any custom behavior for the build pipeline /// - public abstract class ScriptableCustomBuildStep : ScriptableObject + public abstract class BuildStep : ScriptableObject { public abstract Task Execute(); diff --git a/Editor/Core/Steps/Custom/ScriptableCustomBuildStep.cs.meta b/Editor/Core/Steps/Custom/BuildStep.cs.meta similarity index 100% rename from Editor/Core/Steps/Custom/ScriptableCustomBuildStep.cs.meta rename to Editor/Core/Steps/Custom/BuildStep.cs.meta diff --git a/Editor/Defines/Pipelines/ApplyDefines.cs b/Editor/Defines/Pipelines/ApplyDefines.cs new file mode 100644 index 0000000..b2dd6b0 --- /dev/null +++ b/Editor/Defines/Pipelines/ApplyDefines.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace UniTools.Build +{ + [CreateAssetMenu( + fileName = nameof(ApplyDefines), + menuName = MenuPaths.Defines + "ApplyDefines" + )] + public sealed class ApplyDefines : BuildStep + { + [SerializeField] private ScriptingDefineSymbols m_symbols = default; + [SerializeField] private BuildTargetGroup m_group = default; + + public override async Task Execute() + { + if (m_symbols == null) + { + throw new Exception("Invalid define symbols added!"); + } + + m_symbols.Apply(m_group); + AssetDatabase.Refresh(); + AssetDatabase.SaveAssets(); + + await Task.CompletedTask; + } + } +} \ No newline at end of file diff --git a/Editor/Defines/Pipelines/ScriptableBuildStepWithDefines.cs.meta b/Editor/Defines/Pipelines/ApplyDefines.cs.meta similarity index 100% rename from Editor/Defines/Pipelines/ScriptableBuildStepWithDefines.cs.meta rename to Editor/Defines/Pipelines/ApplyDefines.cs.meta diff --git a/Editor/Defines/Pipelines/ScriptableBuildStepWithDefines.cs b/Editor/Defines/Pipelines/ScriptableBuildStepWithDefines.cs deleted file mode 100644 index 1b615d4..0000000 --- a/Editor/Defines/Pipelines/ScriptableBuildStepWithDefines.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Threading.Tasks; -using UnityEditor; -using UnityEngine; - -namespace UniTools.Build -{ - [CreateAssetMenu( - fileName = nameof(ScriptableBuildStepWithDefines), - menuName = MenuPaths.Defines + "BuildWithDefines" - )] - public sealed class ScriptableBuildStepWithDefines : ScriptableBuildStep - { - [SerializeField] private ScriptableBuildStep m_successor = default; - [SerializeField] private ScriptingDefineSymbols m_symbols = default; - - public override BuildTarget Target => m_successor.Target; - - public override async Task Execute() - { - m_symbols.Apply(UnityEditor.BuildPipeline.GetBuildTargetGroup(Target)); - - await m_successor.Execute(); - } - } -} \ No newline at end of file diff --git a/Editor/IO/Archive/CreateZipArchiveStep.cs b/Editor/IO/Archive/CreateZipArchiveStep.cs index 35c61dd..14dbecc 100644 --- a/Editor/IO/Archive/CreateZipArchiveStep.cs +++ b/Editor/IO/Archive/CreateZipArchiveStep.cs @@ -9,7 +9,7 @@ namespace UniTools.Build fileName = nameof(CreateZipArchiveStep), menuName = MenuPaths.IO + "Zip Archive" )] - public sealed class CreateZipArchiveStep : ScriptableCustomBuildStep + public sealed class CreateZipArchiveStep : BuildStep { [SerializeField, Tooltip("The location of the folder that needs to be compressed.")] private PathProperty m_directory = default; [SerializeField, Tooltip("The name of the created archive (include extensions. Ex: my.zip).")] private PathProperty m_archiveFileName = default; diff --git a/Editor/IO/Directory/EnsureDirectoryEmpty.cs b/Editor/IO/Directory/EnsureDirectoryEmpty.cs index 93237d5..94a0912 100644 --- a/Editor/IO/Directory/EnsureDirectoryEmpty.cs +++ b/Editor/IO/Directory/EnsureDirectoryEmpty.cs @@ -9,7 +9,7 @@ namespace UniTools.Build fileName = nameof(EnsureDirectoryEmpty), menuName = MenuPaths.IO + nameof(EnsureDirectoryEmpty) )] - public sealed class EnsureDirectoryEmpty : ScriptableCustomBuildStep + public sealed class EnsureDirectoryEmpty : BuildStep { [SerializeField] private PathProperty m_path = default; diff --git a/Editor/IO/Directory/EnsureDirectoryExists.cs b/Editor/IO/Directory/EnsureDirectoryExists.cs index 646ccbe..9a2e581 100644 --- a/Editor/IO/Directory/EnsureDirectoryExists.cs +++ b/Editor/IO/Directory/EnsureDirectoryExists.cs @@ -8,7 +8,7 @@ namespace UniTools.Build fileName = nameof(EnsureDirectoryExists), menuName = MenuPaths.IO + nameof(EnsureDirectoryExists) )] - public sealed class EnsureDirectoryExists : ScriptableCustomBuildStep + public sealed class EnsureDirectoryExists : BuildStep { [SerializeField] private PathProperty m_path = default; diff --git a/Editor/IO/Files/CopyFileToDirectory.cs b/Editor/IO/Files/CopyFileToDirectory.cs index 8b87584..ed8b734 100644 --- a/Editor/IO/Files/CopyFileToDirectory.cs +++ b/Editor/IO/Files/CopyFileToDirectory.cs @@ -10,7 +10,7 @@ namespace UniTools.Build fileName = nameof(CopyFileToDirectory), menuName = MenuPaths.IO + nameof(CopyFileToDirectory) )] - public sealed class CopyFileToDirectory : ScriptableCustomBuildStep + public sealed class CopyFileToDirectory : BuildStep { [SerializeField] private PathProperty m_filePath = default; [SerializeField] private PathProperty m_destination = default; diff --git a/Editor/IO/Files/DeleteFileOrDirectory.cs b/Editor/IO/Files/DeleteFileOrDirectory.cs index d75c314..b272597 100644 --- a/Editor/IO/Files/DeleteFileOrDirectory.cs +++ b/Editor/IO/Files/DeleteFileOrDirectory.cs @@ -9,7 +9,7 @@ namespace UniTools.Build fileName = nameof(DeleteFileOrDirectory), menuName = MenuPaths.IO + nameof(DeleteFileOrDirectory) )] - public sealed class DeleteFileOrDirectory : ScriptableCustomBuildStep + public sealed class DeleteFileOrDirectory : BuildStep { [SerializeField] private PathProperty m_path = default; diff --git a/Editor/IO/Path/Steps/GenerateRandomPath.cs b/Editor/IO/Path/Steps/GenerateRandomPath.cs index a733656..39c6174 100644 --- a/Editor/IO/Path/Steps/GenerateRandomPath.cs +++ b/Editor/IO/Path/Steps/GenerateRandomPath.cs @@ -9,7 +9,7 @@ namespace UniTools.Build fileName = nameof(GenerateRandomPath), menuName = MenuPaths.IO + nameof(GenerateRandomPath) )] - public sealed class GenerateRandomPath : ScriptableCustomBuildStep + public sealed class GenerateRandomPath : BuildStep { [SerializeField] private PathProperty m_initial = default; [SerializeField] private ScriptablePath m_result = default; diff --git a/Editor/Platforms/Android/Build/BuildApk.cs b/Editor/Platforms/Android/Build/BuildApk.cs index d9ec95c..5759ca6 100644 --- a/Editor/Platforms/Android/Build/BuildApk.cs +++ b/Editor/Platforms/Android/Build/BuildApk.cs @@ -10,7 +10,7 @@ namespace UniTools.Build fileName = nameof(BuildApk), menuName = MenuPaths.Android + nameof(BuildApk) )] - public sealed class BuildApk : ScriptableBuildStepWithOptions + public sealed class BuildApk : UnityBuildStepWithOptions { public override BuildTarget Target => BuildTarget.Android; diff --git a/Editor/Platforms/Android/Pre/SetAlias.cs b/Editor/Platforms/Android/Pre/SetAlias.cs index d567b18..92d2e49 100644 --- a/Editor/Platforms/Android/Pre/SetAlias.cs +++ b/Editor/Platforms/Android/Pre/SetAlias.cs @@ -9,7 +9,7 @@ namespace UniTools.Build fileName = nameof(SetAlias), menuName = MenuPaths.Android + nameof(SetAlias) )] - public sealed class SetAlias : ScriptableCustomBuildStep + public sealed class SetAlias : BuildStep { [SerializeField] private string m_alias = default; [SerializeField] private string m_password = default; diff --git a/Editor/Platforms/Android/Pre/SetDebugKeystore.cs b/Editor/Platforms/Android/Pre/SetDebugKeystore.cs index 820b81b..61afdc2 100644 --- a/Editor/Platforms/Android/Pre/SetDebugKeystore.cs +++ b/Editor/Platforms/Android/Pre/SetDebugKeystore.cs @@ -8,7 +8,7 @@ namespace UniTools.Build fileName = nameof(SetDebugKeystore), menuName = MenuPaths.Android + nameof(SetDebugKeystore) )] - public sealed class SetDebugKeystore : ScriptableCustomBuildStep + public sealed class SetDebugKeystore : BuildStep { public override async Task Execute() { diff --git a/Editor/Platforms/Android/Pre/SetKeystorePassword.cs b/Editor/Platforms/Android/Pre/SetKeystorePassword.cs index 5369020..1f95fdb 100644 --- a/Editor/Platforms/Android/Pre/SetKeystorePassword.cs +++ b/Editor/Platforms/Android/Pre/SetKeystorePassword.cs @@ -8,7 +8,7 @@ namespace UniTools.Build fileName = nameof(SetKeystorePassword), menuName = MenuPaths.Android + nameof(SetKeystorePassword) )] - public sealed class SetKeystorePassword : ScriptableCustomBuildStep + public sealed class SetKeystorePassword : BuildStep { [SerializeField] private string m_password = default; diff --git a/Editor/Platforms/Standalone/Build/BuildMacOS.cs b/Editor/Platforms/Standalone/Build/BuildMacOS.cs index e911dfe..809a507 100644 --- a/Editor/Platforms/Standalone/Build/BuildMacOS.cs +++ b/Editor/Platforms/Standalone/Build/BuildMacOS.cs @@ -16,7 +16,7 @@ namespace UniTools.Build fileName = nameof(BuildMacOS), menuName = MenuPaths.Standalone + nameof(BuildMacOS) )] - public sealed class BuildMacOS : ScriptableBuildStepWithOptions + public sealed class BuildMacOS : UnityBuildStepWithOptions { #if UNITY_EDITOR_OSX diff --git a/Editor/Platforms/Standalone/Build/BuildWindows.cs b/Editor/Platforms/Standalone/Build/BuildWindows.cs index f59278a..c11542f 100644 --- a/Editor/Platforms/Standalone/Build/BuildWindows.cs +++ b/Editor/Platforms/Standalone/Build/BuildWindows.cs @@ -10,7 +10,7 @@ namespace UniTools.Build fileName = nameof(BuildWindows), menuName = MenuPaths.Standalone + nameof(BuildWindows) )] - public sealed class BuildWindows : ScriptableBuildStepWithOptions + public sealed class BuildWindows : UnityBuildStepWithOptions { public override BuildTarget Target => BuildTarget.StandaloneWindows; diff --git a/Editor/Platforms/Standalone/Build/BuildWindows64.cs b/Editor/Platforms/Standalone/Build/BuildWindows64.cs index 2aae344..d8c85fa 100644 --- a/Editor/Platforms/Standalone/Build/BuildWindows64.cs +++ b/Editor/Platforms/Standalone/Build/BuildWindows64.cs @@ -10,7 +10,7 @@ namespace UniTools.Build fileName = nameof(BuildWindows64), menuName = MenuPaths.Standalone + nameof(BuildWindows64) )] - public sealed class BuildWindows64 : ScriptableBuildStepWithOptions + public sealed class BuildWindows64 : UnityBuildStepWithOptions { public override BuildTarget Target => BuildTarget.StandaloneWindows64; diff --git a/Editor/Platforms/WebGL/BuildWebGL.cs b/Editor/Platforms/WebGL/BuildWebGL.cs index 460bf75..5ea4053 100644 --- a/Editor/Platforms/WebGL/BuildWebGL.cs +++ b/Editor/Platforms/WebGL/BuildWebGL.cs @@ -14,7 +14,7 @@ namespace UniTools.Build fileName = nameof(BuildWebGL), menuName = MenuPaths.WebGL + nameof(BuildWebGL) )] - public sealed class BuildWebGL : ScriptableBuildStepWithOptions + public sealed class BuildWebGL : UnityBuildStepWithOptions { #if UNITY_WEBGL [SerializeField] private CodeOptimization m_codeOptimization = CodeOptimization.Size; diff --git a/Editor/Platforms/iOS/Steps/Archive/Archive.cs b/Editor/Platforms/iOS/Steps/Archive/Archive.cs index 0033dbc..536d1ae 100644 --- a/Editor/Platforms/iOS/Steps/Archive/Archive.cs +++ b/Editor/Platforms/iOS/Steps/Archive/Archive.cs @@ -3,7 +3,7 @@ namespace UniTools.Build { - public abstract class Archive : ScriptableCustomBuildStep + public abstract class Archive : BuildStep { [SerializeField] private PathProperty m_projectPath = new PathProperty("Unity-iPhone.xcodeproj"); [SerializeField] private PathProperty m_outputPath = new PathProperty("Unity-iPhone.xcarchive"); diff --git a/Editor/Platforms/iOS/Steps/Build/BuildXCode.cs b/Editor/Platforms/iOS/Steps/Build/BuildXCode.cs index 7972514..9deb25b 100644 --- a/Editor/Platforms/iOS/Steps/Build/BuildXCode.cs +++ b/Editor/Platforms/iOS/Steps/Build/BuildXCode.cs @@ -10,7 +10,7 @@ namespace UniTools.Build fileName = nameof(BuildXCode), menuName = MenuPaths.IOS + nameof(BuildXCode) )] - public sealed class BuildXCode : ScriptableBuildStepWithOptions + public sealed class BuildXCode : UnityBuildStepWithOptions { [SerializeField] private bool m_symlinkUnityLibraries = true; [SerializeField] private bool m_tryAppend = true; diff --git a/Editor/Platforms/iOS/Steps/Distribute/DistributeIosApplicationStep.cs b/Editor/Platforms/iOS/Steps/Distribute/DistributeIosApplicationStep.cs index 1e090e4..025d038 100644 --- a/Editor/Platforms/iOS/Steps/Distribute/DistributeIosApplicationStep.cs +++ b/Editor/Platforms/iOS/Steps/Distribute/DistributeIosApplicationStep.cs @@ -6,7 +6,7 @@ namespace UniTools.Build { - public abstract class DistributeIosApplicationStep : ScriptableCustomBuildStep + public abstract class DistributeIosApplicationStep : BuildStep { [SerializeField, Tooltip("Can be found at Apple Developer Console")] private string m_teamId = string.Empty; [SerializeField] private string m_provisioningProfileName = default; diff --git a/Editor/Platforms/iOS/Steps/Plist/ModifyInfoPlist.cs b/Editor/Platforms/iOS/Steps/Plist/ModifyInfoPlist.cs index bd2ed77..6763405 100644 --- a/Editor/Platforms/iOS/Steps/Plist/ModifyInfoPlist.cs +++ b/Editor/Platforms/iOS/Steps/Plist/ModifyInfoPlist.cs @@ -15,7 +15,7 @@ namespace UniTools.Build fileName = nameof(ModifyInfoPlist), menuName = MenuPaths.IOS + nameof(ModifyInfoPlist) )] - public sealed class ModifyInfoPlist : ScriptableCustomBuildStep + public sealed class ModifyInfoPlist : BuildStep { [SerializeField] private PathProperty m_pathToXCodeProject = default; [SerializeField] private BoolPlistElement[] m_bool = default; diff --git a/Editor/Platforms/iOS/Steps/Signing/SetAutomaticSigning.cs b/Editor/Platforms/iOS/Steps/Signing/SetAutomaticSigning.cs index 69bb61c..8f36804 100644 --- a/Editor/Platforms/iOS/Steps/Signing/SetAutomaticSigning.cs +++ b/Editor/Platforms/iOS/Steps/Signing/SetAutomaticSigning.cs @@ -11,7 +11,7 @@ namespace UniTools.Build fileName = nameof(SetAutomaticSigning), menuName = MenuPaths.IOS + nameof(SetAutomaticSigning) )] - public sealed class SetAutomaticSigning : ScriptableCustomBuildStep + public sealed class SetAutomaticSigning : BuildStep { public override async Task Execute() { diff --git a/Editor/Platforms/iOS/Steps/Signing/SetManualProvisionProfile.cs b/Editor/Platforms/iOS/Steps/Signing/SetManualProvisionProfile.cs index 5bed64b..062b029 100644 --- a/Editor/Platforms/iOS/Steps/Signing/SetManualProvisionProfile.cs +++ b/Editor/Platforms/iOS/Steps/Signing/SetManualProvisionProfile.cs @@ -8,7 +8,7 @@ namespace UniTools.Build fileName = nameof(SetManualProvisionProfile), menuName = MenuPaths.IOS + nameof(SetManualProvisionProfile) )] - public sealed class SetManualProvisionProfile : ScriptableCustomBuildStep + public sealed class SetManualProvisionProfile : BuildStep { [SerializeField] private string m_name = string.Empty; [SerializeField] private string m_id = string.Empty; diff --git a/Editor/Platforms/iOS/Steps/Signing/SetTeamId.cs b/Editor/Platforms/iOS/Steps/Signing/SetTeamId.cs index 755a4f7..f3b9ff9 100644 --- a/Editor/Platforms/iOS/Steps/Signing/SetTeamId.cs +++ b/Editor/Platforms/iOS/Steps/Signing/SetTeamId.cs @@ -11,7 +11,7 @@ namespace UniTools.Build fileName = nameof(SetTeamId), menuName = MenuPaths.IOS + nameof(SetTeamId) )] - public sealed class SetTeamId : ScriptableCustomBuildStep + public sealed class SetTeamId : BuildStep { [SerializeField] private string m_teamId = default; diff --git a/Editor/Versioning/Semantic/Steps/Pre/ChangeSemanticVersionStep.cs b/Editor/Versioning/Semantic/Steps/Pre/ChangeSemanticVersionStep.cs index f46cc4f..b4f700b 100644 --- a/Editor/Versioning/Semantic/Steps/Pre/ChangeSemanticVersionStep.cs +++ b/Editor/Versioning/Semantic/Steps/Pre/ChangeSemanticVersionStep.cs @@ -3,7 +3,7 @@ namespace UniTools.Build { - public abstract class ChangeSemanticVersionStep : ScriptableCustomBuildStep + public abstract class ChangeSemanticVersionStep : BuildStep { protected Version Load() { diff --git a/package.json b/package.json index 5e77f72..fbfbd65 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "displayName": "UniTools.Build", "name": "com.unitools.build", - "version": "0.0.17-preview", + "version": "0.1.0-preview", "unity": "2019.1", "description": "Customizable Build Pipeline for Unity3D", "keywords": [