5 using System.Collections.Generic;
13 #if UNITY_2018_1_OR_NEWER 28 public delegate
void BuildInfoConfigurationMethod(ref
BuildInfo toConfigure);
43 if (OverrideBuildDefaults != null)
45 OverrideBuildDefaults(ref toConfigure);
50 public const string BuildSymbolDebug =
"DEBUG";
51 public const string BuildSymbolRelease =
"RELEASE";
52 public const string BuildSymbolMaster =
"MASTER";
59 #if UNITY_2018_1_OR_NEWER 60 public static event Action<BuildInfo, BuildReport> BuildCompleted;
65 public static event Action<BuildInfo, string> BuildCompleted;
73 BuildTargetGroup buildTargetGroup = GetGroup(buildInfo.
BuildTarget);
74 string oldBuildSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup);
75 if (!
string.IsNullOrEmpty(oldBuildSymbols))
87 if ((buildInfo.
BuildOptions & BuildOptions.Development) == BuildOptions.Development)
97 buildInfo.
BuildOptions |= BuildOptions.Development | BuildOptions.AllowDebugging;
108 BuildTarget oldBuildTarget = EditorUserBuildSettings.activeBuildTarget;
109 BuildTargetGroup oldBuildTargetGroup = GetGroup(oldBuildTarget);
111 EditorUserBuildSettings.SwitchActiveBuildTarget(buildTargetGroup, buildInfo.
BuildTarget);
113 WSAUWPBuildType? oldWSAUWPBuildType = EditorUserBuildSettings.wsaUWPBuildType;
117 EditorUserBuildSettings.wsaUWPBuildType = buildInfo.
WSAUWPBuildType.Value;
120 var oldWSAGenerateReferenceProjects = EditorUserBuildSettings.wsaGenerateReferenceProjects;
127 var oldColorSpace = PlayerSettings.colorSpace;
131 PlayerSettings.colorSpace = buildInfo.
ColorSpace.Value;
136 PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, buildInfo.
BuildSymbols);
142 if (buildInfo.
BuildTarget == BuildTarget.WSAPlayer)
147 OnPreProcessBuild(buildInfo);
149 EditorUtility.DisplayProgressBar(
"Build Pipeline",
"Gathering Build data...", 0.25f);
151 #if UNITY_2018_1_OR_NEWER 152 BuildReport buildReport =
default(BuildReport);
154 string buildReport =
"ERROR";
158 buildReport = BuildPipeline.BuildPlayer(
159 buildInfo.
Scenes.ToArray(),
164 #if UNITY_2018_1_OR_NEWER 165 if (buildReport.summary.result != BuildResult.Succeeded)
167 throw new Exception(
string.Format(
"Build Result: {0}", buildReport.summary.result.ToString()));
170 if (buildReport.StartsWith(
"Error"))
172 throw new Exception(buildReport);
178 OnPostProcessBuild(buildInfo, buildReport);
180 if (buildInfo.
BuildTarget == BuildTarget.WSAPlayer && EditorUserBuildSettings.wsaGenerateReferenceProjects)
185 PlayerSettings.colorSpace = oldColorSpace;
186 PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, oldBuildSymbols);
188 EditorUserBuildSettings.wsaUWPBuildType = oldWSAUWPBuildType.Value;
190 EditorUserBuildSettings.wsaGenerateReferenceProjects = oldWSAGenerateReferenceProjects;
191 EditorUserBuildSettings.SwitchActiveBuildTarget(oldBuildTargetGroup, oldBuildTarget);
197 string[] arguments = Environment.GetCommandLineArgs();
199 buildInfo.IsCommandLine =
true;
201 for (
int i = 0; i < arguments.Length; ++i)
204 if (
string.Equals(arguments[i],
"-duskBuildTarget", StringComparison.InvariantCultureIgnoreCase))
206 buildInfo.BuildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), arguments[++i]);
208 else if (
string.Equals(arguments[i],
"-wsaSDK", StringComparison.InvariantCultureIgnoreCase))
210 string wsaSdkArg = arguments[++i];
212 buildInfo.WSASdk = (WSASDK)Enum.Parse(typeof(WSASDK), wsaSdkArg);
214 else if (
string.Equals(arguments[i],
"-wsaUwpSdk", StringComparison.InvariantCultureIgnoreCase))
216 buildInfo.WSAUwpSdk = arguments[++i];
218 else if (
string.Equals(arguments[i],
"-wsaUWPBuildType", StringComparison.InvariantCultureIgnoreCase))
220 buildInfo.WSAUWPBuildType = (WSAUWPBuildType)Enum.Parse(typeof(WSAUWPBuildType), arguments[++i]);
222 else if (
string.Equals(arguments[i],
"-wsaGenerateReferenceProjects", StringComparison.InvariantCultureIgnoreCase))
224 buildInfo.WSAGenerateReferenceProjects =
bool.Parse(arguments[++i]);
226 else if (
string.Equals(arguments[i],
"-buildOutput", StringComparison.InvariantCultureIgnoreCase))
228 buildInfo.OutputDirectory = arguments[++i];
230 else if (
string.Equals(arguments[i],
"-buildDesc", StringComparison.InvariantCultureIgnoreCase))
232 ParseBuildDescriptionFile(arguments[++i], ref buildInfo);
234 else if (
string.Equals(arguments[i],
"-unityBuildSymbols", StringComparison.InvariantCultureIgnoreCase))
236 string newBuildSymbols = arguments[++i];
237 buildInfo.AppendSymbols(newBuildSymbols.Split(
new[] {
';' }, StringSplitOptions.RemoveEmptyEntries));
247 Scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(scene => scene.path),
250 PostBuildAction = (innerBuildInfo, buildReport) =>
252 #if UNITY_2018_1_OR_NEWER 253 if (buildReport.summary.result != BuildResult.Succeeded)
255 if (!
string.IsNullOrEmpty(buildReport))
258 EditorApplication.Exit(1);
263 RaiseOverrideBuildDefaults(ref buildInfo);
264 ParseBuildCommandLine(ref buildInfo);
265 PerformBuild(buildInfo);
270 Debug.Log(
string.Format(CultureInfo.InvariantCulture,
"Build: Using \"{0}\" as build description", filename));
273 var reader =
new XmlTextReader(filename);
275 while (reader.Read())
277 switch (reader.NodeType)
279 case XmlNodeType.Element:
280 if (
string.Equals(reader.Name,
"SceneList", StringComparison.InvariantCultureIgnoreCase))
283 buildInfo.Scenes = ReadSceneList(reader);
285 else if (
string.Equals(reader.Name,
"CopyList", StringComparison.InvariantCultureIgnoreCase))
288 buildInfo.CopyDirectories = ReadCopyList(reader);
295 private static BuildTargetGroup GetGroup(BuildTarget buildTarget)
299 case BuildTarget.WSAPlayer:
300 return BuildTargetGroup.WSA;
301 case BuildTarget.StandaloneWindows:
302 case BuildTarget.StandaloneWindows64:
303 return BuildTargetGroup.Standalone;
305 return BuildTargetGroup.Unknown;
309 private static IEnumerable<string> ReadSceneList(XmlTextReader reader)
311 var result =
new List<string>();
312 while (reader.Read())
314 switch (reader.NodeType)
316 case XmlNodeType.Element:
317 if (
string.Equals(reader.Name,
"Scene", StringComparison.InvariantCultureIgnoreCase))
319 while (reader.MoveToNextAttribute())
321 if (
string.Equals(reader.Name,
"Name", StringComparison.InvariantCultureIgnoreCase))
323 result.Add(reader.Value);
324 Debug.Log(
string.Format(CultureInfo.InvariantCulture,
"Build: Adding scene \"{0}\"", reader.Value));
330 case XmlNodeType.EndElement:
331 if (
string.Equals(reader.Name,
"SceneList", StringComparison.InvariantCultureIgnoreCase))
342 private static IEnumerable<CopyDirectoryInfo> ReadCopyList(XmlTextReader reader)
344 var result =
new List<CopyDirectoryInfo>();
345 while (reader.Read())
347 switch (reader.NodeType)
349 case XmlNodeType.Element:
350 if (
string.Equals(reader.Name,
"Copy", StringComparison.InvariantCultureIgnoreCase))
352 string source = null;
354 string filter = null;
355 bool recursive =
false;
357 while (reader.MoveToNextAttribute())
359 if (
string.Equals(reader.Name,
"Source", StringComparison.InvariantCultureIgnoreCase))
361 source = reader.Value;
363 else if (
string.Equals(reader.Name,
"Destination", StringComparison.InvariantCultureIgnoreCase))
367 else if (
string.Equals(reader.Name,
"Recursive", StringComparison.InvariantCultureIgnoreCase))
369 recursive = Convert.ToBoolean(reader.Value);
371 else if (
string.Equals(reader.Name,
"Filter", StringComparison.InvariantCultureIgnoreCase))
373 filter = reader.Value;
389 info.Filter = filter;
392 info.Recursive = recursive;
394 Debug.Log(
string.Format(CultureInfo.InvariantCulture,
@"Build: Adding {0}copy ""{1}\{2}"" => ""{3}""", info.Recursive ?
"Recursive " :
"", info.Source, info.Filter, info.Destination ?? info.Source));
401 case XmlNodeType.EndElement:
402 if (
string.Equals(reader.Name,
"CopyList", StringComparison.InvariantCultureIgnoreCase))
413 sourceDirectoryPath = Path.Combine(sourceDirectoryPath, directoryInfo.
Source);
414 destinationDirectoryPath = Path.Combine(destinationDirectoryPath, directoryInfo.
Destination ?? directoryInfo.
Source);
416 Debug.Log(
string.Format(CultureInfo.InvariantCulture,
@"{0} ""{1}\{2}"" to ""{3}""", directoryInfo.
Recursive ?
"Recursively copying" :
"Copying", sourceDirectoryPath, directoryInfo.
Filter, destinationDirectoryPath));
418 foreach (
string sourceFilePath
in Directory.GetFiles(sourceDirectoryPath, directoryInfo.Filter, directoryInfo.Recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly))
420 string destinationFilePath = sourceFilePath.Replace(sourceDirectoryPath, destinationDirectoryPath);
423 Directory.CreateDirectory(Path.GetDirectoryName(destinationFilePath));
424 if (File.Exists(destinationFilePath))
426 File.SetAttributes(destinationFilePath, FileAttributes.Normal);
428 File.Copy(sourceFilePath, destinationFilePath,
true);
429 File.SetAttributes(destinationFilePath, FileAttributes.Normal);
431 catch (Exception exception)
433 Debug.LogError(
string.Format(CultureInfo.InvariantCulture,
"Failed to copy \"{0}\" to \"{1}\" with \"{2}\"", sourceFilePath, destinationFilePath, exception));
438 private static void OnPreProcessBuild(
BuildInfo buildInfo)
441 BuildStarted.RaiseEvent(buildInfo);
451 #if UNITY_2018_1_OR_NEWER 452 private static void OnPostProcessBuild(
BuildInfo buildInfo, BuildReport buildReport)
454 if (buildReport.summary.result == BuildResult.Succeeded)
456 private static void OnPostProcessBuild(
BuildInfo buildInfo,
string buildReport)
458 if (
string.IsNullOrEmpty(buildReport))
461 string outputProjectDirectoryPath = Path.Combine(GetProjectPath(), buildInfo.
OutputDirectory);
464 string inputProjectDirectoryPath = GetProjectPath();
467 CopyDirectory(inputProjectDirectoryPath, outputProjectDirectoryPath, directory);
473 BuildCompleted.RaiseEvent(buildInfo, buildReport);
484 return Path.GetDirectoryName(Path.GetFullPath(Application.dataPath));
This class is designed to post process the UWP Assembly-CSharp projects to ensure that the defaults a...
static void Execute(string buildRootPath)
Executes the Post Processes on the C# Projects generated as part of the UWP build.