public void Build(out int successCount, out int errorCount) { var projectDirectory = Directory.GetCurrentDirectory(); var outputPath = Path.GetFullPath(Path.Combine(projectDirectory, OutputDir)); var intermediatePath = Path.GetFullPath(Path.Combine(projectDirectory, IntermediateDir)); _manager = new PipelineManager(projectDirectory, outputPath, intermediatePath); _manager.Logger = new ConsoleLogger(); // Feed all the assembly references to the pipeline manager // so it can resolve importers, processors, writers, and types. foreach (var r in References) { _manager.AddAssembly(r); } // Load the previously serialized list of built content. var contentFile = Path.Combine(intermediatePath, PipelineBuildEvent.Extension); var previousContent = SourceFileCollection.Read(contentFile); // If the target changed in any way then we need to force // a fuull rebuild even under incremental builds. var targetChanged = previousContent.Config != Config || previousContent.Platform != Platform || previousContent.Profile != Profile; // First clean previously built content. foreach (var sourceFile in previousContent.SourceFiles) { var inContent = _content.Any(e => string.Equals(e.SourceFile, sourceFile, StringComparison.InvariantCultureIgnoreCase)); var cleanOldContent = !inContent && !Incremental; var cleanRebuiltContent = inContent && (Rebuild || Clean); if (cleanRebuiltContent || cleanOldContent || targetChanged) { _manager.CleanContent(sourceFile); } } var newContent = new SourceFileCollection { Profile = _manager.Profile = Profile, Platform = _manager.Platform = Platform, Config = _manager.Config = Config }; errorCount = 0; successCount = 0; foreach (var c in _content) { try { _manager.BuildContent(c.SourceFile, null, c.Importer, c.Processor, c.ProcessorParams); newContent.SourceFiles.Add(c.SourceFile); ++successCount; } catch (PipelineException ex) { Console.Error.WriteLine("{0}: error: {1}", c.SourceFile, ex.Message); ++errorCount; } } // If this is an incremental build we merge the list // of previous content with the new list. if (Incremental && !targetChanged) { newContent.Merge(previousContent); } // Delete the old file and write the new content // list if we have any to serialize. FileHelper.DeleteIfExists(contentFile); if (newContent.SourceFiles.Count > 0) { newContent.Write(contentFile); } }
public void Build(out int successCount, out int errorCount) { var projectDirectory = PathHelper.Normalize(Directory.GetCurrentDirectory()); var outputPath = ReplaceSymbols(OutputDir); if (!Path.IsPathRooted(outputPath)) { outputPath = PathHelper.Normalize(Path.GetFullPath(Path.Combine(projectDirectory, outputPath))); } var intermediatePath = ReplaceSymbols(IntermediateDir); if (!Path.IsPathRooted(intermediatePath)) { intermediatePath = PathHelper.Normalize(Path.GetFullPath(Path.Combine(projectDirectory, intermediatePath))); } _manager = new PipelineManager(projectDirectory, outputPath, intermediatePath); _manager.Logger = new ConsoleLogger(); _manager.CompressContent = CompressContent; // If the intent is to debug build, break at the original location // of any exception, eg, within the actual importer/processor. if (LaunchDebugger) { _manager.RethrowExceptions = false; } // Feed all the assembly references to the pipeline manager // so it can resolve importers, processors, writers, and types. foreach (var r in References) { var assembly = r; if (!Path.IsPathRooted(assembly)) { assembly = Path.GetFullPath(Path.Combine(projectDirectory, assembly)); } _manager.AddAssembly(assembly); } // Load the previously serialized list of built content. var contentFile = Path.Combine(intermediatePath, PipelineBuildEvent.Extension); var previousContent = SourceFileCollection.Read(contentFile); // If the target changed in any way then we need to force // a fuull rebuild even under incremental builds. var targetChanged = previousContent.Config != Config || previousContent.Platform != Platform || previousContent.Profile != Profile; // First clean previously built content. foreach (var sourceFile in previousContent.SourceFiles) { var inContent = _content.Any(e => string.Equals(e.SourceFile, sourceFile, StringComparison.InvariantCultureIgnoreCase)); var cleanOldContent = !inContent && !Incremental; var cleanRebuiltContent = inContent && (Rebuild || Clean); if (cleanRebuiltContent || cleanOldContent || targetChanged) { _manager.CleanContent(sourceFile); } } var newContent = new SourceFileCollection { Profile = _manager.Profile = Profile, Platform = _manager.Platform = Platform, Config = _manager.Config = Config }; errorCount = 0; successCount = 0; // Before building the content, register all files to be built. (Necessary to // correctly resolve external references.) foreach (var c in _content) { try { _manager.RegisterContent(c.SourceFile, null, c.Importer, c.Processor, c.ProcessorParams); } catch { // Ignore exception. Exception will be handled below. } } foreach (var c in _content) { try { _manager.BuildContent(c.SourceFile, null, c.Importer, c.Processor, c.ProcessorParams); newContent.SourceFiles.Add(c.SourceFile); ++successCount; } catch (InvalidContentException ex) { var message = string.Empty; if (ex.ContentIdentity != null && !string.IsNullOrEmpty(ex.ContentIdentity.SourceFilename)) { message = ex.ContentIdentity.SourceFilename; if (!string.IsNullOrEmpty(ex.ContentIdentity.FragmentIdentifier)) { message += "(" + ex.ContentIdentity.FragmentIdentifier + ")"; } message += ": "; } message += ex.Message; Console.WriteLine(message); ++errorCount; } catch (PipelineException ex) { Console.Error.WriteLine("{0}: error: {1}", c.SourceFile, ex.Message); if (ex.InnerException != null) { Console.Error.WriteLine(ex.InnerException.ToString()); } ++errorCount; } catch (Exception ex) { Console.Error.WriteLine("{0}: error: {1}", c.SourceFile, ex.Message); if (ex.InnerException != null) { Console.Error.WriteLine(ex.InnerException.ToString()); } ++errorCount; } } // If this is an incremental build we merge the list // of previous content with the new list. if (Incremental && !targetChanged) { newContent.Merge(previousContent); } // Delete the old file and write the new content // list if we have any to serialize. FileHelper.DeleteIfExists(contentFile); if (newContent.SourceFiles.Count > 0) { newContent.Write(contentFile); } // Process copy items (files that bypass the content pipeline) foreach (var c in _copyItems) { try { // Figure out an asset name relative to the project directory, // retaining the file extension. // Note that replacing a sub-path like this requires consistent // directory separator characters. var relativeName = c.Replace(projectDirectory, string.Empty) .TrimStart(Path.DirectorySeparatorChar) .TrimStart(Path.AltDirectorySeparatorChar); var dest = Path.Combine(outputPath, relativeName); // Only copy if the source file is newer than the destination. // We may want to provide an option for overriding this, but for // nearly all cases this is the desired behavior. if (File.Exists(dest)) { var srcTime = File.GetLastWriteTimeUtc(c); var dstTime = File.GetLastWriteTimeUtc(dest); if (srcTime <= dstTime) { Console.WriteLine("Skipping {0}", c); continue; } } // Create the destination directory if it doesn't already exist. var destPath = Path.GetDirectoryName(dest); if (!Directory.Exists(destPath)) { Directory.CreateDirectory(destPath); } File.Copy(c, dest, true); // Destination file should not be read-only even if original was. var fileAttr = File.GetAttributes(dest); fileAttr = fileAttr & (~FileAttributes.ReadOnly); File.SetAttributes(dest, fileAttr); ++successCount; } catch (Exception ex) { Console.Error.WriteLine("{0}: error: {1}", c, ex.Message); if (ex.InnerException != null) { Console.Error.WriteLine(ex.InnerException.ToString()); } ++errorCount; } } }
public void Build(out int successCount, out int errorCount) { var projectDirectory = Directory.GetCurrentDirectory(); var outputPath = Path.GetFullPath(Path.Combine(projectDirectory, OutputDir)); var intermediatePath = Path.GetFullPath(Path.Combine(projectDirectory, IntermediateDir)); _manager = new PipelineManager(projectDirectory, outputPath, intermediatePath); // Feed all the assembly references to the pipeline manager // so it can resolve importers, processors, writers, and types. foreach (var r in References) _manager.AddAssembly(r); // Load the previously serialized list of built content. var contentFile = Path.Combine(intermediatePath, PipelineBuildEvent.Extension); var previousContent = SourceFileCollection.Read(contentFile); // If the target changed in any way then we need to force // a fuull rebuild even under incremental builds. var targetChanged = previousContent.Config != Config || previousContent.Platform != Platform || previousContent.Profile != Profile; // First clean previously built content. foreach (var sourceFile in previousContent.SourceFiles) { var inContent = _content.Any(e => string.Equals(e.SourceFile, sourceFile, StringComparison.InvariantCultureIgnoreCase)); var cleanOldContent = !inContent && !Incremental; var cleanRebuiltContent = inContent && (Rebuild || Clean); if (cleanRebuiltContent || cleanOldContent || targetChanged) _manager.CleanContent(sourceFile); } var newContent = new SourceFileCollection { Profile = _manager.Profile = Profile, Platform = _manager.Platform = Platform, Config = _manager.Config = Config }; errorCount = 0; successCount = 0; foreach (var c in _content) { try { _manager.BuildContent(c.SourceFile, null, c.Importer, c.Processor, c.ProcessorParams); newContent.SourceFiles.Add(c.SourceFile); ++successCount; } catch (PipelineException ex) { Console.Error.WriteLine("{0}: error: {1}", c.SourceFile, ex.Message); ++errorCount; } } // If this is an incremental build we merge the list // of previous content with the new list. if (Incremental && !targetChanged) newContent.Merge(previousContent); // Delete the old file and write the new content // list if we have any to serialize. if (File.Exists(contentFile)) File.Delete(contentFile); if (newContent.SourceFiles.Count > 0) newContent.Write(contentFile); }
public void Build(out int successCount, out int errorCount) { var projectDirectory = PathHelper.Normalize(Directory.GetCurrentDirectory()); var outputPath = ReplaceSymbols (OutputDir); if (!Path.IsPathRooted(outputPath)) outputPath = PathHelper.Normalize(Path.GetFullPath(Path.Combine(projectDirectory, outputPath))); var intermediatePath = ReplaceSymbols (IntermediateDir); if (!Path.IsPathRooted(intermediatePath)) intermediatePath = PathHelper.Normalize(Path.GetFullPath(Path.Combine(projectDirectory, intermediatePath))); _manager = new PipelineManager(projectDirectory, outputPath, intermediatePath); _manager.Logger = new ConsoleLogger(); _manager.CompressContent = CompressContent; // If the intent is to debug build, break at the original location // of any exception, eg, within the actual importer/processor. if (LaunchDebugger) _manager.RethrowExceptions = false; // Feed all the assembly references to the pipeline manager // so it can resolve importers, processors, writers, and types. foreach (var r in References) { var assembly = r; if (!Path.IsPathRooted(assembly)) assembly = Path.GetFullPath(Path.Combine(projectDirectory, assembly)); _manager.AddAssembly(assembly); } // Load the previously serialized list of built content. var contentFile = Path.Combine(intermediatePath, PipelineBuildEvent.Extension); var previousContent = SourceFileCollection.Read(contentFile); // If the target changed in any way then we need to force // a fuull rebuild even under incremental builds. var targetChanged = previousContent.Config != Config || previousContent.Platform != Platform || previousContent.Profile != Profile; // First clean previously built content. foreach (var sourceFile in previousContent.SourceFiles) { var inContent = _content.Any(e => string.Equals(e.SourceFile, sourceFile, StringComparison.InvariantCultureIgnoreCase)); var cleanOldContent = !inContent && !Incremental; var cleanRebuiltContent = inContent && (Rebuild || Clean); if (cleanRebuiltContent || cleanOldContent || targetChanged) _manager.CleanContent(sourceFile); } var newContent = new SourceFileCollection { Profile = _manager.Profile = Profile, Platform = _manager.Platform = Platform, Config = _manager.Config = Config }; errorCount = 0; successCount = 0; // Before building the content, register all files to be built. (Necessary to // correctly resolve external references.) foreach (var c in _content) { try { _manager.RegisterContent(c.SourceFile, null, c.Importer, c.Processor, c.ProcessorParams); } catch { // Ignore exception. Exception will be handled below. } } foreach (var c in _content) { try { _manager.BuildContent(c.SourceFile, null, c.Importer, c.Processor, c.ProcessorParams); newContent.SourceFiles.Add(c.SourceFile); ++successCount; } catch (InvalidContentException ex) { var message = string.Empty; if (ex.ContentIdentity != null && !string.IsNullOrEmpty(ex.ContentIdentity.SourceFilename)) { message = ex.ContentIdentity.SourceFilename; if (!string.IsNullOrEmpty(ex.ContentIdentity.FragmentIdentifier)) message += "(" + ex.ContentIdentity.FragmentIdentifier + ")"; message += ": "; } message += ex.Message; Console.WriteLine(message); ++errorCount; } catch (PipelineException ex) { Console.Error.WriteLine("{0}: error: {1}", c.SourceFile, ex.Message); if (ex.InnerException != null) Console.Error.WriteLine(ex.InnerException.ToString()); ++errorCount; } catch (Exception ex) { Console.Error.WriteLine("{0}: error: {1}", c.SourceFile, ex.Message); if (ex.InnerException != null) Console.Error.WriteLine(ex.InnerException.ToString()); ++errorCount; } } // If this is an incremental build we merge the list // of previous content with the new list. if (Incremental && !targetChanged) newContent.Merge(previousContent); // Delete the old file and write the new content // list if we have any to serialize. FileHelper.DeleteIfExists(contentFile); if (newContent.SourceFiles.Count > 0) newContent.Write(contentFile); // Process copy items (files that bypass the content pipeline) foreach (var c in _copyItems) { try { // Figure out an asset name relative to the project directory, // retaining the file extension. // Note that replacing a sub-path like this requires consistent // directory separator characters. var relativeName = c.Replace(projectDirectory, string.Empty) .TrimStart(Path.DirectorySeparatorChar) .TrimStart(Path.AltDirectorySeparatorChar); var dest = Path.Combine(outputPath, relativeName); // Only copy if the source file is newer than the destination. // We may want to provide an option for overriding this, but for // nearly all cases this is the desired behavior. if (File.Exists(dest)) { var srcTime = File.GetLastWriteTimeUtc(c); var dstTime = File.GetLastWriteTimeUtc(dest); if (srcTime <= dstTime) { Console.WriteLine("Skipping {0}", c); continue; } } // Create the destination directory if it doesn't already exist. var destPath = Path.GetDirectoryName(dest); if (!Directory.Exists(destPath)) Directory.CreateDirectory(destPath); File.Copy(c, dest, true); // Destination file should not be read-only even if original was. var fileAttr = File.GetAttributes(dest); fileAttr = fileAttr & (~FileAttributes.ReadOnly); File.SetAttributes(dest, fileAttr); ++successCount; } catch (Exception ex) { Console.Error.WriteLine("{0}: error: {1}", c, ex.Message); if (ex.InnerException != null) Console.Error.WriteLine(ex.InnerException.ToString()); ++errorCount; } } }