public override BuildResult Run(BuildContext context)
        {
            var target = context.GetValue <ClassicSharedData>().BuildTarget;

            if (target == BuildTarget.NoTarget)
            {
                return(context.Failure($"Invalid build target '{target.ToString()}'."));
            }

            if (EditorUserBuildSettings.activeBuildTarget == target)
            {
                return(context.Success());
            }

            var group = UnityEditor.BuildPipeline.GetBuildTargetGroup(target);

            if (EditorUserBuildSettings.SwitchActiveBuildTargetAsync(group, target))
            {
                return(context.Failure($"Editor's active Build Target needed to be switched to {target} (BuildTargetGroup {group}). Please wait for switch to complete and then build again."));
            }
            else
            {
                return(context.Failure($"Editor's active Build Target could not be switched to {target} (BuildTargetGroup {group}). Look in the console or the editor log for additional errors."));
            }
        }
Example #2
0
        public override BuildResult Run(BuildContext context)
        {
            var profile      = context.GetComponentOrDefault <DotsRuntimeBuildProfile>();
            var rootAssembly = context.GetComponentOrDefault <DotsRuntimeRootAssembly>();
            var targetName   = rootAssembly.MakeBeeTargetName(context.BuildConfigurationName);
            var workingDir   = DotsRuntimeRootAssembly.BeeRootDirectory;
            var outputDir    = new DirectoryInfo(BuildStepGenerateBeeFiles.GetFinalOutputDirectory(context, targetName));

            var result = BeeTools.Run(targetName, workingDir, context.BuildProgress);

            WorldExport.GetOrCreateLogDirectoryFrom(targetName).GetFile("BuildLog.txt").WriteAllText(result.Output);
            workingDir.GetFile("runbuild" + ShellScriptExtension()).UpdateAllText(result.Command);

            if (result.Failed)
            {
                return(context.Failure(result.Error));
            }

            if (!string.IsNullOrEmpty(rootAssembly.ProjectName))
            {
                var outputTargetFile = outputDir.GetFile(rootAssembly.ProjectName + profile.Target.ExecutableExtension);
                context.SetBuildArtifact(new DotsRuntimeBuildArtifact {
                    OutputTargetFile = outputTargetFile
                });
            }

            return(context.Success());
        }
Example #3
0
 public override BuildResult Run(BuildContext context)
 {
     if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())
     {
         return(context.Failure($"All Scenes and Assets must be saved before a build can be started."));
     }
     return(context.Success());
 }
Example #4
0
 BuildResult FindProperty(BuildContext context, SerializedObject serializedObject, string name, out SerializedProperty serializedProperty)
 {
     serializedProperty = serializedObject.FindProperty(name);
     if (serializedProperty == null)
     {
         return(context.Failure($"Failed to find: {name}"));
     }
     return(context.Success());
 }
        public override BuildResult Run(BuildContext context)
        {
            var report = context.GetValue<BuildReport>();
            if (report == null)
            {
                return context.Failure($"Could not retrieve {nameof(BuildReport)} from build context.");
            }

            var artifact = context.GetOrCreateBuildArtifact<WindowsArtifact>();
            artifact.OutputTargetFile = new FileInfo(report.summary.outputPath);
            return context.Success();
        }
Example #6
0
 protected override BuildResult OnBuild(BuildContext context) => context.Failure(nameof(TestBuildPipelineBuildFails));
Example #7
0
 public override BuildResult Run(BuildContext context) => context.Failure(nameof(TestBuildStepFails));
Example #8
0
        public override BuildResult Run(BuildContext context)
        {
            var classicSharedData = context.GetValue <ClassicSharedData>();
            var target            = classicSharedData.BuildTarget;

            if (target <= 0)
            {
                return(context.Failure($"Invalid build target '{target.ToString()}'."));
            }
            if (target != EditorUserBuildSettings.activeBuildTarget)
            {
                return(context.Failure($"{nameof(EditorUserBuildSettings.activeBuildTarget)} must be switched before {nameof(BuildPlayerStep)} step."));
            }

            var embeddedScenes = context.GetValue <EmbeddedScenesValue>().Scenes;

            if (embeddedScenes.Length == 0)
            {
                return(context.Failure("There are no scenes to build."));
            }

            var outputPath = context.GetOutputBuildDirectory();

            if (!Directory.Exists(outputPath))
            {
                Directory.CreateDirectory(outputPath);
            }

            string locationPathName;

            if (context.HasValue <LocationInfo>())
            {
                locationPathName = context.GetValue <LocationInfo>().Path;
            }
            else
            {
                var generalSettings = context.GetComponentOrDefault <GeneralSettings>();
                locationPathName = Path.Combine(outputPath, generalSettings.ProductName + ClassicBuildProfile.GetExecutableExtension(target));
            }

            var buildPlayerOptions = new BuildPlayerOptions()
            {
                scenes           = embeddedScenes,
                target           = target,
                locationPathName = locationPathName,
                targetGroup      = UnityEditor.BuildPipeline.GetBuildTargetGroup(target),
            };

            buildPlayerOptions.options = BuildOptions.None;

            foreach (var customizer in classicSharedData.Customizers)
            {
                buildPlayerOptions.options |= customizer.ProvideBuildOptions();
            }

            var extraScriptingDefines = classicSharedData.Customizers.SelectMany(c => c.ProvidePlayerScriptingDefines()).ToArray();

#if UNITY_2020_1_OR_NEWER
            buildPlayerOptions.extraScriptingDefines = extraScriptingDefines;
#else
            if (extraScriptingDefines.Length > 0)
            {
                return(context.Failure("Your build is using player scripting defines, this Unity version doesn't support them, please use Unity version 2020.1 or higher. Defines used:\n" +
                                       string.Join("\n", extraScriptingDefines)));
            }
#endif
            var report = UnityEditor.BuildPipeline.BuildPlayer(buildPlayerOptions);
            context.SetValue(report);

            return(context.FromReport(report));
        }
Example #9
0
        public override BuildResult Run(BuildContext context)
        {
            var classicSharedData = context.GetValue <ClassicSharedData>();
            var target            = classicSharedData.BuildTarget;

            if (target <= 0)
            {
                return(context.Failure($"Invalid build target '{target.ToString()}'."));
            }
            if (target != EditorUserBuildSettings.activeBuildTarget)
            {
                return(context.Failure($"{nameof(EditorUserBuildSettings.activeBuildTarget)} must be switched before {nameof(BuildPlayerStep)} step."));
            }

            var embeddedScenes = context.GetValue <EmbeddedScenesValue>().Scenes;

            if (embeddedScenes.Length == 0)
            {
                return(context.Failure("There are no scenes to build."));
            }

            var outputPath = context.GetOutputBuildDirectory();

            if (!Directory.Exists(outputPath))
            {
                Directory.CreateDirectory(outputPath);
            }

            string locationPathName;

            if (context.HasValue <LocationInfo>())
            {
                locationPathName = context.GetValue <LocationInfo>().Path;
            }
            else
            {
                var generalSettings = context.GetComponentOrDefault <GeneralSettings>();
                locationPathName = Path.Combine(outputPath, generalSettings.ProductName + ClassicBuildProfile.GetExecutableExtension(target));
            }

            var buildPlayerOptions = new BuildPlayerOptions()
            {
                scenes           = embeddedScenes,
                target           = target,
                locationPathName = locationPathName,
                targetGroup      = UnityEditor.BuildPipeline.GetBuildTargetGroup(target),
            };

            buildPlayerOptions.options = BuildOptions.None;

            foreach (var customizer in classicSharedData.Customizers)
            {
                buildPlayerOptions.options |= customizer.ProvideBuildOptions();
            }

            var extraScriptingDefines = classicSharedData.Customizers.SelectMany(c => c.ProvidePlayerScriptingDefines()).ToArray();

            buildPlayerOptions.extraScriptingDefines = extraScriptingDefines;

            var report = UnityEditor.BuildPipeline.BuildPlayer(buildPlayerOptions);

            context.SetValue(report);

            return(report.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded ?
                   context.Success() : context.Failure("See console log for more details."));
        }
Example #10
0
        public override BuildResult Run(BuildContext context)
        {
            var manifest               = context.BuildManifest;
            var rootAssembly           = context.GetComponentOrDefault <DotsRuntimeRootAssembly>();
            var buildScenes            = context.GetComponentOrDefault <SceneList>();
            var targetName             = rootAssembly.MakeBeeTargetName(context.BuildConfigurationName);
            var scenePaths             = buildScenes.GetScenePathsForBuild();
            var buildConfigurationGuid = context.BuildConfigurationAssetGUID;
            var dataDirectory          = WorldExport.GetOrCreateDataDirectoryFrom(rootAssembly.StagingDirectory.Combine(targetName));
            var logsDirectory          = WorldExport.GetOrCreateLogDirectoryFrom(targetName);

            var sceneGuids = scenePaths.SelectMany(scenePath =>
            {
                var guids = EditorEntityScenes.GetSubScenes(AssetDatabaseCompatibility.PathToGUID(scenePath)).ToList();
                guids.Add(AssetDatabaseCompatibility.PathToGUID(scenePath));
                return(guids);
            }).Distinct().ToList();

            //Save all unsaved scenes of the project first
            foreach (var guid in sceneGuids)
            {
                string scenePath = AssetDatabase.GUIDToAssetPath(guid.ToString());
                var    scene     = SceneManager.GetSceneByPath(scenePath);
                EditorSceneManager.SaveScene(scene);
            }

            var requiresRefresh       = false;
            var sceneBuildConfigGuids = new NativeArray <GUID>(sceneGuids.Count, Allocator.TempJob);

            for (int i = 0; i != sceneBuildConfigGuids.Length; i++)
            {
                sceneBuildConfigGuids[i] = SceneWithBuildConfigurationGUIDs.EnsureExistsFor(sceneGuids[i], new Hash128(buildConfigurationGuid), false, out var thisRequiresRefresh);
                requiresRefresh         |= thisRequiresRefresh;
            }
            if (requiresRefresh)
            {
                AssetDatabase.Refresh();
            }

            var artifactHashes = new NativeArray <UnityEngine.Hash128>(sceneGuids.Count, Allocator.TempJob);

            AssetDatabaseCompatibility.ProduceArtifactsRefreshIfNecessary(sceneBuildConfigGuids, typeof(SubSceneImporter), artifactHashes);

            bool succeeded = true;

            for (int i = 0; i != sceneBuildConfigGuids.Length; i++)
            {
                var sceneGuid    = sceneGuids[i];
                var artifactHash = artifactHashes[i];

                AssetDatabaseCompatibility.GetArtifactPaths(artifactHash, out var artifactPaths);

                List <FileInfo> exportedFiles     = new List <FileInfo>();
                bool            foundEntityHeader = false;
                foreach (var artifactPath in artifactPaths)
                {
                    var ext = Path.GetExtension(artifactPath).ToLower().Replace(".", "");
                    if (ext == EntityScenesPaths.GetExtension(EntityScenesPaths.PathType.EntitiesHeader))
                    {
                        foundEntityHeader = true;
                        var destinationFile = dataDirectory.FullName + Path.DirectorySeparatorChar + EntityScenesPaths.RelativePathFolderFor(sceneGuid, EntityScenesPaths.PathType.EntitiesHeader, -1);
                        new NPath(artifactPath).MakeAbsolute().Copy(new NPath(destinationFile).MakeAbsolute().EnsureParentDirectoryExists());
                        exportedFiles.Add(new FileInfo(destinationFile));
                    }
                    else if (ext == EntityScenesPaths.GetExtension(EntityScenesPaths.PathType.EntitiesBinary))
                    {
                        var destinationFile = dataDirectory.FullName + Path.DirectorySeparatorChar + EntityScenesPaths.RelativePathFolderFor(sceneGuid, EntityScenesPaths.PathType.EntitiesBinary, EntityScenesPaths.GetSectionIndexFromPath(artifactPath));
                        new NPath(artifactPath).MakeAbsolute().Copy(new NPath(destinationFile).MakeAbsolute().EnsureParentDirectoryExists());
                        exportedFiles.Add(new FileInfo(destinationFile));
                    }
                    else if (ext == EntityScenesPaths.GetExtension(EntityScenesPaths.PathType.EntitiesConversionLog))
                    {
                        var destinationFile = logsDirectory.FullName + Path.DirectorySeparatorChar + $"{sceneGuid}.{EntityScenesPaths.GetExtension(EntityScenesPaths.PathType.EntitiesConversionLog)}";
                        new NPath(artifactPath).MakeAbsolute().Copy(new NPath(destinationFile).MakeAbsolute().EnsureParentDirectoryExists());
                        var result = PrintConversionLogToUnityConsole(artifactPath);
                        if (result.HasError || result.HasException)
                        {
                            UnityEngine.Debug.LogError("Failed to export scene: " + Path.GetFileName(AssetDatabase.GUIDToAssetPath(sceneGuid.ToString())));
                            succeeded = false;
                        }
                    }
                    else if (new Hash128(ext).IsValid) //Asset files are exported as {artifactHash}.{assetguid}
                    {
                        var destinationFile = dataDirectory.FullName + Path.DirectorySeparatorChar + ext;
                        new NPath(artifactPath).MakeAbsolute().Copy(new NPath(destinationFile).MakeAbsolute().EnsureParentDirectoryExists());
                        exportedFiles.Add(new FileInfo(destinationFile));
                    }
                }

                if (!foundEntityHeader)
                {
                    Debug.LogError($"Failed to build EntityScene for '{AssetDatabaseCompatibility.GuidToPath(sceneGuid)}'.");
                    succeeded = false;
                }

                //UpdateManifest
                manifest.Add(new Guid(sceneGuid.ToString()), AssetDatabase.GUIDToAssetPath(sceneGuid.ToString()), exportedFiles);
            }

            var catalogPath = Path.Combine(dataDirectory.ToString(), SceneSystem.k_SceneInfoFileName);

            WriteCatalogFile(catalogPath, buildScenes);
            manifest.AddAdditionalFilesToDeploy(new FileInfo(catalogPath.ToString()));

            sceneBuildConfigGuids.Dispose();
            artifactHashes.Dispose();

            if (succeeded)
            {
                return(context.Success());
            }
            return(context.Failure($"Failed to export scenes"));
        }
Example #11
0
        public override BuildResult Run(BuildContext context)
        {
            var exportSettings            = context.GetComponentOrDefault <AndroidExportSettings>();
            var isAppBundle               = exportSettings.TargetType == AndroidTargetType.AndroidAppBundle;
            var classicData               = context.GetValue <ClassicSharedData>();
            var nonIncrementalClassicData = context.GetValue <NonIncrementalClassicSharedData>();
            var gradleJarFile             = GradleTools.GetGradleLauncherJar(classicData.BuildToolsDirectory);
            var gradleTask           = GradleTools.GetGradleTask(classicData.DevelopmentPlayer, isAppBundle);
            var gradleOuputDirectory = Path.Combine(nonIncrementalClassicData.TemporaryDirectory, "gradleOut");
            var gradleFile           = Path.Combine(gradleOuputDirectory, "build.gradle");

#if UNITY_ANDROID
            var jdkPath = AndroidExternalToolsSettings.jdkRootPath;
#else
            var jdkPath = "";
#endif

            var fileName = Path.Combine(jdkPath, "bin", "java" + (Application.platform == RuntimePlatform.WindowsEditor ? ".exe" : ""));
            var args     = string.Join(" ",
                                       new[]
            {
                "-classpath",
                $"\"{gradleJarFile}\"",
                "org.gradle.launcher.GradleMain",
                "-b",
                $"\"{gradleFile}\"",
                $"\"{gradleTask}\""
            });


            Process process = new Process();
            process.StartInfo.FileName               = fileName;
            process.StartInfo.Arguments              = args;
            process.StartInfo.UseShellExecute        = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError  = true;
            process.StartInfo.CreateNoWindow         = true;
            var output = new StringBuilder();
            process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
            {
                if (!string.IsNullOrEmpty(e.Data))
                {
                    output.AppendLine(e.Data);
                }
            });

            var error = new StringBuilder();
            process.ErrorDataReceived += new DataReceivedEventHandler((sender, e) =>
            {
                if (!string.IsNullOrEmpty(e.Data))
                {
                    error.AppendLine(e.Data);
                }
            });

            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
            process.WaitForExit();

            BuildResult result;
            if (process.ExitCode == 0)
            {
                var outputPath = Path.Combine(gradleOuputDirectory, GradleTools.GetGradleOutputPath(classicData.DevelopmentPlayer, isAppBundle));
                var finalPath  = Path.Combine(context.GetOutputBuildDirectory(), context.GetComponentOrDefault <GeneralSettings>().ProductName + Path.GetExtension(outputPath));
                File.Copy(outputPath, finalPath, true);

                var artifact = context.GetOrCreateBuildArtifact <AndroidArtifact>();
                artifact.OutputTargetFile = new FileInfo(finalPath);

                result = context.Success();
            }
            else
            {
                result = context.Failure(output.ToString() + error.ToString());
            }

            process.Close();

            return(result);
        }