Наша сборка Qt VS Tools
giy
2022-09-02 ca47896204482bf4a6979e3838bf7f09f61cebeb
Tests/BigSolution/generator/Program.cs
@@ -38,51 +38,27 @@
{
    internal class Program
    {
        static void Main(string[] args)
        static void GenerateProject(
            StringBuilder genSolutionProjectRef,
            StringBuilder genSolutionProjectConfigs,
            string pathToTemplateDir,
            string pathToGeneratedDir,
            int projectCount,
            string projectGuid,
            string projectName,
            string projectRef,
            IEnumerable<string> projectConfigsList)
        {
            var projectCount = args.Length > 0 ? Convert.ToInt32(args[0]) : 400;
            var pathToTemplateDir = Path.GetFullPath(@"..\..\..\template");
            var pathToGeneratedDir = Path.GetFullPath(@"..\..\..\generated");
            var templateFiles = Directory.GetFiles(
                pathToTemplateDir, "*", SearchOption.AllDirectories);
            var solutionFilePath = templateFiles
                .Where(x => Path.GetExtension(x) == ".sln")
                .First();
            var solutionName = Path.GetFileName(solutionFilePath);
            var solutionText = File.ReadAllText(solutionFilePath);
            var projectFilePath = templateFiles
                .Where(x => Path.GetExtension(x) == ".vcxproj")
                .First();
            var projectText = File.ReadAllText(projectFilePath);
            var projectName = Path.GetFileNameWithoutExtension(projectFilePath);
            var projectGuidMatch = Regex.Match(projectText, @"<ProjectGuid>({[^}]+})<");
            var projectGuid = projectGuidMatch.Groups[1].Value;
            var projectRef = Regex
                .Match(solutionText,
                    @"^Project.*" + projectGuid + @"""\r\nEndProject\r\n", RegexOptions.Multiline)
                .Value;
            var projectConfigsList = Regex
                .Matches(solutionText,
                    @"^\s+" + projectGuid + @".*\r\n", RegexOptions.Multiline)
                .Cast<Match>()
                .Select(x => x.Value);
            var projectConfigs = string.Join("", projectConfigsList);
            var projectFiles = Directory.GetFiles(
                Path.Combine(pathToTemplateDir, projectName),
                "*", SearchOption.TopDirectoryOnly);
            if (Directory.Exists(pathToGeneratedDir))
                Directory.Delete(pathToGeneratedDir, true);
            var genSolutionProjectRef = new StringBuilder();
            var genSolutionProjectConfigs = new StringBuilder();
            for (int i = 1; i <= projectCount; i++) {
            bool singleProject = false;
            for (int i = 1; !singleProject && i <= projectCount; i++) {
                var idxStr = string.Format("{0:D3}", i);
                var genProjectName = projectName.Replace("NNN", idxStr);
                if (genProjectName == projectName)
                    singleProject = true;
                var genProjectDirPath = Path.Combine(pathToGeneratedDir, genProjectName);
                var genProjectGuid = projectGuid.Replace("000", idxStr);
@@ -110,9 +86,66 @@
                    genSolutionProjectConfigs.Append(genProjectConfig);
                }
            }
            var genSolutionText = solutionText
                .Replace(projectRef, genSolutionProjectRef.ToString())
                .Replace(projectConfigs, genSolutionProjectConfigs.ToString());
        }
        static void Main(string[] args)
        {
            int projectCount;
            if (args.Length == 0 || !int.TryParse(args[0], out projectCount)) {
                string userProjectCount;
                do {
                    Console.Write("Project count: ");
                    userProjectCount = Console.ReadLine();
                } while (!int.TryParse(userProjectCount, out projectCount));
            }
            var pathToTemplateDir = Path.GetFullPath(@"..\..\..\template");
            var pathToGeneratedDir = Path.GetFullPath(
                $@"..\..\..\generated_{DateTime.Now.ToString("yyyyMMddhhmmssfff")}");
            var templateFiles = Directory.GetFiles(
                pathToTemplateDir, "*", SearchOption.AllDirectories);
            var solutionFilePath = templateFiles
                .Where(x => Path.GetExtension(x) == ".sln")
                .First();
            var solutionName = Path.GetFileName(solutionFilePath);
            var solutionText = File.ReadAllText(solutionFilePath);
            var projectFilePaths = templateFiles
                .Where(x => Path.GetExtension(x) == ".vcxproj");
            var genSolutionText = solutionText;
            if (Directory.Exists(pathToGeneratedDir))
                Directory.Delete(pathToGeneratedDir, true);
            foreach (var projectFilePath in projectFilePaths) {
                var genSolutionProjectRef = new StringBuilder();
                var genSolutionProjectConfigs = new StringBuilder();
                var projectText = File.ReadAllText(projectFilePath);
                var projectName = Path.GetFileNameWithoutExtension(projectFilePath);
                var projectGuidMatch = Regex.Match(projectText, @"<ProjectGuid>({[^}]+})<");
                var projectGuid = projectGuidMatch.Groups[1].Value;
                var projectRef = Regex
                    .Match(solutionText,
                        @"^Project.*" + projectGuid + @"""\r\nEndProject\r\n",
                        RegexOptions.Multiline | RegexOptions.IgnoreCase)
                    .Value;
                var projectConfigsList = Regex
                    .Matches(solutionText,
                        @"^\s+" + projectGuid + @".*\r\n",
                        RegexOptions.Multiline | RegexOptions.IgnoreCase)
                    .Cast<Match>()
                    .Select(x => x.Value);
                var projectConfigs = string.Join("", projectConfigsList);
                GenerateProject(
                    genSolutionProjectRef,
                    genSolutionProjectConfigs,
                    pathToTemplateDir,
                    pathToGeneratedDir,
                    projectCount,
                    projectGuid,
                    projectName,
                    projectRef,
                    projectConfigsList);
                genSolutionText = genSolutionText
                    .Replace(projectRef, genSolutionProjectRef.ToString())
                    .Replace(projectConfigs, genSolutionProjectConfigs.ToString());
            }
            var genSolutionFilePath = Path.Combine(pathToGeneratedDir, solutionName);
            File.WriteAllText(genSolutionFilePath, genSolutionText);
        }