示例#1
0
        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/", "");
        }
示例#2
0
        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/", "");
        }