public DocumentBuilder( IEnumerable <Assembly> assemblies, ImmutableArray <string> postProcessorNames, string templateHash, string intermediateFolder = null, string commitFromSHA = null, string commitToSHA = null) { Logger.LogVerbose("Loading plug-in..."); using (new LoggerPhaseScope("ImportPlugins", LogLevel.Verbose)) { var assemblyList = assemblies?.ToList() ?? new List <Assembly>(); assemblyList.Add(typeof(DocumentBuilder).Assembly); _container = CompositionUtility.GetContainer(assemblyList); _container.SatisfyImports(this); _currentBuildInfo.CommitFromSHA = commitFromSHA; _currentBuildInfo.CommitToSHA = commitToSHA; if (intermediateFolder != null) { _currentBuildInfo.PluginHash = ComputePluginHash(assemblyList); _currentBuildInfo.TemplateHash = templateHash; _currentBuildInfo.DirectoryName = IncrementalUtility.CreateRandomDirectory(Environment.ExpandEnvironmentVariables(intermediateFolder)); } } Logger.LogInfo($"{Processors.Count()} plug-in(s) loaded."); foreach (var processor in Processors) { Logger.LogVerbose($"\t{processor.Name} with build steps ({string.Join(", ", from bs in processor.BuildSteps orderby bs.BuildOrder select bs.Name)})"); } _intermediateFolder = intermediateFolder; _lastBuildInfo = BuildInfo.Load(_intermediateFolder); _postProcessorsManager = new PostProcessorsManager(_container, postProcessorNames); }
private static List <PostProcessor> GetPostProcessor(CompositionHost container, ImmutableArray <string> processors) { var processorList = new List <PostProcessor>(); AddBuildInPostProcessor(processorList); foreach (var processor in processors) { var p = CompositionUtility.GetExport <IPostProcessor>(container, processor); if (p != null) { processorList.Add(new PostProcessor { ContractName = processor, Processor = p }); Logger.LogInfo($"Post processor {processor} loaded."); } else { Logger.LogWarning($"Can't find the post processor: {processor}"); } } return(processorList); }
public void Build(IList <DocumentBuildParameters> parameters, string outputDirectory) { if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } if (parameters.Count == 0) { throw new ArgumentException("Parameters are empty.", nameof(parameters)); } var markdownServiceProvider = CompositionUtility.GetExport <IMarkdownServiceProvider>(_container, parameters[0].MarkdownEngineName); if (markdownServiceProvider == null) { Logger.LogError($"Unable to find markdown engine: {parameters[0].MarkdownEngineName}"); throw new DocfxException($"Unable to find markdown engine: {parameters[0].MarkdownEngineName}"); } Logger.LogInfo($"Markdown engine is {parameters[0].MarkdownEngineName}"); _postProcessorsManager.IncrementalInitialize(_intermediateFolder, _currentBuildInfo, _lastBuildInfo, parameters[0].ForcePostProcess); var manifests = new List <Manifest>(); bool transformDocument = false; foreach (var parameter in parameters) { if (parameter.CustomLinkResolver != null) { ICustomHrefGenerator chg; if (_container.TryGetExport(parameter.CustomLinkResolver, out chg)) { parameter.ApplyTemplateSettings.HrefGenerator = chg; } else { Logger.LogWarning($"Custom href generator({parameter.CustomLinkResolver}) is not found."); } } EnvironmentContext.FileAbstractLayerImpl = FileAbstractLayerBuilder.Default .ReadFromRealFileSystem(EnvironmentContext.BaseDirectory) .WriteToRealFileSystem(parameter.OutputBaseDir) .Create(); if (parameter.Files.Count == 0) { Logger.LogWarning(string.IsNullOrEmpty(parameter.VersionName) ? "No files found, nothing is generated in default version." : $"No files found, nothing is generated in version \"{parameter.VersionName}\"."); manifests.Add(new Manifest()); continue; } if (parameter.ApplyTemplateSettings.TransformDocument) { transformDocument = true; } parameter.Metadata = _postProcessorsManager.PrepareMetadata(parameter.Metadata); if (!string.IsNullOrEmpty(parameter.VersionName)) { Logger.LogInfo($"Start building for version: {parameter.VersionName}"); } manifests.Add(BuildCore(parameter, markdownServiceProvider)); } EnvironmentContext.FileAbstractLayerImpl = FileAbstractLayerBuilder.Default .ReadFromRealFileSystem(parameters[0].OutputBaseDir) .WriteToRealFileSystem(parameters[0].OutputBaseDir) .Create(); var generatedManifest = ManifestUtility.MergeManifest(manifests); ManifestUtility.RemoveDuplicateOutputFiles(generatedManifest.Files); using (new PerformanceScope("Process")) { _postProcessorsManager.Process(generatedManifest, outputDirectory); } using (new PerformanceScope("SaveManifest")) { // Save to manifest.json EnvironmentContext.FileAbstractLayerImpl = FileAbstractLayerBuilder.Default .ReadFromRealFileSystem(parameters[0].OutputBaseDir) .WriteToRealFileSystem(parameters[0].OutputBaseDir) .Create(); SaveManifest(generatedManifest); } using (new PerformanceScope("Cleanup")) { EnvironmentContext.FileAbstractLayerImpl = null; // overwrite intermediate cache files if (_intermediateFolder != null && transformDocument) { _currentBuildInfo.Save(_intermediateFolder); if (_lastBuildInfo != null) { Directory.Delete(Path.Combine(Environment.ExpandEnvironmentVariables(_intermediateFolder), _lastBuildInfo.DirectoryName), true); } } } }