예제 #1
0
 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);
 }
예제 #2
0
        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);
        }
예제 #3
0
        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);
                    }
                }
            }
        }