private bool CheckRebuild(ProjectCompilingContext context) { return(new AllFilesLastWriteTimeRebuildingTester().CheckRebuild( context.WorkingFolder, context.ToolsFolder, context.CompilingFiles)); }
internal TemplateTransformer(ProjectCompilingContext context) { _context = context; _workingFolder = context.WorkingFolder; _generatedCodeFolder = context.GeneratedCodeFolder; _assembly = context.Assembly; _compilingContext = new CompilingContext(context.Assembly); }
internal void Run(Options options) { // 准备编译环境。 var context = new ProjectCompilingContext(options); // 进行重新编译测试。 var shouldRebuild = CheckRebuild(context); if (!shouldRebuild) { new MSBuildMessage($"dotnetCampus.TelescopeTask:项目已最新,无需导出编译信息。").Message(); return; } // 清除前一次生成的文件。 new MSBuildMessage($"dotnetCampus.TelescopeTask:删除前一次的导出结果…").Message(); PackageDirectory.Delete(context.GeneratedCodeFolder); // 收集并生成类。 new MSBuildMessage($"dotnetCampus.TelescopeTask:正在生成新的编译信息…").Message(); var code = GenerateAttributedTypesExportCode(context.Assembly); if (string.IsNullOrWhiteSpace(code)) { return; } // 将生成的类(编译单元)写入到文件中。 new MSBuildMessage($"dotnetCampus.TelescopeTask:正在写入编译导出文件…").Message(); PackageDirectory.Create(context.GeneratedCodeFolder); var targetFile = Path.Combine(context.GeneratedCodeFolder, "AttributedTypesExport.g.cs"); File.WriteAllText(targetFile, code); // 生成本次运行的摘要。 var resultFile = new FileInfo(Path.Combine(context.WorkingFolder, context.ToolsFolder, "Result.txt")); File.WriteAllText(resultFile.FullName, ""); resultFile.LastAccessTimeUtc = DateTime.UtcNow; }
private void RunCore() { var context = new ProjectCompilingContext(_options); var rebuildRequired = _options.RebuildRequired; var cachedExcludesListFile = Path.Combine(context.ToolsFolder, "Excludes.txt"); // 如果可以差量编译,那么检测之前已经生成的文件,然后将其直接输出。 if (!rebuildRequired && File.Exists(cachedExcludesListFile)) { var cachedExcludeLines = File.ReadAllLines(cachedExcludesListFile, Encoding.UTF8); foreach (var exclude in cachedExcludeLines) { _logger.Message(exclude); } return; } // 分析 IPlainCodeTransformer。 var transformer = new CodeTransformer(context); var excludes = transformer.Transform(); // 分析 CompileTimeTemplate。 var templateTransformer = new TemplateTransformer(context); var templateExcludes = templateTransformer.Transform(); var toExcludes = excludes.Union(templateExcludes) .Select(x => PathEx.MakeRelativePath(context.WorkingFolder, x)).ToArray(); foreach (var exclude in toExcludes) { _logger.Message(exclude); } File.WriteAllLines(cachedExcludesListFile, toExcludes, Encoding.UTF8); }
/// <summary> /// 创建用于转换源码的 <see cref="CodeTransformer"/>。 /// </summary> /// <param name="context">项目工作区上下文信息。</param> internal CodeTransformer(ProjectCompilingContext context) { _workingFolder = context.WorkingFolder; _generatedCodeFolder = context.GeneratedCodeFolder; _assembly = context.Assembly; }