public async Task Run() { _projectTemplateName = _configService.AppSettings.GetValue <string>("Template:Name"); _logger.LogInformation("Running project: " + _projectTemplateName); // List files within the project templates directory _projectTemplateFiles = await _fileService.TraverseDirectory(Path.Combine("Templates", "Projects", _projectTemplateName)); _projectTemplateFiles = _projectTemplateFiles.Select(x => x.Replace('\\', '/')).ToList(); // Search for template settings foreach (string projectTemplateFile in _projectTemplateFiles) { if (_projectTemplateSettings != null) { continue; } if (projectTemplateFile.EndsWith("templatesettings.json")) { string templateSettingsJson = await _fileService.Read(projectTemplateFile); if (!string.IsNullOrEmpty(templateSettingsJson)) { _projectTemplateSettings = JsonConvert.DeserializeObject <CodeGenTemplateSettings>(templateSettingsJson); _projectTemplateSettings.TemplatePath = Path.GetDirectoryName(projectTemplateFile); } } } // Template settings not found if (_projectTemplateSettings == null) { _logger.LogInformation($"Project template settings not found for: {_projectTemplateName}"); return; } // Output project path _outputProjectPath = Path.Combine( "_Output", _projectTemplateSettings.TemplatePath ); _outputProjectPath = _outputProjectPath.Replace('\\', '/').Replace("Templates/", ""); }
public async Task Generate() { _projectTemplateName = _configService.AppSettings.GetValue <string>("Template:Name"); _logger.LogInformation("Generating project from template: " + _projectTemplateName); // List files within the project templates directory _projectTemplateFiles = await _fileService.TraverseDirectory(Path.Combine("Templates", "Projects", _projectTemplateName)); _projectTemplateFiles = _projectTemplateFiles.Select(x => x.Replace('\\', '/')).ToList(); // Search for template settings foreach (string projectTemplateFile in _projectTemplateFiles) { if (_projectTemplateSettings != null) { continue; } if (projectTemplateFile.EndsWith("templatesettings.json")) { string templateSettingsJson = await _fileService.Read(projectTemplateFile); if (!string.IsNullOrEmpty(templateSettingsJson)) { _projectTemplateSettings = JsonConvert.DeserializeObject <CodeGenTemplateSettings>(templateSettingsJson); _projectTemplateSettings.TemplatePath = Path.GetDirectoryName(projectTemplateFile); } } } // Template settings not found if (_projectTemplateSettings == null) { _logger.LogInformation($"Project template settings not found for: {_projectTemplateName}"); return; } await CleanupProjectOutputDirectory(_projectTemplateName); // Sort files for better generation output _projectTemplateFiles.Sort(); // Filter all template generation files List <string> templateGenerationFiles = new List <string>(); foreach (string projectTemplateFile in _projectTemplateFiles) { string projectTemplateFileName = Path.GetFileName(projectTemplateFile); if (projectTemplateFileName.EndsWith("templatesettings.json") || projectTemplateFileName.EndsWith(".tt") || projectTemplateFileName.EndsWith(".Generated.cs")) { templateGenerationFiles.Add(projectTemplateFile); } } // Also exclude .cs files from .tt files foreach (string projectTemplateFile in _projectTemplateFiles) { string projectTemplateFileName = Path.GetFileName(projectTemplateFile); if (projectTemplateFileName.EndsWith(".cs")) { if (templateGenerationFiles.Any(x => x.Contains(Path.GetFileNameWithoutExtension(projectTemplateFileName) + ".tt"))) { templateGenerationFiles.Add(projectTemplateFile); } } } // Filter excluded files List <string> excludedFiles = new List <string>(); foreach (string projectTemplateFile in _projectTemplateFiles) { string projectTemplateFileName = Path.GetFileName(projectTemplateFile); if (_projectTemplateSettings.Exclude.Any(x => projectTemplateFile.Contains(x))) { excludedFiles.Add(projectTemplateFile); } } // Copy all non template generation files to output foreach (string projectTemplateFile in _projectTemplateFiles) { if (excludedFiles.Contains(projectTemplateFile) || templateGenerationFiles.Contains(projectTemplateFile)) { continue; } string projectTemplateFileName = Path.GetFileName(projectTemplateFile); // File path string filePath = Path.Combine( "_Output", Path.GetDirectoryName(projectTemplateFile), projectTemplateFileName ); filePath = filePath.Replace('\\', '/').Replace("Templates/", ""); // Create output directory if not exists await _fileService.CreateDirectory(Path.GetDirectoryName(filePath)); // Copy file to output directory if newer if (await _fileService.Exists(filePath)) { _logger.LogInformation($"Replace file if newer: " + filePath); await _fileService.CopyIfNewer(projectTemplateFile, filePath); } else { _logger.LogInformation($"Copy file to: " + filePath); await _fileService.Copy(projectTemplateFile, filePath); } } // Generate files with config foreach (CodeGenTemplateSettingsData data in _projectTemplateSettings.ConfigBasedGenerator) { foreach (string projectTemplateFile in _projectTemplateFiles) { if (projectTemplateFile.EndsWith(data.T4Template)) { await GenerateBasedOnConfig(projectTemplateFile, data); } } } // Generate files based on each model foreach (CodeGenTemplateSettingsData data in _projectTemplateSettings.ModelsBasedGenerator) { foreach (string projectTemplateFile in _projectTemplateFiles) { if (projectTemplateFile.EndsWith(data.T4Template)) { await GenerateForEachModel(projectTemplateFile, data); } } } // Output project path _outputProjectPath = Path.Combine( "_Output", _projectTemplateSettings.TemplatePath ); _outputProjectPath = _outputProjectPath.Replace('\\', '/').Replace("Templates/", ""); }