BuildResult BuildProject(Action <ProjectOptions> configure = null) { dc.CheckForTrueChange(); var ctx = new BuildCtx(_compilerPool, false, (_) => { }); var dirCache = dc.TryGetItem(projdir) as IDirectoryCache; var proj = TSProject.Get(dirCache, dc, new DummyLogger(), null); proj.IsRootProject = true; if (proj.ProjectOptions.Tools == null) { proj.ProjectOptions = new ProjectOptions { Tools = _tools, Owner = proj, Defines = new Dictionary <string, bool> { { "DEBUG", true } }, BuildCache = new DummyBuildCache() }; proj.LoadProjectJson(true); proj.ProjectOptions.RefreshMainFile(); proj.ProjectOptions.RefreshTestSources(); proj.ProjectOptions.DetectBobrilJsxDts(); proj.ProjectOptions.RefreshExampleSources(); } configure?.Invoke(proj.ProjectOptions); ctx.TSCompilerOptions = new TSCompilerOptions { sourceMap = true, skipLibCheck = true, skipDefaultLibCheck = true, target = ScriptTarget.Es5, preserveConstEnums = false, jsx = JsxEmit.React, reactNamespace = "b", experimentalDecorators = true, noEmitHelpers = true, allowJs = true, checkJs = false, removeComments = false, types = new string[0], lib = new HashSet <string> { "es5", "dom", "es2015.core", "es2015.promise", "es2015.iterable", "es2015.collection" } }; ctx.Sources = new HashSet <string>(); ctx.Sources.Add(proj.MainFile); proj.ProjectOptions.ExampleSources.ForEach(s => ctx.Sources.Add(s)); if (proj.ProjectOptions.BobrilJsxDts != null) { ctx.Sources.Add(proj.ProjectOptions.BobrilJsxDts); } proj.Build(ctx); return(ctx.BuildResult); }
public void Build(BuildCtx buildCtx) { var buildModuleCtx = new BuildModuleCtx() { _buildCtx = buildCtx, _owner = this, _result = new BuildResult(), ToCheck = new OrderedHashSet <string>(), ToCompile = new OrderedHashSet <string>(), ToCompileDts = new OrderedHashSet <string>() }; ITSCompiler compiler = null; try { ProjectOptions.BuildCache.StartTransaction(); compiler = buildCtx.CompilerPool.GetTs(); compiler.DiskCache = DiskCache; compiler.Ctx = buildModuleCtx; var compOpt = buildCtx.TSCompilerOptions.Clone(); compOpt.rootDir = Owner.FullPath; compOpt.outDir = "_virtual"; compOpt.module = ModuleKind.Commonjs; compOpt.declaration = true; if (!ProjectOptions.TypeScriptVersionOverride && DevDependencies != null && DevDependencies.Contains("typescript")) { ProjectOptions.Tools.SetTypeScriptPath(Owner.FullPath); } else { ProjectOptions.Tools.SetTypeScriptVersion(ProjectOptions.TypeScriptVersion); } compiler.MergeCompilerOptions(compOpt); compiler.MergeCompilerOptions(ProjectOptions.CompilerOptions); var positionIndependentOptions = compiler.CompilerOptions.Clone(); positionIndependentOptions.rootDir = null; var trueTSVersion = compiler.GetTSVersion(); buildCtx.ShowTsVersion(trueTSVersion); ProjectOptions.ConfigurationBuildCacheId = ProjectOptions.BuildCache.MapConfiguration(trueTSVersion, JsonConvert.SerializeObject(positionIndependentOptions, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })); var wasSomeError = false; do { buildModuleCtx.ChangedDts = false; buildModuleCtx.CrawledCount = 0; buildModuleCtx.ToCheck.Clear(); buildModuleCtx.ToCompile.Clear(); buildModuleCtx.ToCompileDts.Clear(); buildModuleCtx.LocalResolveCache.Clear(); ProjectOptions.HtmlHeadExpanded = buildModuleCtx.ExpandHtmlHead(ProjectOptions.HtmlHead); foreach (var src in buildCtx.Sources) { buildModuleCtx.CheckAdd(PathUtils.Join(compOpt.rootDir, src)); } if (ProjectOptions.IncludeSources != null) { foreach (var src in ProjectOptions.IncludeSources) { buildModuleCtx.CheckAdd(PathUtils.Join(compOpt.rootDir, src)); } } buildModuleCtx.Crawl(); if (buildModuleCtx.ToCompile.Count != 0) { if (buildCtx.Verbose) { compiler.MeasurePerformance = true; } var start = DateTime.UtcNow; buildModuleCtx.OutputedJsFiles = 0; buildModuleCtx.OutputedDtsFiles = 0; compiler.CreateProgram(Owner.FullPath, buildModuleCtx.ToCompile.Concat(buildModuleCtx.ToCompileDts).ToArray()); if (!compiler.CompileProgram()) { wasSomeError = true; break; } ProjectOptions.CurrentBuildCommonSourceDirectory = compiler.CommonSourceDirectory; ProjectOptions.CommonSourceDirectory = ProjectOptions.CommonSourceDirectory == null ? compiler.CommonSourceDirectory : PathUtils.CommonDir(ProjectOptions.CommonSourceDirectory, compiler.CommonSourceDirectory); compiler.GatherSourceInfo(); if (ProjectOptions.SpriteGeneration) { ProjectOptions.SpriteGenerator.ProcessNew(); } if (!compiler.EmitProgram()) { wasSomeError = true; break; } buildModuleCtx.UpdateCacheIds(); Logger.Info( $"Compiled Src: {buildModuleCtx.ToCompile.Count} Dts: {buildModuleCtx.ToCompileDts.Count} => Js: {buildModuleCtx.OutputedJsFiles} Dts: {buildModuleCtx.OutputedDtsFiles} in {(DateTime.UtcNow - start).TotalSeconds:F1}s"); buildModuleCtx.ToCompile.Clear(); buildModuleCtx.Crawl(); } } while (buildModuleCtx.ChangedDts || 0 < buildModuleCtx.ToCompile.Count); if (ProjectOptions.BuildCache.IsEnabled && !wasSomeError) { ProjectOptions.StoreResultToBuildCache(buildModuleCtx._result); } buildCtx.BuildResult = buildModuleCtx._result; } finally { if (compiler != null) { buildCtx.CompilerPool.ReleaseTs(compiler); } ProjectOptions.BuildCache.EndTransaction(); } }
public void Build(BuildCtx buildCtx) { var buildModuleCtx = new BuildModuleCtx() { _buildCtx = buildCtx, _owner = this, _result = new BuildResult(), ToCheck = new OrderedHashSet <string>(), ToCompile = new OrderedHashSet <string>(), ToCompileDts = new OrderedHashSet <string>() }; ITSCompiler compiler = null; try { ProjectOptions.BuildCache.StartTransaction(); compiler = buildCtx.CompilerPool.GetTs(); compiler.DiskCache = DiskCache; compiler.Ctx = buildModuleCtx; var compOpt = buildCtx.TSCompilerOptions.Clone(); compOpt.rootDir = Owner.FullPath; compOpt.outDir = "_virtual"; compOpt.module = ModuleKind.CommonJS; compOpt.declaration = true; ProjectOptions.Tools.SetTypeScriptVersion(ProjectOptions.TypeScriptVersion); compiler.MergeCompilerOptions(compOpt); compiler.MergeCompilerOptions(ProjectOptions.CompilerOptions); ProjectOptions.ConfigurationBuildCacheId = ProjectOptions.BuildCache.MapConfiguration(ProjectOptions.TypeScriptVersion, JsonConvert.SerializeObject(compiler.CompilerOptions, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })); do { buildModuleCtx.ChangedDts = false; buildModuleCtx.CrawledCount = 0; buildModuleCtx.TrullyCompiledCount = 0; buildModuleCtx.ToCheck.Clear(); buildModuleCtx.ToCompile.Clear(); buildModuleCtx.ToCompileDts.Clear(); ProjectOptions.HtmlHeadExpanded = buildModuleCtx.ExpandHtmlHead(ProjectOptions.HtmlHead); foreach (var src in buildCtx.Sources) { buildModuleCtx.CheckAdd(PathUtils.Join(compOpt.rootDir, src)); } buildModuleCtx.Crawl(); if (buildModuleCtx.ToCompile.Count != 0) { if (buildCtx.Verbose) { compiler.MeasurePerformance = true; } compiler.CreateProgram(Owner.FullPath, buildModuleCtx.ToCompile.Concat(buildModuleCtx.ToCompileDts).ToArray()); if (!compiler.CompileProgram()) { break; } ProjectOptions.CommonSourceDirectory = compiler.CommonSourceDirectory; compiler.GatherSourceInfo(); if (ProjectOptions.SpriteGeneration) { ProjectOptions.SpriteGenerator.ProcessNew(); } if (!compiler.EmitProgram()) { break; } buildModuleCtx.UpdateCacheIds(); buildModuleCtx.Crawl(); } } while (buildModuleCtx.ChangedDts || buildModuleCtx.TrullyCompiledCount < buildModuleCtx.ToCompile.Count); if (ProjectOptions.BuildCache.IsEnabled) { StoreResultToBuildCache(buildModuleCtx._result); } buildCtx.BuildResult = buildModuleCtx._result; } finally { if (compiler != null) { buildCtx.CompilerPool.ReleaseTs(compiler); } ProjectOptions.BuildCache.EndTransaction(); } }
public void Build(BuildCtx buildCtx, BuildResult buildResult, int iterationId) { var tryDetectChanges = !buildCtx.ProjectStructureChanged; buildResult.HasError = false; if (!buildResult.Incremental || !tryDetectChanges) { buildResult.RecompiledIncrementaly.Clear(); } var buildModuleCtx = new BuildModuleCtx() { BuildCtx = buildCtx, Owner = this, Result = buildResult, ToCheck = new OrderedHashSet <string>(), IterationId = iterationId }; try { ProjectOptions.BuildCache.StartTransaction(); ITSCompiler compiler = null; try { if (!tryDetectChanges) { if (!ProjectOptions.TypeScriptVersionOverride && DevDependencies != null && DevDependencies.Contains("typescript")) { ProjectOptions.Tools.SetTypeScriptPath(Owner.FullPath); } else { ProjectOptions.Tools.SetTypeScriptVersion(ProjectOptions.TypeScriptVersion); } } compiler = buildCtx.CompilerPool.GetTs(DiskCache, buildCtx.CompilerOptions); var trueTSVersion = compiler.GetTSVersion(); buildCtx.ShowTsVersion(trueTSVersion); ProjectOptions.ConfigurationBuildCacheId = ProjectOptions.BuildCache.MapConfiguration(trueTSVersion, JsonConvert.SerializeObject(buildCtx.CompilerOptions, Formatting.None, TSCompilerOptions.GetSerializerSettings())); } finally { if (compiler != null) { buildCtx.CompilerPool.ReleaseTs(compiler); } } if (buildModuleCtx.Result.CommonSourceDirectory == null) { buildModuleCtx.Result.CommonSourceDirectory = Owner.FullPath; } buildResult.TaskForSemanticCheck = buildCtx.StartTypeCheck().ContinueWith((task) => { if (task.IsCompletedSuccessfully) { buildResult.SemanticResult = task.Result; buildResult.NotifySemanticResult(task.Result); } }); if (tryDetectChanges) { if (!buildModuleCtx.CrawlChanges()) { buildResult.Incremental = true; goto noDependencyChangeDetected; } buildCtx.ProjectStructureChanged = true; buildResult.Incremental = false; buildModuleCtx.Result.JavaScriptAssets.Clear(); foreach (var info in buildModuleCtx.Result.Path2FileInfo) { info.Value.IterationId = iterationId - 1; } } buildModuleCtx.CrawledCount = 0; buildModuleCtx.ToCheck.Clear(); ProjectOptions.HtmlHeadExpanded = buildModuleCtx.ExpandHtmlHead(ProjectOptions.HtmlHead); if (buildCtx.MainFile != null) { buildModuleCtx.CheckAdd(PathUtils.Join(Owner.FullPath, buildCtx.MainFile), FileCompilationType.Unknown); } if (buildCtx.ExampleSources != null) { foreach (var src in buildCtx.ExampleSources) { buildModuleCtx.CheckAdd(PathUtils.Join(Owner.FullPath, src), FileCompilationType.Unknown); } } if (buildCtx.TestSources != null) { foreach (var src in buildCtx.TestSources) { buildModuleCtx.CheckAdd(PathUtils.Join(Owner.FullPath, src), FileCompilationType.Unknown); } } if (ProjectOptions.IncludeSources != null) { foreach (var src in ProjectOptions.IncludeSources) { buildModuleCtx.CheckAdd(PathUtils.Join(Owner.FullPath, src), FileCompilationType.Unknown); } } buildModuleCtx.Crawl(); noDependencyChangeDetected :; ProjectOptions.CommonSourceDirectory = buildModuleCtx.Result.CommonSourceDirectory; if (ProjectOptions.SpriteGeneration) { ProjectOptions.SpriteGenerator.ProcessNew(); } var hasError = false; foreach (var item in buildModuleCtx.Result.Path2FileInfo) { if (item.Value.HasError) { hasError = true; break; } } buildModuleCtx.Result.HasError = hasError; if (ProjectOptions.BuildCache.IsEnabled) { buildModuleCtx.StoreResultToBuildCache(buildModuleCtx.Result); } } finally { ProjectOptions.BuildCache.EndTransaction(); } }