예제 #1
0
        private async Task <int> HandleAndReturnExitCodeAsync(CreateOptions options)
        {
            if (options.UnitTest)
            {
                options.ProjectType += "UnitTest";
            }

            if (!(await _projectGeneratorFactory.SupportsProjectType(options.ProjectType)))
            {
                _logger.Warn("Project type {ProjectType} not supported.", options.ProjectType);
                return(-1);
            }

            _projectDirectoryProvider.SolutionDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, options.Name);
            _logger.Info($"Generating solution directory \"{options.Name}\".");
            _directoryManipulator.CreateDirectory(_projectDirectoryProvider.SolutionDirectory);

            IProjectGenerator projectGenerator = _projectGeneratorFactory.CreateGeneratorFor(options.ProjectType);

            try
            {
                await projectGenerator.GenerateProject(options.Name);

                if (options.InitGit)
                {
                    projectGenerator.InitGit();

                    if (options.UseGitMetadata)
                    {
                        await projectGenerator.AddGitMetadata();
                    }

                    if (options.ReadmeDescription != null)
                    {
                        projectGenerator.AddReadme(options.Name, options.ReadmeDescription);
                    }

                    if (options.CommitMessage != null)
                    {
                        projectGenerator.Commit(options.CommitMessage);
                    }

                    if (options.GitRemote != null)
                    {
                        projectGenerator.AddRemote(options.GitRemote);

                        if (options.Push)
                        {
                            projectGenerator.Push();
                        }
                    }
                }
            }
            catch (Exception)
            {
                _logger.Error("An error ocurred during project generation.");
            }

            return(0);
        }
예제 #2
0
        public ActionResult GetProjectArchive([FromQuery] ProjectSpec spec)
        {
            var config         = _configService.GetInitializrConfig();
            var defaults       = config.ProjectMetadata;
            var normalizedSpec = new ProjectSpec()
            {
                Name            = spec.Name ?? defaults?.Name?.Default,
                Description     = spec.Description ?? defaults?.Description?.Default,
                Namespace       = spec.Namespace ?? defaults?.Namespace?.Default,
                SteeltoeVersion = spec.SteeltoeVersion ?? defaults?.SteeltoeVersion?.Default,
                DotNetFramework = spec.DotNetFramework ?? defaults?.DotNetFramework?.Default,
                DotNetTemplate  = spec.DotNetTemplate ?? defaults?.DotNetTemplate?.Default,
                Language        = spec.Language ?? defaults?.Language?.Default,
                Packaging       = spec.Packaging ?? defaults?.Packaging?.Default,
                Dependencies    = spec.Dependencies ?? defaults?.Dependencies?.Default,
            };

            if (normalizedSpec.Packaging is null)
            {
                return(StatusCode(
                           StatusCodes.Status500InternalServerError,
                           "Default packaging not configured."));
            }

            var archiver = _archiverRegistry.Lookup(normalizedSpec.Packaging);

            if (archiver is null)
            {
                return(NotFound($"Packaging '{normalizedSpec.Packaging}' not found."));
            }

            if (normalizedSpec.Dependencies != null)
            {
                var caseSensitiveDeps = new List <string>();
                if (config.ProjectMetadata?.Dependencies?.Values != null)
                {
                    foreach (var group in config.ProjectMetadata.Dependencies.Values)
                    {
                        foreach (var dep in group.Values)
                        {
                            caseSensitiveDeps.Add(dep.Id);
                        }
                    }
                }

                var deps = normalizedSpec.Dependencies.Split(',');
                for (int i = 0; i < deps.Length; ++i)
                {
                    var found = false;
                    foreach (var caseSensitiveDep in caseSensitiveDeps)
                    {
                        if (caseSensitiveDep.Equals(deps[i], StringComparison.OrdinalIgnoreCase))
                        {
                            deps[i] = caseSensitiveDep;
                            found   = true;
                        }
                    }

                    if (!found)
                    {
                        return(NotFound($"Dependency '{deps[i]}' not found."));
                    }
                }

                normalizedSpec.Dependencies = string.Join(',', deps);
            }

            Logger.LogDebug("Project specification: {ProjectSpec}", normalizedSpec);
            var project = _projectGenerator.GenerateProject(normalizedSpec);

            if (project is null)
            {
                return(NotFound($"No project template for spec: {normalizedSpec}"));
            }

            var archiveBytes = archiver.ToBytes(project.FileEntries);

            return(File(
                       archiveBytes,
                       $"application/{normalizedSpec.Packaging}",
                       $"{normalizedSpec.Name}{archiver.GetFileExtension()}"));
        }