Beispiel #1
0
 private bool CheckRebuild(ProjectCompilingContext context)
 {
     return(new AllFilesLastWriteTimeRebuildingTester().CheckRebuild(
                context.WorkingFolder,
                context.ToolsFolder,
                context.CompilingFiles));
 }
Beispiel #2
0
 internal TemplateTransformer(ProjectCompilingContext context)
 {
     _context             = context;
     _workingFolder       = context.WorkingFolder;
     _generatedCodeFolder = context.GeneratedCodeFolder;
     _assembly            = context.Assembly;
     _compilingContext    = new CompilingContext(context.Assembly);
 }
Beispiel #3
0
        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;
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 /// <summary>
 /// 创建用于转换源码的 <see cref="CodeTransformer"/>。
 /// </summary>
 /// <param name="context">项目工作区上下文信息。</param>
 internal CodeTransformer(ProjectCompilingContext context)
 {
     _workingFolder       = context.WorkingFolder;
     _generatedCodeFolder = context.GeneratedCodeFolder;
     _assembly            = context.Assembly;
 }